分割数据集的合适策略是什么?
我要求反馈对以下方法(不是像个别参数test_size
或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
)。训练得分曲线上的每个点都是10个分数的平均值,在第一个i训练示例中对模型进行了训练和评估。交叉验证得分曲线上的每个点是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()
在scikit-learn的当前开发版本(0.15-git)中可以找到plot_learning_curve()。
7.对测试集的最终评估
classifier.score(X_test, y_test)
7a。使用嵌套交叉验证(使用整个数据集)测试模型选择中的过拟合
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
附加问题: 用嵌套交叉验证替换步骤7是否有意义?还是应该将嵌套的简历视为对步骤7的补充
(该代码似乎可以在scikit-learn中进行k倍交叉验证,但不能与shuffle和split一起使用。因此cv
需要在上面进行更改以使代码起作用)
8.在整个数据集上训练最终模型
classifier.fit(X, y)
编辑:我现在同意cbeleites,步骤7a在此序列中没有多大意义。所以我不会采纳。