【发布时间】:2017-06-23 21:05:36
【问题描述】:
我正在学习使用 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.
在文档中有方法第 3.1.1.1 段,其中提到了cross_val_predict,我可以使用它,但为什么我需要 cv 参数(即折叠数)而我只想检查训练模型的准确性?
如有任何提示,我将不胜感激。
【问题讨论】:
-
有多种类型的分数供您决定您想要哪一种。您可以查看 sci kit 学习文档但是对于这种情况您可以查看交叉验证指标:scikit-learn.org/stable/modules/cross_validation.html,希望这会有所帮助!@PawelPawel
-
cross_val_score不适合作为参数传递的模型对象,但会创建副本以保持每个折叠独立。您现在必须手动实际拟合模型。此外,在将数据传递给cross_val_score之前,不要将数据拆分为训练集和测试集,这对你来说是... -
您需要了解交叉验证的目的是什么——它是为了获得一个通用指标的估计,也就是说,您的模型将如何处理看不见的数据。您不会“使用交叉验证训练模型”,
-
但是你为什么想要一个分数?想知道交叉验证的准确性?
-
@juanpa.arrivillaga 好点,但为什么交叉验证在小数据集的情况下如此有用?它提供了指标,还有什么?
标签: python machine-learning scikit-learn