在scikit-learn中,可以使用 train_test_split 快速地将数据集分为训练数据和测试数据。当我们评估不同的设置(超参数)时,在测试集上仍然存在着过拟合风险,因为参数要不断调整到模型最佳为止。在这个过程中,关于测试集的知识就会“泄漏”到模型中,评估指标也不再泛化。为了解决这个问题,数据集的一部分被作为“验证集”,在训练集上训练数据,然后在验证集上验证,直到模型看起来成功了,再在测试集上最终评价。
然而,把数据集分为三部分,我们用来学习模型的训练数据将减少,并且模型结果依赖划分数据集的特定随机数。
cross-validation (CV) 过程用来解决这个问题。测试数据集仍然用来做最终的评价,但是验证集不再需要。k折 CV方法,把训练数据划分为k 个小数据集,k-1 折数据用来训练,余下的数据用来评估。
k折 CV方法采用递归计算中的平均值作为模型评价,这种方法会导致较大的计算量,但是没有浪费数据。
计算CV指标
CV 最简单的方法是使用 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
每次CV迭代的得分默认使用模型的得分计算计算,也可以通过 scoring 参数修改,例如 scoring='f1_macro'。
当参数 cv 是整数时,使用 KFold 或 StratifiedKFold 策略,也可以使用其他划分策略。
cross_val_predit 对于每个输入,返回这个输入在测试集中的预测值。只有在cv策略把输入的所有元素都分配到测试集一次的情况下,才能使用。
分层数据的交叉验证(Cross-validation iterators with stratification based on class labels.)
对于不平衡分类问题,推荐使用 StratifiedKFold 和StratifiedShuffleSplit 确保在训练和测试集中保持近似的频率。
分组数据的交叉验证
GroupKFold
LeaveOneGroupOut
LeavePGroupsOut
GroupShuffleSplit
时间序列数据的交叉验证
TimeSeriesSplit
来源:http://scikit-learn.org/stable/modules/cross_validation.html