什么是拆分数据集的合适策略?
我要求对以下方法提供反馈(不是关于test_size
or之类的单个参数n_iter
,而是如果我使用了X
, y
, X_train
, y_train
,X_test
和y_test
适当的以及顺序是否有意义):
(从 scikit-learn 文档扩展这个例子)
1.加载数据集
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. 分成训练集和测试集(例如,80/20)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3. 选择估算器
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4.选择交叉验证迭代器
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. 调整超参数
在训练集上应用交叉验证迭代器
from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)
6. 使用学习曲线调试算法
X_train
被随机分为训练集和测试集 10 次 ( n_iter=10
)。训练分数曲线上的每个点是模型在前i个训练示例上训练和评估的 10 个分数的平均值。交叉验证分数曲线上的每个点都是 10 个分数的平均值,其中模型在前i个训练示例上训练并在测试集的所有示例上进行评估。
from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()
plot_learning_curve()可以在 scikit-learn (0.15-git) 的当前开发版本中找到。
7. 对测试集的最终评估
classifier.score(X_test, y_test)
7a。使用嵌套交叉验证测试模型选择中的过度拟合(使用整个数据集)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
附加问题: 用嵌套交叉验证替换第 7 步是否有意义?还是应该将嵌套 cv 视为对第 7 步的补充
(代码似乎与 scikit-learn 中的 k-fold 交叉验证一起使用,但不适用于 shuffle & split。因此cv
需要在上面进行更改以使代码正常工作)
8. 在整个数据集上训练最终模型
classifier.fit(X, y)
编辑:我现在同意 cbeleites 的观点,即步骤 7a 在这个序列中没有多大意义。所以我不会采用那个。