使用 RandomForests 在 R 中实现平衡随机森林 (BRF)

机器算法验证 r 机器学习 随机森林
2022-04-07 05:59:29

嗨,我正在开发欺诈预测模型。因为这是一个高度不平衡的分类问题,所以我选择尝试通过随机森林来解决它。

受这篇文章
http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf
的启发, 我选择尝试平衡随机森林。

现在我不确定如何在 R 中实现这些森林。
文章建议:对于随机森林中的每次迭代,从少数类中抽取一个引导样本。
从多数类中随机抽取相同数量的案例,并进行替换。

这是通过指定这些参数来实现的吗?

replace = TRUE  
strata = fraud.variable  
sampsize = c(x,x) where x is the size of samples to be drawn
4个回答

您可以使用案例权重来平衡您的随机森林。这是一个简单的例子:

library(ranger) #Best random forest implementation in R

#Make a dataste
set.seed(43)
nrow <- 1000
ncol <- 10
X <- matrix(rnorm(nrow * ncol), ncol=ncol)
CF <- rnorm(ncol)
Y <- (X %*% CF + rnorm(nrow))[,1]
Y <- as.integer(Y > quantile(Y, 0.90))
table(Y)

#Compute weights to balance the RF
w <- 1/table(Y)
w <- w/sum(w)
weights <- rep(0, nrow)
weights[Y == 0] <- w['0']
weights[Y == 1] <- w['1']
table(weights, Y)

#Fit the RF
data <- data.frame(Y=factor(ifelse(Y==0, 'no', 'yes')), X)
model <- ranger(Y~., data, case.weights=weights)
print(model)

供参考并添加到@zach的答案:

rangernow(*) 实现了一个sample.fraction参数,该参数允许适用于不平衡情况的分层抽样方案的特定于类的值的向量。

(*)请参阅问题 #167修复 #263 允许按类进行 sample.fraction

作者介绍了此处发现的技术:http: //www.interfacesymposia.org/I04/I2004Proceedings/ChenChao/ChenChao.presentation.pdf

根据作者的说法,R 有一个附加包,它实现了他们原来的 Fortran:

以下是 R 包的工作链接:

不幸的是,如果您在此处搜索该软件包的文档,则没有提到“平衡”或“brf”。本文提供了一条线索:“我们使用 randomForest 包中的sampsize参数估计平衡的射频模型

这可以使您不必手动实施。

“randomForest”R 包中的“randomForest”函数支持平衡随机森林。需要指定“strata”和“sampsize”参数以启用平衡引导重采样。

  • strata
    用于分层抽样的(因子)变量。
  • sampsize
    要绘制的样本大小。对于分类,如果sampsize是一个长度为层数的向量,那么抽样是按层分层的,sampsize的元素表示要从层中抽取的个数。

可以在此处找到参考:http: //appliedpredictivemodeling.com/blog/2013/12/8/28rmc2lv96h8fw8700zm4nl50busep

希望能帮助到你!