为什么要对测试集执行Kfold交叉验证??

2024-06-10 09:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个克内雷斯特邻居问题集。我不明白他们为什么在测试集上执行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)

Tags: testirisdataindexneighborstrainsklearncv
2条回答

TL;DR

你有没有科学老师说过,“任何没有误差界限的测量都是毫无意义的?”在

您可能会担心,在测试集中使用拟合的、超参数优化的估计器的分数只是侥幸。通过对测试集随机选择的子样本进行多次测试,你可以得到一系列的分数;你可以报告它们的平均值和标准差等。希望这是一个更好的代表,来说明估计器将如何处理来自野外的新数据。在


下面的概念模型可能不适用于所有的估计器,但记住它是有用的。最终需要3个子集的数据。如果编号点是您已经满意的内容,您可以跳到最后一段。在

  1. 训练你的估计器将拟合一些你不需要直接看到的内部参数。您可以通过在训练集中进行训练来优化这些功能。在
  2. 大多数估计器也有超参数(邻域数,岭的α,…)。超参数也需要优化。您需要将它们与数据的不同子集相匹配;称之为验证集。在
  3. 最后,当您对估计器的内部参数和超参数的拟合感到满意时,您想看看拟合的估计器对新数据的预测效果。您需要数据的最后一个子集(测试集)来计算训练和超参数优化的效果如何。在

的情况下,将数据分成3个表示每个子集中没有足够的样本。解决这一问题的一种方法是将训练集随机分割若干次,拟合超参数并聚合结果。这也有助于防止超参数过度适应特定的验证集。K-fold交叉验证是一种策略。在

随机拆分数据集的另一个用途是获得最终估计器的结果范围。通过分割测试集并计算分数,您可以得到一系列关于“我们如何处理新数据”的答案。希望这更能代表现实世界中新奇的数据性能。你也可以得到你的最终分数的标准差。这似乎就是哈佛cs109主旨所做的。在

如果你做了一个能适应输入的程序,那么它将是你所适应的输入的最佳选择。在

这会导致一个被称为过拟合的问题。在

为了查看您是否建立了一个好的或坏的模型,您需要在一些其他数据上进行测试,这些数据不是您用来创建模型的。这就是为什么要将数据分为两部分。在

相关问题 更多 >