交叉验证

学习预测函数的参数并在相同的数据上进行测试是一个方法上的错误:一个只重复它刚刚看到的样本标签的模型会得到一个完美的分数但却无法预测任何有用的东西 - 看不见的数据。这种情况称为过度拟合。为了避免这种情况,通常的做法是执行(监督的)机器学习实验以将部分可用数据作为测试集 X_test, y_test。请注意,实验一词并不仅仅用于表示学术用途,因为即使在商业环境中,机器学习通常也是从实验开始的。

scikit-learn 中 ,可以使用 train_test_split辅助函数快速计算随机拆分为训练和测试集。让我们加载虹膜数据集以适应线性支持向量机:

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

我们现在可以快速采样训练集,同时保留 40%的数据用于测试(评估)我们的分类器:

>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

现在,在我们有训练和测试集之后,让我们使用它:

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)