我正在做一个克内雷斯特邻居问题集。我不明白他们为什么在测试集上执行K fold cross validation
??我们不能直接测试我们的最佳参数K在整个测试数据上的表现如何?而不是做交叉验证?在
iris = sklearn.datasets.load_iris()
X = iris.data
Y = iris.target
X_train, X_test, Y_train, Y_test = sklearn.cross_validation.train_test_split(
X, Y, test_size=0.33, random_state=42)
k = np.arange(20)+1
parameters = {'n_neighbors': k}
knn = sklearn.neighbors.KNeighborsClassifier()
clf = sklearn.grid_search.GridSearchCV(knn, parameters, cv=10)
clf.fit(X_train, Y_train)
def computeTestScores(test_x, test_y, clf, cv):
kFolds = sklearn.cross_validation.KFold(test_x.shape[0], n_folds=cv)
scores = []
for _, test_index in kFolds:
test_data = test_x[test_index]
test_labels = test_y[test_index]
scores.append(sklearn.metrics.accuracy_score(test_labels, clf.predict(test_data)))
return scores
scores = computeTestScores(test_x = X_test, test_y = Y_test, clf=clf, cv=5)
TL;DR
你有没有科学老师说过,“任何没有误差界限的测量都是毫无意义的?”在
您可能会担心,在测试集中使用拟合的、超参数优化的估计器的分数只是侥幸。通过对测试集随机选择的子样本进行多次测试,你可以得到一系列的分数;你可以报告它们的平均值和标准差等。希望这是一个更好的代表,来说明估计器将如何处理来自野外的新数据。在
下面的概念模型可能不适用于所有的估计器,但记住它是有用的。最终需要3个子集的数据。如果编号点是您已经满意的内容,您可以跳到最后一段。在
在批的情况下,将数据分成3个表示每个子集中没有足够的样本。解决这一问题的一种方法是将训练集随机分割若干次,拟合超参数并聚合结果。这也有助于防止超参数过度适应特定的验证集。K-fold交叉验证是一种策略。在
随机拆分数据集的另一个用途是获得最终估计器的结果范围。通过分割测试集并计算分数,您可以得到一系列关于“我们如何处理新数据”的答案。希望这更能代表现实世界中新奇的数据性能。你也可以得到你的最终分数的标准差。这似乎就是哈佛cs109主旨所做的。在
如果你做了一个能适应输入的程序,那么它将是你所适应的输入的最佳选择。在
这会导致一个被称为过拟合的问题。在
为了查看您是否建立了一个好的或坏的模型,您需要在一些其他数据上进行测试,这些数据不是您用来创建模型的。这就是为什么要将数据分为两部分。在
相关问题 更多 >
编程相关推荐