为什么我们要在测试集上执行K折叠交叉验证?

时间:2015-01-22 06:21:25

标签: python machine-learning scikit-learn

我正在研究一个最近邻问题集。我无法理解为什么他们在测试集上执行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)

2 个答案:

答案 0 :(得分:3)

TL; DR

你有没有一位科学老师说过,任何没有错误界限的测量都没有意义?'

您可能会担心在测试集上使用拟合的超参数优化估算器得分是一个侥幸。通过对随机选择的测试集子样本进行多项测试,您可以获得一系列分数;您可以报告它们的均值和标准偏差等。希望这可以更好地代表估算器对野外新数据的执行情况。


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

  1. 训练您的估算器将适合您不需要直接看到的一些内部参数。您可以通过培训集培训来优化这些。
  2. 大多数估算器也有超参数(邻居的数量,Ridge的alpha,......)。超参数也需要进行优化。您需要将它们适合您的数据的不同子集;称之为验证集。
  3. 最后,当您对估算器的内部参数和超高压计的拟合感到满意时,您希望了解拟合估算器对新数据的预测程度。您需要数据的最终子集(测试集)来确定培训和超参数优化的进展情况。
  4. lot 案例中,将数据划分为3表示您在每个子集中没有足够的样本。解决此问题的一种方法是随机分割训练集多次,拟合超参数并聚合结果。这也有助于阻止超参数过度适应特定的验证集。 K折交叉验证是一种策略。

    随意拆分数据集的另一个用途是获得最终估算器如何做的一系列结果。通过拆分测试集并计算得分,您可以获得一系列答案,以便我们如何处理新数据'。希望这更能代表您所看到的真实世界的新颖数据表现。您还可以获得最终得分的标准差。这似乎是哈佛cs109的要点。

答案 1 :(得分:0)

如果你制作了一个适合输入的程序,那么它将是你适应它的输入的最佳选择。

这会导致称为过度拟合的问题。

为了查看您是否制作了好的或坏的模型,您需要在其他一些不是您用来制作模型的数据上进行测试。这就是您将数据分成两部分的原因。