如何更改 R randomForests 中的分类阈值?

机器算法验证 r 分类 随机森林 临界点
2022-03-10 11:17:06

所有物种分布建模文献都表明,在使用输出概率的模型(例如,RandomForests)预测物种的存在/不存在时,选择阈值概率以将物种实际分类为存在或不存在是很重要的,人们应该并不总是依赖默认值 0.5。我需要一些帮助!这是我的代码:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

据此,我确定我想用于根据预测概率对存在进行分类的阈值是 0.7,而不是默认值 0.5。我不完全明白如何处理这些信息。在创建输出映射时我是否只使用此阈值?我可以轻松地创建具有连续概率的映射输出,然后简单地将值大于 0.7 的值重新分类为存在,而将 <0.7 的值重新分类为不存在。

或者,我是否想获取此信息并使用截止参数重新运行我的 randomForests 建模?截止参数到底在做什么?它会改变结果投票吗?(目前说是“多数”)。如何使用此截止参数?我看不懂文档!谢谢!

2个回答

#将阈值或截止值设置为0.7

cutoff=0.7

#所有低于截止值0.7的值将被归类为0(在这种情况下存在)

RFpred[RFpred<cutoff]=0

#所有大于截止值0.7的值将被归类为1(在这种情况下不存在)

 RFpred[RFpred>=cutoff]=1

抱歉,您还没有得到并尝试回答。会推荐 Max Kuhn 的书来讨论这个问题。这是一个相当广泛的问题。只需添加一些位:

  1. ROC 曲线很受欢迎,但只有在您试图了解成本假阴性和假阳性结果之间的权衡时才有意义。如果 CostFN=CostFP 则不确定它们是否有意义。c 统计量和其他派生度量仍然有用。如果您想最大限度地提高准确性 - 只需为此调整您的模型(插入符号包使这很容易),不要去制作 ROC 曲线。
  2. 每个人都使用从 RF 模型得出的概率。我认为应该考虑这样做 - 这些不是概率模型,它们不是为了做到这一点而构建的。它经常起作用。如果我真的对概率感兴趣,我至少会在新数据上生成 RF 概率的验证图
  3. 最简单的方法是使用“简单地将值大于 0.7 的那些重新分类为存在,而将那些小于 0.7 的重新分类为不存在”。
  4. 如果成本(FN)不等于成本(FP),那么您需要使射频成本敏感。R 并没有使这变得容易。RandomForest 包中的加权函数不起作用。最好的选择是使用采样、欠采样多数情况来获得您想要的成本函数。但是采样率和成本之间的关系并不是直接的。所以你可能想坚持(3)

关于类权重的更新 Andy Liaw:
“randomForest 包中的当前“classwt”选项从一开始就存在,与官方 Fortran 代码(版本 4 及更高版本)实现类权重的方式不同。它只是说明类分割节点时基尼指数计算中的权重,与给定类权重时单个 CART 树的处理方式完全相同。在我们发现只需使用基尼指数中的权重似乎对极端不平衡的数据没有多大帮助(比如 1:100 或更糟)。如果使用加权基尼指数对您的情况有帮助,请务必这样做。我只能说过去它没有给我们预期的结果。”