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.5ではなく0.7であると判断しました。私はこの情報をどうするかを完全に理解していません。出力のマップを作成するときにこのしきい値を使用するだけですか?連続的な確率でマップされた出力を簡単に作成し、0.7より大きい値を持つものを現在として再分類し、<0.7がないものとして再分類することができます。

または、この情報を取得して、カットオフパラメーターを使用してrandomForestsモデリングを再実行しますか?カットオフパラメータは正確には何をしているのですか?結果の投票は変わりますか?(現在は「マジョリティ」と言われています)。このカットオフパラメータはどのように使用しますか?ドキュメントが理解できません!ありがとう!


2
これはここに属していると思います:(1)RFからの確率推定、(2)モデルにコスト関数を課すことができるか、モデルに組み込む必要があるか、および(3)コスト関数の実装方法RFには、単にプログラミングに関連するだけではない、繰り返し発生する問題があります。
charles、2014

回答:


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氏は、モニカを2014

この答えは完全に正しいです。同意する。
Seanosapien 2017年

7

申し訳ありませんが、まだ回答が得られていません。この問題の報道については、マックスクーンの本をお勧めします。これはかなり広い問題です。いくつかのビットを追加するだけです:

  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ツリーが実行される方法とまったく同じです。ブライマン教授は、新しいバージョンのFortranコードに実装された新しいクラスの重み付けスキームを思いついた。 Giniインデックスの重みは、極端に不均衡なデータ(1:100以下など)ではあまり役立たないようです。加重Giniを使用すると状況に役立つ場合は、必ずそれを実行してください。期待していた結果が得られなかった」と語った。


サブポイント(4)について、重み付けの引数が機能しない理由について詳しく説明してください。
Sycorax氏は、モニカを2014

2
私の理解では、これはFortranコード(stat.berkeley.edu/~breiman/RandomForests/cc_software.htm)に適切に実装されていますが、Rパッケージには実装されていません。これについて説明します:(stat.ethz.ch/pipermail/r-help/2011-September/289769.html)そして、Giniの分割だけでなく、ツリー構築のすべての段階で重みを使用する必要があることに集中します。したがって、現在のRの実装-スプリットでのみ重み付けを使用することは、あまりうまく機能しません
charles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.