【问题标题】:Exclude certain indices from a KFold split in Python SKlearn从 Python SKlearn 中的 KFold 拆分中排除某些索引
【发布时间】:2016-10-20 12:57:24
【问题描述】:

我使用SKlearn KFold如下:

        kf = KFold(10000, n_folds=5, shuffle=True, random_state=88)

但是,我想(仅)从训练折叠中排除某些索引。如何做到这一点?谢谢。

我想知道这是否可以通过使用 sklearn.cross_validation.PredefinedSplit 来实现?


更新:KFold 实例将与 XGBoost 一起用于 xgb.cv 的 folds 参数。 Python API here 声明折叠应该是“一个 KFold 或 StratifiedKFold 实例”。

但是,我将尝试像上面那样生成 KFold,迭代训练折叠索引,修改它们,然后像​​这样手动定义 custom_cv:

custom_cv = zip(train_indices, test_indices)

【问题讨论】:

  • “将它们返回给 KFold 对象”是什么意思?你想完成什么?
  • KFold 将提供给 xgb.cv 的 XGBoost。在将 KFold 实例传递给 xgb 之前,我需要从训练折叠中删除某些索引。
  • 我仍然不确定您所说的“将它们返回到 KFold 对象”是什么意思。
  • 使用 KFold,我将训练数据拆分为训练数据和有效数据。我将把 KFold 实例传递给 XGBoost,它会在交叉验证期间使用它。但是,在我这样做之前,我只想从训练数据中排除一些特定的索引(不是有效数据)。另一种方法是使用 fpreproc,但它涉及修改 DMatrix 对象。希望澄清。如果有更好的方法可以从 KFold 拆分中排除某些指数,请告诉我。我将修改问题以澄清。
  • 我对 XGBoost 不熟悉,但是如果您执行 kf_list = list(kf) 之类的操作,它将返回一个元组列表,该列表将以与 KFold 对象相同的方式进行迭代,您可以删除从列表中的元组中获取您想要的索引。

标签: python scikit-learn cross-validation


【解决方案1】:

如果您想从训练集中删除索引,但如果它们在测试集中就可以了,那么这种方法将起作用:

kf_list = list(kf)

这将返回一个可以以与 KFold 实例相同的方式迭代的元组列表。然后,您可以简单地修改您认为合适的索引,并且您的 KFold 实例将保持不变。您可以将 KFold 对象视为整数数组,表示索引,以及让您动态生成折叠的方法。

这是迭代器协议实现方式的主要部分的源代码,非常简单:

https://github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/cross_validation.py#L254

def _iter_test_indices(self):
    n = self.n
    n_folds = self.n_folds
    fold_sizes = (n // n_folds) * np.ones(n_folds, dtype=np.int)
    fold_sizes[:n % n_folds] += 1
    current = 0
    for fold_size in fold_sizes:
        start, stop = current, current + fold_size
        yield self.idxs[start:stop]
        current = stop

【讨论】:

  • 修改 kf_list 是否也会修改 KFold 实例?如果 list() 只是创建一个副本,而 KFold 实例保持不变,则更改不会传递给 xgb。谢谢。
  • 不,它没有。但你为什么要问?
  • 正如我所说,我会将 KFold 实例传递给 XGBoost。然后这些折叠将用于交叉验证。如果 KFold 实例保持不变,则无济于事。我需要从交叉验证中排除特定索引。
  • 啊哈。对不起,现在我明白了。那么,它必须是 KFold 的一个实例吗?
  • @AshkanKazemi 在我的辩护中,如果您在编辑之前查看原始问题,那并不清楚。如果你真的需要通过传递一个 KFold 实例来做到这一点,你可以使用一些包装对象,或者不太健壮,继承和覆盖这些用于实现迭代器的非公共方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2021-12-17
  • 2021-11-17
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2020-01-04
相关资源
最近更新 更多