Scikitlearn - 交叉验证后的得分数据集

时间:2017-02-06 19:43:55

标签: python machine-learning scikit-learn

我使用scikit-learn(http://scikit-learn.org/stable/modules/cross_validation.html)了解交叉验证

我的代码:

from sklearn.cross_validation import train_test_split
from sklearn.cross_validation import cross_val_score
from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()

# prepare sets
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)

# create model
clf1 = svm.SVC(kernel='linear', C=1)

# train model
scores = cross_val_score(clf1, x_train, y_train, cv=5)

# accuracy on train data
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

# accuracy on yet-unseen data
print clf1.score(x_test, y_test)

据我所知,通过交叉验证,我们可以使用整个数据集来训练和验证,例如scikit doc中的示例。如果我想在交叉验证后对数据进行评分怎么办?我假设我的模型经过交叉验证学习后经过培训。在使用score()时我得到了

raise NotFittedError(msg % {'name': type(estimator).__name__})
sklearn.utils.validation.NotFittedError: This SVC instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

在doc中有方法段落3.1.1.1,其中提到cross_val_predict我可以使用它,但为什么我需要cv参数(这是折叠号)而我只是想检查训练模型的准确性?

我会感激任何提示。

1 个答案:

答案 0 :(得分:1)

这是一个完成工作的代码,逐步解释它是如何工作的。

首先,让我们导入必要的模块:

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而不是sklearn.cross_validation,因为后者在版本0.18中已弃用。

然后我们加载虹膜数据集并分别使用功能和标签创建数组Xy

In [207]: iris = datasets.load_iris()

In [208]: X, y = iris.data, iris.target

在下一步中,我们将创建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.

从上表中可以清楚地看出,每个样本都使用了四次进行培训,并且只进行了一次测试。

回复您的其他评论:

  1. 交叉验证的主要优点是所有样本都用于培训和测试,即交叉验证为您提供最大的建模和测试能力,这在数据集较小时尤为重要。
  2. 避免过度拟合的一种方法是使用不同的样本进行训练和测试。
  3. 选择模型参数的常用方法包括验证不同参数集的模型,并选择最大化分类精度的值。