Python Scikitlearn-交叉验证后的分数数据集
我正在学习使用scikit learn()进行交叉验证 我的代码: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_
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很好,但为什么交叉验证在小数据集的情况下如此有用?它给出了度量,还有什么?谢谢你这么详细的回答。我从关于它如何工作的评论中得到了这个想法。这是我的误解,因为我认为交叉验证实际上是一种学习方式。我现在的问题是,如何使用交叉验证?为什么它在小数据集的情况下有帮助?因为我们可以使用整个数据集进行训练?交叉验证用于为模型选择正确的参数,以避免过度拟合?读了这个例子后,我觉得是这样的:谢谢你的回答!