ランダムフォレストのOOBと混同マトリックスを解釈する方法は?


35

誰かからランダムスクリプトモデルを実行するRスクリプトを受け取りました。いくつかの従業員データを使用して変更して実行しました。自発的な分離を予測しようとしています。

いくつかの追加情報があります。これは、0 =従業員が留まる、1 =従業員が解雇される分類モデルです。現在、12個の予測変数のみを調べています。レコードセット全体の%。

さまざまな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

回答:


20

混同マトリックスは、投票のカットオフによって決定される特定のポイントで計算されます。ニーズ、つまり、精度の向上(誤検知を減らす)または感度の向上(誤検知を減らす)に応じて、別のカットオフを選択できます。

この目的のために、目的に最適なカットオフを選択するために、(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]]);

私はあなたの答えに興味があります、私はあなたが共有したコードでプロットしました。あなたが提案したプロットの詳細を見つけるためにいくつかのリソースをください。またはそれを解釈する方法についていくつかの文章を書きます。事前に感謝します。
MKS

上記にリンクされているROCカーブのエントリと、そこに記載されている他のエントリから始めることをお勧めします。
イタマル

答えは、非常に歪んだデータセットの決定木の制限に直接対処していません。
-SmallChess

19

セットは非常に不均衡です-通常、このシナリオではRFは失敗します(つまり、より大きなクラスのみを予測します)。

「0」クラスのみをサンプリングして「1」クラスとほぼ同じサイズにするか、classwtパラメーターを使用して、セットのバランスをとってください。


1
classwtパラメーターがあるにもかかわらず、R. Per LinkのパッケージのrandomForest()機能にはまだ実装されていないと思います。以前に使用したことがありますか?異なる値で試してみましたが、デフォルトと同じ結果が得られました。randomForestclasswt=NULL
ジュバル

9

混同マトリックスに基づいて、5,908個のデータポイントがあり、それらの大部分、大部分はタイプ0(「従業員の滞在」)です。したがって、分類器は、例が他のクラスに属していることが絶対に確実でない限り、「怠laz」で多数派クラスを選択することを回避できます。全体的なエラー率は約7%であり、Class1の例の割合に非常に近いことに注意してください。

いくつかのオプションがあります:

  • ほぼバランスの取れたクラスになるまで、Class0の例を破棄します。最適に代表的なサブセットを選択する方法に関する文献があるかどうかはわかりませんが(誰か他の人が体重を測ることができますか?)、ランダムに例をドロップすることから始めることができます。あなたは渡すことができsubset、テストに、これは些細な作るべきランダムフォレストへの引数を、。

  • 損失関数/クラスの重みを調整して、Class0の不均衡な数を補正します。基本的に、Class1の例の誤分類をClass0の例よりも分類器ではるかに高くする必要があります。Class0 = 1 / 0.07〜= 14x Class1を試して開始するのは理にかなっているかもしれませんが、ビジネスの要求に基づいてこれを調整することもできます(1種類のエラーがどれほど悪いか)。classwtここでパラメーターが探しているものだと思います。

  • 階層化されたサンプリングを使用して、ツリーのトレーニングデータの両方のクラスからの例を確実に取得します。一部のツリーがClass0データのみでトレーニングされている可能性があります。これは、一般化パフォーマンスにとって明らかに悪い兆候です。strata引数を確認してください。


支配的なクラスからランダムに選択するのは理にかなっています。等しくする必要はありません。1:5の比率であっても改善されるはずです。
イタマル

@Itmar、それは間違いなく私が最初に試すことです。ただし、保持する例がより大きなデータセットを代表することを保証する何らかの方法が必要であると思われます。
マットクラウス

1
1つのオプションは、より大きなセットでPCA(主成分分析)を実行し、最初の主成分に基づいてポイントをクラスター化し、各クラスターから1つのサンプルを選択することです。
イタマル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.