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

机器算法验证 r 分类 错误 随机森林
2022-02-01 14:10:20

我从某人那里得到了一个 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
3个回答

混淆矩阵是在由选票截止确定的特定点计算的。根据您的需要,即更好的精度(减少误报)或更好的灵敏度(减少误报),您可能更喜欢不同的截止值。

为此,我建议绘制 (i) ROC 曲线,(ii) 召回精度和 (iii) 校准曲线,以便选择最适合您的目的的截止值。所有这些都可以使用ROCR R 库中的以下 2 个函数轻松绘制(也可在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]]);

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

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

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

你有几个选择:

  • 丢弃 Class0 示例,直到您的类大致平衡。我不知道是否有关于如何选择最佳代表性子集的文献(也许其他人可以权衡?),但您可以从随机删除示例开始。您可以将subset参数传递给 randomForest,这应该使测试变得微不足道。

  • 调整您的损失函数/类别权重以补偿 Class0 不成比例的数量。本质上,您想让分类器对 Class1 示例进行错误分类的代价比 Class0 示例高得多。尝试 Class0 = 1/0.07 ~= 14x Class1 开始可能是有意义的,但您可能需要根据您的业务需求进行调整(一种错误有多糟糕)。我认为classwt参数是你在这里寻找的。

  • 使用分层抽样来确保您在树的训练数据中获得了来自两个类的示例。您的某些树可能仅针对 Class0 数据进行了训练,这显然预示着它们的泛化性能很差。看看strata论据。