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

Python Scikitlearn-交叉验证后的分数数据集,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我正在学习使用scikit learn()进行交叉验证 我的代码: 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_

我正在学习使用scikit learn()进行交叉验证

我的代码:

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文档中的示例所示。如果我想在交叉验证后对数据进行评分,该怎么办?我假设我的模型是经过交叉验证学习后训练出来的。使用
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,其中提到了
交叉值预测
,我可以使用它,但为什么我需要cv参数(即折叠数),而我只想检查训练模型的准确性


如果有任何提示,我将不胜感激。

下面是一段代码,它通过一步一步地解释如何工作来完成这项工作

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

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版中已被弃用

然后我们加载iris数据集,分别创建带有特征和标签的数组
X
y

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

In [208]: X, y = iris.data, iris.target
在下一步中,我们将创建C支持向量分类类的一个实例:

In [209]: clf = svm.SVC(kernel='linear', C=1)
现在,我们创建了一个分层的K-折叠验证器,它将数据集拆分为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.
从上表可以清楚地看出,每个样本用于训练四次,并且只测试一次

对你的补充意见的答复:

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

  • 有很多种类型的分数供你决定你想要哪一种。您可以查看sci工具包学习文档,但对于这种情况,您可以查看交叉验证指标:,希望这有帮助@PawelPawel
    cross_val_score
    不适合作为参数传递的模型对象,但会创建副本以保持每个折叠的独立性。您现在必须手动实际拟合模型。此外,在将数据传递给
    交叉验证分数
    之前,不要将数据拆分为训练集和测试集,这对您来说是可行的…您需要了解交叉验证的目的是什么-它用于获得可概括指标的估计值,也就是说,您的模型将如何在看不见的数据上执行。你不需要“用交叉验证训练模型”,但为什么你想要分数?要知道交叉验证的准确性?@juanpa.arrivillaga很好,但为什么交叉验证在小数据集的情况下如此有用?它给出了度量,还有什么?谢谢你这么详细的回答。我从关于它如何工作的评论中得到了这个想法。这是我的误解,因为我认为交叉验证实际上是一种学习方式。我现在的问题是,如何使用交叉验证?为什么它在小数据集的情况下有帮助?因为我们可以使用整个数据集进行训练?交叉验证用于为模型选择正确的参数,以避免过度拟合?读了这个例子后,我觉得是这样的:谢谢你的回答!