我有一个高度不平衡的数据集,目标类实例的比例如下(编辑:) 60000:1000:1000:1000 60000:1000:1000:50
(即共4课)。我想使用randomForest
来预测目标类。
因此,为了减少类不平衡,我使用sampsize
参数,将其设置为(编辑:) {{1和其他一些值,但没有多少用处。实际上,当我使用c(5000, 1000, 1000, 1000)
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 这个词应该在答案中发挥重要作用。
答案 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
等级权重是结果的先行者。你需要平衡它们以达到你想要的效果。
在strata
和sampsize
上,此答案可能有所帮助: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
。