如何解释随机森林的OOB和混淆矩阵?


35

我从某人那里获得了R脚本来运行随机森林模型。我修改并运行了一些员工数据。我们正在尝试预测自愿离职。

以下是一些其他信息:这是一个分类模型,其中0 =员工留下,1 =员工终止,我们目前仅查看十二个预测变量,数据“不平衡”,因为术语记录约占7占总记录集的百分比。

我使用各种mtry和ntree选择来运行模型,但是选择了以下内容。OOB是6.8%,我认为这很好,但是混淆矩阵似乎在讲另一个预测术语的方法,因为错误率非常高,达到92.79%。我认为我不能依靠和使用此模型是正确的,因为预测术语的高错误率?还是可以做一些事情来使用RF并获得较小的错误率来预测术语?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908

Answers:


20

混淆矩阵是在特定点计算的,该特定点由投票的截止点确定。根据您的需要,即更好的精度(减少误报)或更好的灵敏度(减少误报),您可能希望使用其他截止值。

为此,我建议绘制(i)ROC曲线,(ii)查全精度和(iii)校准曲线,以便选择最适合您目的的截止值。所有这些都可以使用ROCR R库中的以下两个函数(也可以在CRAN上获得)轻松地绘制:

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

例如:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);

我对您的回答很感兴趣,并用您共享的代码进行了绘制。请您给我一些资源,以找到有关您建议的情节的详细信息。或将写一些句子来解释它。提前谢谢了。
MKS

我建议您从链接到上面的ROC曲线条目以及此处提到的其他条目开始。
Itamar

答案并没有直接解决高度偏斜的数据集中决策树的局限性。
SmallChess

19

您的设备严重不平衡-在这种情况下,RF通常会失败(即只能预测更大的类别)。

您应该尝试通过采样“ 0”类以使其与“ 1”类具有大致相同的大小来平衡您的集合,或者尝试使用参数来达到平衡classwt


1
尽管有一个classwt参数,但我认为它尚未在R. Per LinkrandomForest()中的randomForest包功能中实现。你以前用过吗?我尝试使用不同的值,但得到的结果与默认值相同。classwt=NULL
朱巴卜2015年

9

根据您的混淆矩阵,您获得了5,908个数据点,并且绝大多数数据类型均为0(“员工留下”)。因此,除非绝对确定一个示例属于另一个类,否则分类器可以摆脱“懒惰”并选择多数类。请注意,您的总体错误率约为7%,非常接近Class1示例的百分比!

您有几种选择:

  • 丢弃Class0示例,直到获得大致平衡的类为止。我不知道是否有文献介绍如何选择最佳代表性子集(也许有人可以参与其中),但是您可以从随机删除示例开始。您可以将subset参数传递给randomForest,这将使测试变得简单。

  • 调整损失函数/类别权重,以补偿不成比例的Class0数。本质上,您要使分类器将Class1示例错误分类的成本比Class0示例高得多。尝试启动Class0 = 1 / 0.07〜= 14x Class1可能很有意义,但是您可能要根据业务需求进行调整(一种错误的严重程度是多少)。我认为classwt参数是您在这里寻找的。

  • 使用分层抽样以确保您在树的训练数据中都从两个类中获得了示例。您的某些树可能仅接受了Class0数据的训练,这显然对于它们的泛化性能而言是不好的预兆。查看strata参数。


从优势阶层中随机选择听起来很合理。它们不必相等:即使是1:5的比例也应该有所改进。
Itamar 2012年

@Itmar,那绝对是我首先会尝试的。但是,似乎必须采取某种方法来确保您保留的示例代表较大的数据集。
马特·克劳斯

1
一种选择是在较大的集合上运行PCA(原理成分分析),根据第一个主要成分对点进行聚类,然后从每个聚类中选择一个样本。
Itamar 2012年
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.