协变量偏移校正:R 中的标准实现?

机器算法验证 r
2022-03-28 11:33:35

我有一个我正在处理的数据集,它在训练集和测试集之间有一些协变量变化。我正在尝试使用训练集建立一个预测模型来预测结果。到目前为止,我最好的模型是随机森林。

如何处理训练集与测试集中的偏移分布?我遇到了我自己能够实现的两种可能的解决方案:

  1. 删除移位的变量。这是次优的,但有助于防止我的模型过度拟合训练集。
  2. 使用逻辑回归来预测给定的观察值是否来自测试集(在平衡类之后),预测训练集的“测试集概率”,然后使用抽样概率对训练集进行自举抽样。然后在新的训练集上拟合最终模型。

1 和 2 都很容易实现,但没有一个让我满意,因为 #1 省略了可能相关的变量,而 #2 使用逻辑回归,而我的最终模型是基于树的。此外,#2 需要几段自定义代码,我担心我的实现可能不正确。

处理协变量偏移的标准方法是什么?R(或其他语言)中是否有任何实现这些方法的包?

/edit:似乎“内核均值匹配”是我可以采取的另一种方法。我发现了很多关于这个主题的学术论文,但似乎没有人发布任何代码。我将尝试自己实现这一点,并在我这样做时发布代码作为这个问题的答案。

2个回答

看看twangCRAN 上的包。它在观察性研究和倾向评分方面提出了问题,但应用程序是相同的。阅读主要学术文章了解更多详细信息和讨论:“使用增强回归评估青少年药物滥用治疗的倾向得分估计”。

不过,这确实是一个棘手的领域。如果有测试/训练重叠,那么twang(或其他倾向得分分析)可以帮助你。如果没有重叠的区域,那么祝你好运。此外,您不需要重新采样,只需通过 Pr(Test)/Pr(Train) 对训练数据进行加权。上面的文章介绍了它的推导。

我不知道有任何打包函数可以对协变量偏移进行校正,但这里有一些可能有用的东西。

您可以在训练集和测试集之间构建一个随机森林分类器(以估计测试集的概率)。然后,您可以根据估计的测试集概率通过抽样来学习训练集上的随机森林。通过允许非线性函数学习器,这将减轻您的担忧 2。(顺便说一下,你也可以试试 mboost 包,它实现了多种增强方式,并且比 randomForest 快得多。)

内核均值匹配可能有效,但不一定比任何其他输出类概率的非线性分类器更好——而且还需要对内核及其超参数进行选择。