【问题标题】:How do I know that RepeatedStratifiedKFold is actually working as it should?我怎么知道 RepeatedStratifiedKFold 确实在正常工作?
【发布时间】:2020-06-25 23:09:54
【问题描述】:

我正在尝试选择一种方法将我的数据拆分为训练集和测试集。我目前正在使用 Scikit 的 RepeatedStratifiedKFold。根据documentationRepeatedStratifiedKFold 是:

重复分层 K 折交叉验证器。

重复分层 K 折叠 n 次,每次都有不同的随机化 重复。

我使用RepeatedStratifiedKFold 在包含 1000 个观察值的数据集上使用 5 次折叠和 100 次重复,如下所示:

rskf = RepeatedStratifiedKFold(n_splits=5, n_repeats=100, random_state=None)

for train_index, test_index in rskf.split(X, y):

   X_train, _X_test = X[train_index], X[test_index]

   y_train, y_test = y[train_index], y[test_index]

但是,当我查看 X_train 集时,我只看到 800 个观察值(4 个火车折叠)。不应该按照重复次数包含所有100个训练集吗?

我的第二个问题:在使用RepeatedStratifiedKFold 方法拆分数据后,当您在X_trainy_train 数据集上拟合分类模型时会发生什么?模型是否训练了所有 100 次重复?

假设我只是想在测试后得到模型的 F1 分数。它会给我所有 100 次重复的平均分数吗?

谢谢!

【问题讨论】:

    标签: python scikit-learn cross-validation


    【解决方案1】:

    但是,当我查看 X_train 集时,我只看到 800 个观察值(4 个火车折叠)。不应该按照重复次数包含所有100个训练集吗?

    不是真的。实际上,当您遍历rksf.split(X, y) 时,您正在遍历迭代次数(由n_splits * n_repeats 给出)。在这种情况下,您将循环 5 * 100 = 500 次迭代 - 每个迭代都有不同的分区。您可以通过在循环中添加一个计数器并打印它来非常轻松地检查这一点:

    ii = 1
    for train_index, test_index in rskf.split(X, y):
       print(f"Iteration {ii}")
    
       X_train, _X_test = X[train_index], X[test_index]
       y_train, y_test = y[train_index], y[test_index]
    
       ii += 1
    

    这会导致

    Iteration 1
    Iteration 2
    ...
    Iteration 499
    Iteration 500
    

    因此,当您运行代码时,您会看到X_train 有 800 个观察值是有道理的。这对应于您的迭代的 一个 的分区。如果这还不清楚,我建议你看看另一个SO answer


    我的第二个问题:使用RepeatedStratifiedKFold 方法拆分数据后,当您将分类模型拟合到X_trainy_train 数据集时会发生什么?模型是否训练了所有 100 次重复?

    不,按照您当前定义的方式,模型将使用 单次 迭代的 X_trainy_train 进行拟合。


    假设我只是想在测试后得到模型的 F1 分数。它会给我所有 100 次重复的平均分数吗?

    不,与您之前的问题相关,您将获得单次迭代的 F1 分数。您可以将每次迭代的 F1 分数保存在列表中,然后计算平均值(也可能是 SD)。你也可以考虑使用 Scikit 的cross_val_score

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2013-05-13
      相关资源
      最近更新 更多