在随机森林模型中加权最近的数据


14

我正在使用随机森林训练一个分类模型,以区分6个类别。我的交易数据大约有6万多个观察值和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年,所以我一直认为可以将日期中的月份数作为权重。有人看到这种方法有问题吗?

提前谢谢了!


您可以考虑在堆栈溢出时发布问题。他们将在实施方面为您提供更多帮助。该站点的重点更多是基于理论的。
Alex Williams

我的写作可能不够清楚,但是我的问题与实现问题无关。例如,在我询问创建权重变量的部分中,我并不是要问R中的哪个命令可以帮助我做到这一点。我只是想知道是否会违反随机森林的任何假设。
Nikolay Nenov 2014年

1
我相信答案是否定的。您可以按照以下答案中的说明将权重分配给不同的组。我了解这不是您感兴趣的,但这是类似的想法。我可以建议您尝试使用重复的观察结果。
Alex Williams

Answers:


5

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


整齐!像我一直在寻找解决方案的接缝。您是否具有有关如何计算case.weights概率的详细信息的链接?
Nikolay Nenov

1
我不是100%不确定他们如何计算概率-但我想,如果您想开始,请看一下这篇文章:Malley,JD,Kruppa,J.,Dasgupta,A.,Malley,KG和Ziegler ,A。(2012)。概率机:使用非参数学习机进行一致的概率估计。方法,基础医学51:74-81。dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries,2015年

7

您可以对数据重新采样以过度代表更新的数据点。Rf无论如何都要进行替换样本步骤,对于不平衡的类,“粗略平衡的装袋”使用抽样来代表少数类,并根据我的经验得出的结果好于类加权随机森林。

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

在内部,包括scikit-learn在内的随机森林的某些实现实际上使用样本权重来跟踪每个样本在包装袋中的次数,这应等同于袋装水平的过采样,而在交叉验证中接近训练水平的过采样。


4

您应该查看“ classwt”参数。这似乎并不是您直接感兴趣的,但是它可能使您对想要做的事情有所了解。

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

此处:堆栈交换问题2

加权随机森林文章:PDF

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

在我看来,您想要做类似的事情,但要针对最近发生的事件(而不是针对某些组/分类)。一种简单的方法是为最近的观测值创建重复的观测值(即放在重复的相同行中)。但是,这可能效率不高。我不知道直接加权R中每个观测值的方法,但是我可能没有意识到。

您可以尝试寻找替代实现,例如在C中-最糟糕的是,可以通过一些编码来定制这些实现。


1
非常感谢您的链接,Alex。本文提供了一些很好的例子,说明您希望对分类器进行加权的情况。不过,我担心这对我不起作用,因为除了对分类器加权之外,不能将“ classwt”参数用于其他任何事情-即每个类需要一个权重,否则randomForest将返回错误。
Nikolay Nenov 2014年

1
是的,我认为您不能直接使用“ classwt”。您想要一些参数,例如“ observationweights”,但我认为它不存在。
Alex Williams
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.