如何控制随机森林中的错误分类成本?

机器算法验证 r 分类 随机森林 损失函数 公制
2022-01-28 20:46:57

是否可以控制 R 包randomForest中的错误分类成本?

在我自己的工作中,假阴性(例如,错误地漏掉一个人可能患有疾病)比假阳性要昂贵得多。rpart允许用户通过指定一个损失矩阵来对错误分类进行不同的加权来控制错误分类成本。有没有类似的东西存在randomForest例如,我是否应该使用该classwt选项来控制基尼标准?

4个回答

不是真的,如果不是通过手动制作 RF 克隆来进行rpart模型装袋。

一些选项来自这样一个事实,即 RF 的输出实际上是一个连续的分数,而不是一个清晰的决定,即对某个类进行投票的树的比例。例如,它可以被提取predict(rf_model,type="prob")并用于制作 ROC 曲线,该曲线将显示比 0.5 更好的阈值(稍后可以在带有cutoff参数的 RF 训练中合并)。

classwt方法似乎也有效,但在实践中效果不佳——平衡预测和同一类的琐碎转换之间的转换往往过于尖锐而无法使用。

计算成本的方法有很多种。
(1) 每棵袋装树的过度/不足抽样(分层抽样)是引入成本的最常见方法。你故意不平衡数据集。
(2) 加权。从不工作。我认为这在文档中得到了强调。一些人声称你只需要在所有阶段加权,包括基尼分割和最终投票。如果它要工作,那将是一个棘手的实现。
(3) Weka中的元成本函数。
(4) 将随机森林视为概率分类器并改变阈值。我最不喜欢这个选项。可能是由于我缺乏知识,但即使算法可以输出概率,我也没有意义将它们视为概率模型。

但我确信还有其他方法。

建议如果您尝试预测的变量不是 50%class 1和 50% class 2(就像大多数情况一样),您可以调整参数以概括cutoff表示真实值。OOB

例如,

randomForest(data=my_data, formula, ntree = 501, cutoff=c(.96,.04))

在这种情况下,值为 1 的概率为 ,class 1.96值为class 2.04

否则随机森林使用阈值0.5.

可以通过参数costMatrix显式合并:randomForestparms

library(randomForest)
costMatrix <- matrix(c(0,10,1,0), nrow=2)
mod_rf <- randomForest(outcome ~ ., data = train, ntree = 1000, parms = list(loss=costMatrix))