机器学习笔记之交叉验证

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_37536446/article/details/81607775

在评估算法的效果时,为什么要进行交叉验证呢,查看了官方说明文档后,对交叉验证做了如下的描述:

在了解交叉交叉验证之前,我们先了解如下知识:

过拟合:是指所建立的机器学习模型在训练样本中表现得过于优越,导致在验证数据集以及测试数据集中表现不佳。为了避免这种情况,通常的做法是执行(监督)机器学习实验时将部分可用数据作为测试集 。关于测试集和训练集的划分,sklearn模型中有如下方法:

#导入相关模块
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm

#加载数据集
iris = datasets.load_iris()
iris.data.shape, iris.target.shape
((150, 4), (150,))

现在可以快速抽样培训,同时拿出40%的测试数据(评估)我们的分类器:

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.4, random_state=0)
 
X_train.shape, y_train.shape
out:((90, 4), (90,))
X_test.shape, y_test.shape
out:((60, 4), (60,))
 
clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
clf.score(X_test, y_test)                          
out:0.96...

在SVM中,通过设置不同的参数时,即我们平时所说的调参,在测试集上仍然可能存在着过拟合的情况,因为可以通过调整不同的参数使得模型达到最优,针对这种情况,模型的泛化能力较弱。为了解决这一问题,数据集的另一部分可以被称为所谓的“验证集”:训练在训练集上进行,之后对验证集进行评估。验证所得到模型的效果。

通过将可用数据分为三组,我们大大减少了可用于学习模型的样本数,其结果可能取决于一对(训练,验证)集合的特定随机选择。解决这个问题的方法是称为 交叉验证 的过程。一个测试集虽然仍需要进行最终评估,但是在做CV时不再需要验证集。这一过程被称为k- fold CV,训练集被分为k个较小的集合(其他方法如下所述,但通常遵循相同的原则)。对于k “折叠”中的每一个,遵循以下过程:

  • 使用折叠作为训练数据训练模型;
  • 所得到的模型在数据的剩余部分被验证(即它被当做测试集来作为计算性能度量,例如精度)。

即:K折交叉验证就是把样本分为K份,其中K-1份用来做训练建立模型,留剩下的一份来验证,交叉验证重复K次,每个子样本验证一次。

然后通过k折交叉验证方法,可以得出每次计算时的平均得分。这种方法在性能上可能代价较高,但是不会浪费太多的数据(如固定任意测试集的情况),这是其主要优点,例如反向推理,其中样本数量非常小。

计算交叉验证指标

在计算交叉验证的指标时,model_selection模块中cross_val_score函数进行计算,看如下例子

from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)
scores 
Out[38]: array([ 0.96666667,  1.        ,  0.96666667,  0.96666667,  1.        ]) 

因此,评估模型得分的平均分数和95%置信区间可以通过如下方法得到:

print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)

默认情况下,每个CV迭代时计算的分数score。可以通过使用评分参数的改变而有所不同:

from sklearn import metrics
scores = cross_val_score(clf, iris.data, iris.target, cv=5, scoring='f1_macro')
scores 
Out[42]: array([ 0.96658312,  1.        ,  0.96658312,  0.96658312,  1.        ])      

从以上的描述中,我们可以得出交叉验证的思想:

其是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。

因此可以得出交叉验证的目的:得到稳定可靠的模型。

猜你喜欢

转载自blog.csdn.net/weixin_37536446/article/details/81607775