首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在R的randomForest中使用类?

如何在R的randomForest中使用类?
EN

Stack Overflow用户
提问于 2013-11-28 03:53:38
回答 3查看 22.1K关注 0票数 27

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

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

在挖掘归档文件的过程中,我偶然发现了randomForest()的另外两个特性,即strataclasswt,它们用于解决类不平衡问题。

classwt上的所有文档都是旧的(通常属于2007、2008年),这些文档都建议不要使用RrandomForest包的classwt特性,因为它不像fortran中那样完全实现其完整的功能。所以第一个问题是:

现在R的classwt randomForest package中是否完全实现了?如果是,将目标类传递给c(1, 10, 10, 10) classwt 参数表示什么?(假设上面的情况下目标变量中有4个类)

另一个据说可以抵消类不平衡问题的论点是分层抽样,它总是与sampsize一起使用。我从文档中理解了sampsize是什么,但没有足够的文档或示例来清楚地了解如何使用strata来克服类不平衡问题。所以第二个问题是:

必须将哪种类型的参数传递给 strata**in** randomForest ?它代表什么?

我想我在问题中没有明确提到的单词weight应该在答案中起主要作用。

EN

回答 3

Stack Overflow用户

发布于 2016-07-15 22:22:26

是否将classwt正确传递给randomForest,请检查此示例:

代码语言:javascript
复制
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是一个将用于分层重采样的因子,在您的情况下,您不需要输入任何内容。

票数 4
EN

Stack Overflow用户

发布于 2018-11-16 09:54:57

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

例如,如果您的目标变量y有两个类"Y“和"N",并且您希望设置平衡权重,则应执行以下操作:

代码语言:javascript
复制
wn = sum(y="N")/length(y)
wy = 1

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

或者,您可能想要使用ranger包。这个包提供了灵活的随机森林构建,并且指定类/样本权重很容易。caret包也支持ranger

票数 3
EN

Stack Overflow用户

发布于 2016-02-04 13:22:27

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

当我遇到不平衡的问题时,我通常会像您尝试的那样使用sampsize来处理它。但是,我使所有层的大小相等,并且我使用采样而不进行替换。没有替换的采样在这里很重要,否则来自较小类的样本将包含更多的重复,并且类仍将被低估。如果这种方法导致小样本,有时甚至将其设置为特征总数,则可能有必要增加mtry

当在最小的类中有足够的项目时,这种方法工作得很好。然而,你最小的类只有50个项目。我怀疑你是否会用sampsize=c(50,50,50,50)得到有用的结果。

另外,classwt从来没有为我工作过。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20251839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档