如何在R的randomForest中使用classwt?

时间:2013-11-27 19:53:38

标签: r random-forest

我有一个高度不平衡的数据集,目标类实例的比例如下(编辑:) 60000:1000:1000:1000 60000:1000:1000:50(即共4课)。我想使用randomForest来预测目标类。

因此,为了减少类不平衡,我使用sampsize参数,将其设置为(编辑:) c(5000, 1000, 1000, 1000) {{1和其他一些值,但没有多少用处。实际上,当我使用c(5000, 1000, 1000, 50)时,第一类的准确性有所下降,尽管其他类预测的改善非常微小。

在浏览档案时,我发现了sampsize的另外两个功能,randomForest()strata用于抵消类不平衡问题。

classwt上的所有文件都已过时(通常属于2007年,2008年),所有文件都建议不要使用classwt classwt randomForest包中的R功能因为它没有像在fortran中那样完全实现其完整功能。所以第一个问题是:
现在classwt R包中是否完全实现了randomForest?如果是,将c(1, 10, 10, 10)传递给classwt参数代表什么?(假设目标变量中有4个类的上述情况)

据说可以抵消类不平衡问题的另一个论点是分层抽样,它总是与sampsize一起使用。我理解文档中的sampsize是什么,但没有足够的文档或示例清楚地了解如何使用strata来克服类不平衡问题。所以第二个问题是:
哪些类型的参数必须传递给strata中的randomForest以及它代表什么?

我想在问题中没有明确提到的 weight 这个词应该在答案中发挥重要作用。

3 个答案:

答案 0 :(得分:3)

classwt已正确传递给randomForest,请查看此示例:

library(randomForest)
rf = randomForest(Species~., data = iris, classwt = c(1E-5,1E-5,1E5))
rf

#Call:
# randomForest(formula = Species ~ ., data = iris, classwt = c(1e-05, 1e-05, 1e+05)) 
#               Type of random forest: classification
#                     Number of trees: 500
#No. of variables tried at each split: 2
#
#        OOB estimate of  error rate: 66.67%
#Confusion matrix:
#           setosa versicolor virginica class.error
#setosa          0          0        50           1
#versicolor      0          0        50           1
#virginica       0          0        50           0

等级权重是结果的先行者。你需要平衡它们以达到你想要的效果。

stratasampsize上,此答案可能有所帮助:https://stackoverflow.com/a/20151341/2874779

通常,对于所有类,具有相同大小的sampsize似乎是合理的。 strata是一个可用于分层重新取样的因素,在您不需要输入任何内容的情况下。

答案 1 :(得分:1)

随机森林可能不是您问题的正确分类器,因为它们对类不平衡非常敏感。

当我遇到不平衡问题时,我通常会使用sampsize处理它,就像你尝试过的那样。然而,我使所有阶层大小相等,我使用采样而无需更换。 没有替换的抽样在这里很重要,因为来自较小类的样本将包含更多的重复,并且该类仍然不足。如果此方法导致小样本,有时甚至可以将其设置为特征总数,则可能需要增加mtry

当最小的课程中有足够的项目时,这很安静。但是,您最小的班级只有50个项目。我怀疑你会使用sampsize=c(50,50,50,50)得到有用的结果。

同样classwt从未对我有效。

答案 2 :(得分:0)

您可以将命名向量传递给classwt。 但是重量的计算方法非常棘手。

例如,如果目标变量y具有两个类“ Y”和“ N”,并且您想要设置平衡权重,则应该执行以下操作:

wn = sum(y="N")/length(y)
wy = 1

然后设置classwt = c("N"=wn, "Y"=wy)

或者,您可能要使用ranger软件包。该软件包提供了灵活的随机森林构建,并且轻松指定类别/样本权重。 ranger软件包也支持caret