0%

交叉验证法

交叉验证(cross-validation)是一种评估泛化性能(新数据能否正确预测)的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。如果只划分一次训练集和测试集,可能难以分类的样本都在测试集中,那么精度会低的离谱,相反,如果容易分类的样本都在测试集中,精度则会高的离谱,所以会导致模型并不能反映数据的真实情况。

k 折交叉验证

最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取5 或10。在执行5 折交叉验证时,首先将数据划分为(大致)相等的5 部分,每一部分叫作折(fold)[1]。交叉验证通常会和寻优一起,即在不同的数据划分情况下,不同的参数情况下,模型的表现如何,对参数寻优,在最优参数下,模型对整个数据(不同数据划分)的表现如何就是交叉验证也称交叉测试。

使用第1 折作为测试集、其他折(2~5)作为训练集来训练第一个模型,并算出精度。共构建五个模型,最后对精度取平均值。

1
2
3
4
5
6
7
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
iris = load_iris()
Logreg = LogisticRegression()
scores = cross_val_score(Logreg,iris.data,iris.target,cv=5) # 模型,x,y,折数; 默认给出每个模型精度,自己需平均
print("Average cross-validation score:{:.2f}".format(scores.mean()))
1
2
3
4
from sklearn.model_selection import cross_val_score
scores = cross_val_score(Logreg,iris.data,iris.target,cv=5) # 模型,x,y,折数; 默认给出每个模型精度,自己需平均
print("Average cross-validation score:{:.2f}".format(scores.mean()))

参考文章


  1. 1.安德里亚斯·穆勒, 莎拉·吉多. Python机器学习基础教程[M/OL]. 张亮, 译. 人民邮电出版社 ↩︎
+