我有一个高度不平衡的数据集,目标类实例的比率为60000:1000:1000:50
(即总共4个类)。我想使用randomForest
来预测目标类。
因此,为了减少类的不平衡,我使用了sampsize
参数,将其设置为c(5000, 1000, 1000, 50)
和其他一些值,但并没有太多用处。实际上,在我玩sampsize
的时候,第一类的准确率下降了,尽管其他类预测的改善非常微小。
在挖掘归档文件的过程中,我偶然发现了randomForest()
的另外两个特性,即strata
和classwt
,它们用于解决类不平衡问题。
classwt
上的所有文档都是旧的(通常属于2007、2008年),这些文档都建议不要使用R
中randomForest
包的classwt
特性,因为它不像fortran
中那样完全实现其完整的功能。所以第一个问题是:
现在R的classwt
randomForest
package中是否完全实现了?如果是,将目标类传递给c(1, 10, 10, 10)
classwt
参数表示什么?(假设上面的情况下目标变量中有4个类)
另一个据说可以抵消类不平衡问题的论点是分层抽样,它总是与sampsize
一起使用。我从文档中理解了sampsize
是什么,但没有足够的文档或示例来清楚地了解如何使用strata
来克服类不平衡问题。所以第二个问题是:
必须将哪种类型的参数传递给 strata
**in** randomForest
?它代表什么?
我想我在问题中没有明确提到的单词weight应该在答案中起主要作用。
发布于 2016-07-15 22:22:26
是否将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
是一个将用于分层重采样的因子,在您的情况下,您不需要输入任何内容。
发布于 2018-11-16 09:54:57
您可以将命名向量传递给classwt
。但是如何计算权重是非常棘手的。
例如,如果您的目标变量y
有两个类"Y“和"N",并且您希望设置平衡权重,则应执行以下操作:
wn = sum(y="N")/length(y)
wy = 1
然后设置classwt = c("N"=wn, "Y"=wy)
或者,您可能想要使用ranger
包。这个包提供了灵活的随机森林构建,并且指定类/样本权重很容易。caret
包也支持ranger
。
发布于 2016-02-04 13:22:27
随机森林可能不是您的问题的正确分类器,因为它们对类不平衡非常敏感。
当我遇到不平衡的问题时,我通常会像您尝试的那样使用sampsize
来处理它。但是,我使所有层的大小相等,并且我使用采样而不进行替换。没有替换的采样在这里很重要,否则来自较小类的样本将包含更多的重复,并且类仍将被低估。如果这种方法导致小样本,有时甚至将其设置为特征总数,则可能有必要增加mtry
。
当在最小的类中有足够的项目时,这种方法工作得很好。然而,你最小的类只有50个项目。我怀疑你是否会用sampsize=c(50,50,50,50)
得到有用的结果。
另外,classwt
从来没有为我工作过。
https://stackoverflow.com/questions/20251839
复制相似问题