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



我正在研究一个最近的邻居问题集。我不明白为什么他们在测试集上表现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 个数据子集。如果编号的点是您已经满意的内容,则可以跳到最后一段。

  1. 训练您的估算器将适合一些您永远不需要直接看到的内部参数。您可以通过在训练集上进行训练来优化这些内容。
  2. 大多数估计器也有超参数(邻居的数量,Ridge的alpha,...)。超参数也需要优化。您需要将它们适合数据的不同子集;将其称为验证集。
  3. 最后,当您对估计器
  4. 的内部参数和超参数表的拟合感到满意时,您希望查看拟合估计器对新数据的预测效果。您需要数据的最终子集(测试集)来确定训练和超参数优化的效果。

在许多情况下,将数据分区为 3 意味着每个子集中没有足够的样本。解决此问题的一种方法是多次随机拆分训练集,拟合超参数并聚合结果。这也有助于防止超参数过度拟合到特定的验证集。K-fold交叉验证是一种策略。

随机拆分数据集的另一个用途是获取最终估算器如何完成的一系列结果。通过拆分测试集并计算分数,您可以获得一系列"我们如何在新数据上做什么"的答案。希望这更能代表您可能看到的真实世界的新数据性能。您还可以获得最终分数的标准偏差。这似乎是哈佛cs109要点正在做的事情。

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

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

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

相关内容

  • 没有找到相关文章