ランダムフォレストツリーを2進数ではなく10進数に投票する方法


9

私の質問は、バイナリ分類についてです。たとえば、良い顧客と悪い顧客を区別しますが、回帰や非バイナリ分類はそうではありません。このコンテキストでは、ランダムフォレストは分類木の集合です。各観測について、すべての木が「はい」または「いいえ」に投票し、すべての木の平均投票が最終的な森林確率です。

私の質問は、基になるツリーの動作を変更することです。RのrandomForestパッケージのrandomForest関数を変更して、各ツリーがバイナリのyes / noではなく10進数に投票するようにするにはどうすればよいですか。10進数の意味をよりよく理解するために、決定木がどのように機能するかを考えてみましょう。

完全に成長したディシジョンツリーのターミナルノードには、1つの良いインスタンスまたは1つの悪いインスタンスがあります。ターミナルノードのサイズを100に制限するとします。ターミナルノードは次のようになります。

Node1 = 80不良、20良好
Node2 = 51不良、49良好
Node3 = 10不良、90良好

Node1とNode2が「悪い」と投票したとしても、「悪さの強さ」は大きく異なります。それが私の狙いです。1または0(デフォルトの動作)を生成する代わりに、Rパッケージを変更して、80 / 100、51 / 100、10 / 100などに投票できますか?


:ちょうど関連する説明に次のリンクが含またかったstackoverflow.com/questions/22409019/...
FatihAkici

最も可能性の高い予測クラスだけでなく、実際の予測確率が必要だということです。
smci

はい、確かに@smci。
FatihAkici

回答:


10

これはソフトウェアごとに異なる微妙な点です。私が知っている2つの主な方法があります。

  1. バイナリリーフ-各リーフが過半数として投票します。これはrandomForest、Rを使用する場合でも機能しますpredict(..., type="prob")
  2. 比率リーフ-各リーフは、各クラスに属するトレーニングサンプルの比率を返します。これがどのようにsklearn.ensemble.RandomForestClassifier.predict_proba機能するかです。別の回答では、@usεr11852は、Rのrangerパッケージもこの機能を提供することを指摘しています。幸いにも、私は私の限られた使用法から、rangerはるかに、はるかに高速であることを証明できますrandomForest

Rソフトウェアは実際にはCおよびFORTRANプログラムへのフックにすぎないので、比例葉法を使用する簡単な方法はないと思いますrandomForest。他人のコードの変更を楽しむのでない限り、自分でコードを作成するか、別のソフトウェア実装を見つける必要があります。


どうもありがとう、Sycorax。RのソースコードをrandomForest 変更してこれに対応できると思いますか?
FatihAkici

十分なリソースがあれば、あらゆるソフトウェアを変更して何でも実行できます。一方、randomForestはFORTRANコードへのRインターフェースにすぎないため、実行するにはかなりのリソースが必要になる場合があります。
Sycoraxによると、モニカの復活は

@FatihAkici実は、勘違いしていたようです。コンパイルされたコードは、BreimanのオリジナルのFORTRANコードのCポートです。
Sycoraxは、モニカを復活させます

5
REUの一環として、2015年の夏のrandomForestパッケージに取り組みました。これを行うためにコードを変更することは間違いなく可能ですが、実際にはC-Fortranが混在しているため、少し注意が必要です。「外部」コードのほとんどはCですが、いくつかのコア関数はFortranに残り、コンパイル後にリンクされます。残念ながら、コードを見たので、どこを見ればよいのかがわかりません。ただし、パッケージを変更する場合は、CとFortranの両方で動作するように準備することをお勧めします。
チップバスター2018

5

「確率の森」を育てることは完全に可能です。マレー他の方法論。(2012)「確率マシン:ノンパラメトリック学習マシンを使用した一貫した確率推定これを行う方法と、標準のランダムフォレスト実装と比較する方法の概要を示します。さらに、優れた Rパッケージレンジャーはすでにこの機能を実装しています。probability = TRUEへの関数呼び出しを行うときに設定するだけrangerです。


2

単に使用しますpredict.randomForest(..., type="prob")。あなたは良いことをやっています。


2
ステファン、あなたの答えをありがとう、しかしそれは私が探しているものではありません。あなたが言及したコードは、基礎となるバイナリツリーの投票の平均をとりますが、私は基礎となるツリーに10進数の投票をさせようとしています。したがって、3本の木の森では、(1 + 1 + 0)/ 3ではなく(.80 + .51 + .10)/ 3にしたくありません。それは理にかなっていますか?
FatihAkici

2
それはメイクセンスを行い、それがsklearnでランダムフォレスト分類器の動作です:scikit-learn.org/stable/modules/generated/...
psarka

1
あ、そうですね。すみません、それでは私は誤解しました。ヘルプページから判断して、predict.allおよびnorm.votesパラメータを見ると、これは可能ではないようです。これが本当に必要な場合は、おそらく独自のランダムフォレストをコーディングする必要があります。これが完全に理にかなっていると私は@psarkaに同意します。(この回答は削除しますが、コメントでこの議論を失うことになります。)
Stephan Kolassa

ステファンさんと@psarkaさんにとって、実に有意義な議論でした。ありがとうございました!
FatihAkici
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.