【问题标题】:nested cross-validation with custom folding带有自定义折叠的嵌套交叉验证
【发布时间】:2016-08-17 23:19:48
【问题描述】:

我的数据有一个名为pid 的列,具有相同pid 的记录不应在训练测试拆分之间泄露。我有一个 2 层堆叠模型 -

  • 内部层通过对训练数据进行交叉验证预测来构建内部预测向量
  • 然后我在原始训练数据 + 内部预测向量上构建一个外部模型
  • 然后我根据测试数据评估性能

这个过程应该重复X5。

我能想到的最好的方法是在外层用pid % 25 和在内层用pid % 5 分开。

代码出来很麻烦,而且不是很pythonic。有没有更好的方法来做到这一点?我是否遗漏了一些整洁干净的 sklearn/python 用法,还是我的设计存在一些根本缺陷?

N = 5

for external_fold in range(N):

    ex_test = [x for x in range(N**2) if external_fold*N <= x % (N**2) < (external_fold+1)*N]
    ex_train = [x for x in range(N**2) if x not in ex_test]
    ex_train_index = X[(X.pid % N**2).isin(ex_train)].index
    ex_test_index = X[(X.pid % N**2).isin(ex_test)].index
    ...
    for internal_fold in range(N):
        in_train_index = X[(X.pid % N)!=internal_fold].index
        in_test_index = X[(X.pid % N)==internal_fold].index
        # build a vector of internal model predictions

    # build external model and assess performance

【问题讨论】:

标签: python machine-learning scikit-learn cross-validation


【解决方案1】:

您有两个需求最近才在 Scikit-Learn 中得到解决,应该包含在下一个发布版本中:

将相关样本放在一起的交叉验证策略

新的CV splitter classes 现在包括LabelKFoldLabelShuffleSplit,两者都旨在处理您认为具有相同pid 的元素应位于同一测试部分的情况。

嵌套交叉验证

重新设计了交叉验证迭代器 API,以更好地支持嵌套交叉验证。您不再需要将数据相关参数传递给交叉验证策略构造函数。因此,将GridSearchCV 嵌套在GridSearchCV 中,每个都有自己的cv 参数,应该可以满足您的需求。

请注意,此 API 仍然非常新鲜,可以更改。

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2015-11-11
    相关资源
    最近更新 更多