【问题标题】:Sklearn grouped k-fold - same group in both test and trainSklearn 分组 k-fold - 测试和训练中的同一组
【发布时间】:2021-08-29 06:08:38
【问题描述】:

来自文档 (https://scikit-learn.org/stable/modules/cross_validation.html#group-k-fold):

GroupKFold 是 k-fold 的一种变体,可确保同一组不会同时出现在测试和训练集中

然后,稍微修改一下这个例子,我们有:

from sklearn.model_selection import GroupKFold

X = np.array([0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10])
y = np.array(["a", "b", "b", "b", "c", "c", "c", "d", "d", "d"])
groups = [1, 1, 1, 2, 2, 2, 3, 3, 3, 3]

gkf = GroupKFold(n_splits=3)
for train, test in gkf.split(X, y, groups=groups):
    print("%s %s" % (train, test))

哪些打印:

[0 1 2 3 4 5] [6 7 8 9]
[0 1 2 6 7 8 9] [3 4 5]
[3 4 5 6 7 8 9] [0 1 2]

在我看来,b 似乎在测试和训练集中,但我们有 -

[3 4 5 6 7 8 9] [0 1 2]

对于最后一个输出,其中测试索引为[0, 1, 2],这给了我们组a 和组b 中的两个值,这意味着在测试集中有一个来自组b 的值以及培训(其中索引3)。

大概文档/模块是正确的,我错了,但我不明白如何。

要明确 - 我希望在测试和训练中都不会看到同一组的值,并且确实存在。

【问题讨论】:

  • 重要的是groupsy 不重要。在确定拆分时,您甚至可以将y=None 传递给gkf.splitit is not used
  • 哪个变量定义了您的组?是y还是group,如果你检查对应的group,你可以看到对于每一折,train中的groups和test中的groups是不同的

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


【解决方案1】:

您将课程误认为是组。正如 cmets 已经指出的那样,它们仅由 group 参数确定,并且独立于类。

您可以按照您已经链接到的描述更好地理解该示例:

例如,如果数据是从每个主题有多个样本的不同主题中获得的,并且如果模型足够灵活,可以从高度个人化的特征中学习,它可能无法推广到新的主题

所以GroupKFold 设计的问题可能是您从不同来源(示例中的主题)获得数据并且想要控制您的模型是否已经泛化到足以执行的情况其他来源的数据很好。或者换句话说,您希望确保您的模型没有过度拟合来自特定来源或来源的数据。这就是 GroupKFold 的用途:

GroupKFold 使得检测这种过拟合情况成为可能。

因此,这些来源(或主题)由group 参数确定,并将由GroupKFold 分隔,因此相同的来源永远不会在测试和训练折叠中出现。 p>

【讨论】:

    猜你喜欢
    • 2020-09-01
    • 2021-06-28
    • 2018-08-18
    • 2019-04-11
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2023-03-12
    相关资源
    最近更新 更多