==============
本文使用的数据集格式请参考:使用Python预处理机器学习需要的手写体数字图像文件数据集
==============
在使用机器学习算法时往往会使用sklearn.model_selection模块中的函数train_test_split()把拿到的数据集划分为训练集和测试集,使用模型的fit()方法在训练集上进行训练,然后再使用模型的score()方法在测试集上进行评分。
使用上述方法对模型进行评估,容易因为数据集划分不合理而影响评分结果,从而导致单次评分结果可信度不高。这时可以使用不同的划分多评估几次,然后计算所有评分的平均值。
交叉验证(Cross Validation)正是用来完成这个任务的技术,该技术会反复对数据集进行划分,并使用不同的划分对模型进行评分,可以更好地评估模型的泛化质量。
扩展库sklearn在model_selection模块中提供了用来实现交叉验证的函数cross_val_score(),其语法为:
cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
其中,1)参数estimator用来指定要评估的模型;2)参数X和y分别用来指定数据集及其对应的标签;3)参数cv用来指定划分策略,常设置为整数表示把数据集拆分成几个部分对模型进行训练和评分。该函数返回实数数组,数组中每个实数分别表示每次评分的结果,在实际使用时往往使用这些得分的平均值作为最终结果。
函数cross_val_score()使用k折叠交叉验证,把数据集拆分为k个部分,然后使用k个数据集对模型进行训练和评分。另外,sklearn.model_selection模块中还提供了随机拆分交叉验证ShuffleSplit和逐个测试交叉验证LeaveOneOut,可以查阅官方文档或者导入对象之后使用内置函数help()查看详细的用法。
下面的代码使用三种交叉验证分别对手写数字识别的支持向量机算法进行了评估。
运行结果: