在随机森林模型中加权更新的数据

机器算法验证 r 机器学习 分类 随机森林
2022-02-06 03:56:08

我正在用随机森林训练一个分类模型来区分 6 个类别。我的交易数据有大约 60k+ 观察和 35 个变量。这是它大致看起来的示例。

 _________________________________________________
|user_id|acquisition_date|x_var_1|x_var_2| y_vay  |
|-------|----------------|-------|-------|--------|
|111    | 2013-04-01     | 12    | US    | group1 |
|222    | 2013-04-12     | 6     | PNG   | group1 |
|333    | 2013-05-05     | 30    | DE    | group2 |
|444    | 2013-05-10     | 78    | US    | group3 |
|555    | 2013-06-15     | 15    | BR    | group1 |
|666    | 2013-06-15     | 237   | FR    | group6 |

创建模型后,我想对过去几周的观察结果进行评分。由于系统发生了变化,最近的观察将更接近我想要预测的当前观察的环境。因此,我想创建一个权重变量,以便随机森林更加重视最近的观察。

有谁知道 R 中的 randomForest 包是否能够处理每次观察的权重?

另外,您能否建议创建权重变量的好方法?例如,由于我的数据来自 2013 年,我想我可以将日期中的月份数作为权重。有人看到这种方法有问题吗?

提前谢谢了!

3个回答

rangerR ( pdf ) 中相对较新的包将执行此操作。随机森林的 ranger 实现有一个case.weights参数,该参数采用具有单个案例/观察权重的向量。

您可以重新采样数据以过度表示较新的数据点。无论如何,Rf 都涉及一个带有替换的样本步骤,并且根据我的经验,不平衡类的“粗略平衡装袋”使用抽样来过度代表少数类,并产生与类加权随机森林一样好的或更好的结果。

您可以在构建训练矩阵(参考)的级别上重新采样,而不是在装袋期间重新采样以保持实施容易,尽管我建议在这种情况下进行多次重复。

在内部,包括 scikit-learn 在内的随机森林的一些实现实际上使用样本权重来跟踪每个样本在 bag 中的次数,它应该等效于 bagging 级别的过采样和交叉验证中训练级别的过采样。

您应该查看“classwt”参数。这似乎不是您直接感兴趣的,但它可能会让您了解自己想要做什么。

请参见此处:堆栈交换问题 #1

在这里:堆栈交换问题 #2

关于加权随机森林的文章:PDF

基本思想是对类别进行加权,以便在您的引导样本中更有可能选择很少观察到的组/分类。这对于不平衡的数据很有帮助(当不同类别的先验概率差异很大时)。

在我看来,您想做类似的事情,但针对最近的事件(不是针对某些组/分类)。一个简单的方法是为最近的观察创建重复的观察(即放入重复的、相同的行)。然而,这可能是低效的。我不知道如何在 R 中直接加权每个观察值,但我可能不知道。

您可以尝试四处寻找替代实现,例如在 C 中——在最坏的情况下,这些可以通过一些编码来定制。