一、交叉验证
机器学习是一个经验性的学科,我们需要用数据去检验算法的效果。而在实际应用中,我们通常无法知道真实的预测误差,所以我们需要从样本集中分离出一部分数据作为测试集,用来估计算法的预测效果。但是测试集只有一份,如果只对算法进行一次测试,评估结果可能会与真实值产生偏差。为了避免这种情况,我们可以使用交叉验证的方法,将样本集分成若干个子集,轮流使用每个子集作为测试集,其他子集作为训练集,计算多个评估结果的平均值。
二、cross_val_score函数
Scikit-learn提供了cross_val_score函数来实现交叉验证。该函数的主要参数包括估计器、特征矩阵、标签集合、分割器、评估指标等。其中分割器和评估指标可以设置多种取值,本文将详细介绍。
三、分割器参数
分割器参数是用来将样本集分成若干个子集的。Scikit-learn提供了多种分割器:
KFold(n_splits=’warn’, shuffle=False, random_state=None) StratifiedKFold(n_splits=’warn’, shuffle=False, random_state=None) GroupKFold(n_splits=’warn’) LeaveOneOut() LeavePOut(p=1) LeaveOneGroupOut() LeavePGroupsOut(n_groups=2) ShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=None) GroupShuffleSplit(n_splits=’warn’) StratifiedShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=None) PredefinedSplit(test_fold)
其中,KFold和StratifiedKFold是最常用的分割器。KFold将样本集平均分成K份,轮流使用每份数据作为测试集,其他数据作为训练集,返回K个预测分数。StratifiedKFold和KFold类似,但它会根据标签分配样本,保证每个测试集中正样本和负样本的比例相同。
四、评价指标参数
评价指标参数用来衡量估计器预测效果的标准。Scikit-learn提供了多种评价指标:
accuracy r2 neg_mean_squared_error neg_mean_absolute_error explained_variance mean_absolute_error mean_squared_error median_absolute_error
其中,accuracy是分类模型的评价指标,用于衡量正确分类的样本数占总样本数的比例;r2是回归模型的评价指标,用于衡量模型对观察数据的方差进行了多少解释;neg_mean_squared_error和neg_mean_absolute_error是回归模型的评价指标,用于衡量模型预测结果的均方误差和平均绝对误差;explained_variance是回归模型的评价指标,用于衡量模型预测结果与真实结果的方差之比;mean_absolute_error、mean_squared_error和median_absolute_error是回归模型的评价指标,用于衡量模型预测结果与真实结果的误差。
五、示例代码
下面是一个使用cross_val_score函数的示例代码:
from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeClassifier iris = load_iris() X, y = iris.data, iris.target dt = DecisionTreeClassifier() scores = cross_val_score(dt, X, y, cv=5, scoring='accuracy') print('Accuracy: %0.2f (+/- %0.2f)' % (scores.mean(), scores.std() * 2))
本示例将使用决策树分类器对鸢尾花数据集进行分类,采用5折交叉验证并使用accuracy指标评价模型。其中,cv参数为分割器参数,指定使用5折交叉验证;scoring参数为评价指标参数,指定使用accuracy指标评价预测效果。