下面是一个代码,它通过逐步解释它的工作原理来完成任务。在
首先,让我们导入必要的模块:In [204]: from sklearn.model_selection import cross_val_score, StratifiedKFold
In [205]: from sklearn import datasets
In [206]: from sklearn import svm
您应该确保已经安装了scikit learn 0.18,否则以下代码可能无法工作。请注意,我使用的是sklearn.model_selection,而不是{},因为后者在0.18版本中已被弃用。在
然后我们加载iris数据集,并分别使用特征和标签创建数组X和{}
^{2}$
在下一步中,我们将创建一个C-Support Vector Classification类的实例:In [209]: clf = svm.SVC(kernel='linear', C=1)
现在我们创建了一个分层的K-Folds验证器,它将数据集分成5个不相交的子集,即a、B、C、D和E。这五个折叠是分层的,这意味着a、B、C、D和E中每个类的样本比例与整个数据集中相同。在In [210]: skf = StratifiedKFold(n_splits=5, random_state=0)
最后,我们通过5次分类试验来估计泛化精度:In [211]: scores = cross_val_score(clf, X, y, cv=skf)
In [212]: scores
Out[212]: array([ 0.9667, 1. , 0.9667, 0.9667, 1. ])
In [213]: scores.mean()
Out[213]: 0.98000000000000009
5倍交叉验证总结如下:Classification No. Training Samples Test Samples Accuracy
1 A + B + C + D E 0.9667
2 A + B + C + E D 1.
3 A + B + D + E C 0.9667
4 A + C + D + E B 0.9667
5 B + C + D + E A 1.
从上表中可以清楚地看出,每个样本用于培训四次,并且只测试一次。在
对您的其他评论的答复:交叉验证的主要优点是所有样本都用于培训和测试,即交叉验证为您提供了最大的建模和测试能力,这在数据集很小时尤为重要。在
避免过度拟合的一种方法是使用不同的样本进行训练和测试。在
选择模型参数的一种常见方法是针对不同的参数集验证模型,并选择使分类精度最大化的值。在