首页 > sklearn 阅读数:2

交叉验证法:K折交叉验证解决过拟合

交叉验证(Cross-validation)多次选择测试集做评估,有效避免了随机性带来的误差。而且交叉验证不需要选择验证集,这样就避免了数据的浪费,使训练集中有足够的样本数量。

交叉验证最基本的方法是 K折交叉验证(K-fold Cross Validation),原理如图 1 所示。

交叉验证法解决过拟合问题
图1:交叉验证,白色是训练集,黑色是测试集

1. K折交叉验证法过程

K 折交验证去具体过程如下所示:
  • 第1步,将原始数据随机分为k份。
  • 第2步,每次挑选其中k-1份作为训练集,剩余的1份作为测试集进行训练。
  • 第3步,循环第 2 步 k 次,这样每一份都会被作为测试集。
  • 第4步,计算 k 组测试集评估结果的平均值作为模型的最终得分。

交叉验证唯一的缺点就是计算代价相对较高。实现交叉验证可以调用 Scikit 中提供的 cross_val_score 辅助函数,实例如下。
#导入相关模块
In [1]: from sklearn import datasets
   ...: from sklearn import neighbors
   ...: from sklearn.model_selection import cross_val_score
#导入相关数据集
In [2]: iris = datasets.load_iris()
#创建knn分类器对象
In [3]: knn = neighbors.KNeighborsClassifier(3)
#对分类器进行交叉验证
In [4]: scores = cross_val_score(knn, iris['data'], iris['target'], cv=10)
#查看验证结果
In [5]: scores
Out[5]: 
array([1.        , 0.93333333, 1.        , 0.93333333, 0.86666667,
       1.        , 0.93333333, 1.        , 1.        , 1.        ])
#查看均值
In [6]: scores.mean()
Out[6]: 0.9666666666666666
#查看标准差
In [7]: scores.std()
Out[7]: 0.04472135954999579 

从验证结果可以得出每次迭代的分数,可以看到最低得分只有 0.86,而最高的分数是 1。