python - Scikit Learn - 交叉验证后对数据集进行评分

标签 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 文档中的示例所示。如果我想在交叉验证后对数据进行评分怎么办?我假设我的模型是在通过交叉验证学习后进行训练的。使用时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 参数(即折叠数),而我只想检查训练模型的准确性?

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

最佳答案

这是一个完成工作的代码,并逐步解释了它的工作原理。

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

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 数据集并分别使用特征和标签创建数组 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. 选择模型参数的常见方法包括验证不同参数集的模型并选择可最大限度提高分类准确度的值。

关于python - Scikit Learn - 交叉验证后对数据集进行评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42075986/

相关文章:

python - 来自 tf.nn.dynamic_rnn 的值错误 : Dimensions must be equal

machine-learning - 图像聚类的亲和性传播

machine-learning - 识别时间序列预测算法

java - deeplearning4j中datavec示例的gradle构建文件

python - 使用 Scikit-learn 确定 RF 模型中每个类的特征重要性

python : saving variables from a text file created

python - 如何 reshape 包含图像数据的数组

python - 在 SciKit-Learn 中的特征选择管道之后访问实际特征

python - 如何检查我的 MacOS 上是否已经安装了 pyodbc?

python - 如何在已经训练好的 xgboost 模型上使用 CalibrateClassifierCV?