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


10

所有物种分布建模文献都认为,当使用输出概率的模型(例如,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的值。

或者,我是否想获取这些信息并使用cut-off参数重新运行randomForests建模?截断参数究竟在做什么?它会改变投票结果吗?(目前说这是“多数”)。如何使用该截止参数?我不了解文档!谢谢!


2
我想说的可能是:(1)RF的概率估计;(2)是否可以在模型上施加成本函数或必须将其构建到模型中;以及(3)如何实现成本函数RF中反复出现的问题不仅与编程有关。
查尔斯

Answers:


7

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

cutoff=0.7

#所有低于临界值0.7的值都将归类为0(在这种情况下存在)

RFpred[RFpred<cutoff]=0

#所有大于临界值0.7的值都将分类为1(在这种情况下不存在)

 RFpred[RFpred>=cutoff]=1

1
您能否扩大您的答案?至少,对代码进行注释会很有用。
Patrick Coulombe 2014年

2
FWIW,我认为这已经足够了。
Sycorax说恢复Monica 2014年

这个答案很完美。我同意。
Seanosapien '17

7

抱歉,您还没有得到答案。将推荐Max Kuhn的书来介绍此问题。这是一个相当广泛的问题。只需添加一些位:

  1. ROC曲线很流行,但只有在您试图了解成本假阴性和假阳性结果之间的权衡时才有意义。如果CostFN = CostFP,则不确定它们是否有意义。c统计量和其他派生的度量值仍然有用。如果要最大程度地提高精确度-只需为此调整模型(脱字符包可简化此操作),请勿绘制ROC曲线。
  2. 每个人都使用从RF模型得出的概率。我认为应该对此进行一些考虑-这些不是概率模型,并不是为了做到这一点而设计的。它经常有效。如果我真的对概率有兴趣,我至少会在新数据上生成RF概率的验证图。
  3. 最简单的方法是使用“仅将值大于0.7的值重新分类,而小于0.7的值不存在”。
  4. 如果cost(FN)不等于cost(FP),则需要使RF成本敏感。R并不容易做到。RandomForest软件包中的加权功能不起作用。最好的选择是处理抽样,抽样不足的情况,以获得所需的成本函数。但是样本比率和成本之间的关系不是直接的。所以您可能要坚持(3)

关于类权重的更新 Andy Liaw:
“ randomForest软件包中的当前“ classwt”选项自一开始就存在,与官方Fortran代码(版本4及更高版本)实现类权重的方式不同。它只是说明了类拆分节点时,Gini索引计算中的权重,就像给定类权重时如何完成单个CART树一样。Breiman教授提出了在较新版本的Fortran代码中实现的较新类权重方案,因为我们发现简单地使用在极端不平衡的数据(例如1:100或更差)中,基尼系数的权重似乎并没有多大帮助。如果使用加权基尼系数在您的情况下有所帮助,则一定可以这样做,我只能说过去没有给我们期望的结果。”


您能否详细说明子点(4)为何加权参数不起作用?
Sycorax说恢复Monica 2014年

2
我的理解是,它是用Fortran代码(stat.berkeley.edu/~breiman/RandomForests/cc_software.htm)适当地实现的,而不是R包。讨论了这一点:(stat.ethz.ch/pipermail/r-help/2011-September/289769.html)围绕需要在树构建的所有阶段使用权重-而不仅仅是Gini拆分。因此,当前的R实现方式(仅在分割时使用加权)效果不佳
查尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.