【问题标题】:Partition data while preserving groups with caret分区数据,同时保留带有插入符号的组
【发布时间】:2020-01-19 12:20:55
【问题描述】:

为跨栈帖子道歉,我不确定这是否更适合 stackoverflowcrossvalidated。我最初在后者上发帖,但意识到这可能是更合适的地方。

所以,我有一个包含许多个人行的数据集,每个人都有一个独特的个人ID

对于每个人,还有一列表示该人是否属于同一家庭,这是唯一的householdID

最后,每行都有一个Target 变量,我将尝试对它进行预测。当然,也有具有不同特征的列。

我的问题是——由于不同家庭的成员身份很重要——有没有办法将数据划分为训练集和测试集,其中属于同一家庭的所有人都放在一起,而不是随机分成两组? (即,任何给定的householdID 号码都不应出现在两组中)。但是,是否可以在训练集和测试集上拆分家庭并保持平衡的Target 变量?

因此,使用caret 中的createDataPartition 函数,当我设置y = Target 时,我设法在训练和测试中获得平衡的Target 值,并且我已经成功地将家庭分开当我设置y = unique(householdID) 时,通过训练和测试,但我不知道是否有办法同时获得这两个结果。

我完全没有想法,所以欢迎任何建议!

谢谢!

【问题讨论】:

  • 这称为阻塞(按familyID)。在没有人工干预的情况下,很难根据 y 进行分层拆分并被另一个变量阻塞。我建议只专注于阻塞。用不同的种子做一堆分裂,并检查每个分裂的目标。然后选择一个最平衡的。如果您需要进一步的帮助,请提供一些数据供您参考。
  • 感谢@missuse 的建议。没有看到任何其他方法,我会尝试你的建议,因为它应该是可行的。谢谢!

标签: r r-caret train-test-split


【解决方案1】:

groupKFold 是要走的路。但是,您需要拆分 data$householdID (或任何您的家庭 ID 列的名称),而不是使用 data$Target。这将确保一个组的所有成员都在同一个折叠中。

在此之后,您可以使用trainControl 中的折叠对 data$Target 进行建模。

【讨论】:

  • 嗨@phiver,感谢您的建议,但您提到该组的成员在同一个文件夹中,这是让我对groupKFold 功能感到困惑的部分——也就是说,这个功能仅用于为 CV 目的制作数据的 k 倍?就我而言,我正在尝试将数据初始拆分为训练集和测试集,其中两个集中都没有出现 householdID 值,但 Target 变量在两者之间保持平衡。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2014-07-27
  • 1970-01-01
  • 2022-08-20
相关资源
最近更新 更多