2017-10-24 29 views
0

私は知っています。 RandomForestは53以上のカテゴリを処理することはできません。残念ながら私はデータを分析しなければならず、1つの列には165レベルがあります。そのため、RandomForestを分類に使用したいと考えています。R - ランダムフォレストと53以上のカテゴリ

このプレディクタは本当に重要であり、貴重なプレディクタとして知られていますので、私はこの列を削除できません。

この予測子は165レベルであり、要因です。

私はこれをどのように処理することができるヒントはありますか?私たちは映画のジャンルについて話しているので、私は分かりません。

大きなデータ用の代替パッケージはありますか?特別な回避策ですか?このようなもの..

Pythonに切り替えることはできません。ここにはRスクリプトが多すぎます。

どうもありがとう、すべての最高の

STR(データ)次のようになります。ここでは、同じ問題に直面した

'data.frame': 481696 obs. of 18 variables: 
$ SENDERNR   : int 432 1612 735 721 436 436 1321 721 721 434 ... 
$ SENDER   : Factor w/ 14 levels "ARD Das Erste",..: 6 3 4 9 12 12 10 9 9 7 ... 
$ GEPLANTE_SENDUNG_N: Factor w/ 12563 levels "-- nicht bekannt --",..: 7070 808 5579 9584 4922 4922 12492 1933 9584 4533 ... 
$ U_N_PROGRAMMCODE : Factor w/ 14 levels "Bühne/Aufführung",..: 9 4 8 4 8 8 12 8 4 2 ... 
$ U_N_PROGRAMMSPARTE: Factor w/ 6 levels "Anderes","Fiction",..: 5 3 2 3 2 2 5 2 3 3 ... 
$ U_N_SENDUNGSFORMAT: Factor w/ 29 levels "Bühne/Aufführung",..: 20 9 19 4 19 19 24 19 4 16 ... 
$ U_N_GENRE   : Factor w/ 163 levels "Action/Abenteuer",..: 119 147 115 4 158 158 163 61 4 84 ... 
$ U_N_PRODUKTIONSART: Factor w/ 5 levels "Eigen-, Co-, Auftragsproduktion, Cofinanzierung",..: 1 1 3 1 3 3 1 3 1 1 ... 
$ U_N_HERKUNFTSLAND : Factor w/ 25 levels "afrikanische Länder",..: 16 16 25 16 15 15 16 25 16 16 ... 
$ GEPLANTE_SENDUNG_V: Factor w/ 12191 levels "-- nicht bekannt --",..: 6932 800 5470 9382 1518 9318 12119 1829 9382 4432 ... 
$ U_V_PROGRAMMCODE : Factor w/ 13 levels "Bühne/Aufführung",..: 9 4 8 4 8 8 12 8 4 2 ... 
$ U_V_PROGRAMMSPARTE: Factor w/ 6 levels "Anderes","Fiction",..: 5 3 2 3 2 2 5 2 3 3 ... 
$ U_V_SENDUNGSFORMAT: Factor w/ 28 levels "Bühne/Aufführung",..: 20 9 19 4 19 19 24 19 4 16 ... 
$ U_V_GENRE   : Factor w/ 165 levels "Action/Abenteuer",..: 119 148 115 4 160 19 165 61 4 84 ... 
$ U_V_PRODUKTIONSART: Factor w/ 5 levels "Eigen-, Co-, Auftragsproduktion, Cofinanzierung",..: 1 1 3 1 3 3 1 3 1 1 ... 
$ U_V_HERKUNFTSLAND : Factor w/ 25 levels "afrikanische Länder",..: 16 16 25 16 15 9 16 25 16 16 ... 
$ ABGELEHNT   : int 0 0 0 0 0 0 0 0 0 0 ... 
$ AKZEPTIERT  : Factor w/ 2 levels "0","1": 2 1 2 2 2 2 1 2 2 2 ... 
+0

[RのrandomForestは32以上のレベルを処理できません。回避策とは何ですか?](https://stats.stackexchange.com/questions/49243/rs-randomforest-can-not-handle-more-than-32-levels-what-is-workaround)有用です。 –

+0

ちょっと@ImranAli数日前にこのページをチェックしました。残念ながら、この回避策は役に立ちません。 – Peter

答えて

1

は、私が一覧表示することができますいくつかのヒントです。 gbmパッケージから後押しインスタンス勾配のための別のアルゴリズム、へ

  1. スイッチ。最大1024のカテゴリレベルを処理できます。もしあなたのプレディクタが非常に弁別的なパラメータを持っているならば、naiveBayesのような確率的アプローチを考慮する必要があります。
  2. 予測変数をダミー変数に変換します。これは、matrix.modelを使用して行うことができます。その後、この行列に対してランダムなフォレストを実行できます。
  3. ファクタのレベル数を減らしてください。それは愚かなアドバイスのように聞こえるかもしれませんが、このような「薄さ」の要因を見ることは本当に適切ですか?より広いレベルでいくつかのモダリティを集約することは可能ですか?

EDITはMODEL.MATRIX実施例で述べたように

が、ここではダミー変数にあなたの列を変換するためにmodel.matrixの使用方法の一例である追加します。

mydf <- data.frame(var1 = factor(c("A", "A", "A", "B", "B", "C")), 
        var2 = factor(c("X", "Y", "X", "Y", "X", "Z")), 
        target = c(1,1,1,2,2,2)) 
dummyMat <- model.matrix(target ~ var1 + var2, mydf, # set contrasts.arg to keep all levels 
         contrasts.arg = list(var1 = contrasts(mydf$var1, contrasts = F), 
              var2 = contrasts(mydf$var2, contrasts = F))) 
mydf2 <- cbind(mydf, dummyMat[,c(2:ncol(dummyMat)]) # just removing intercept column 
+0

ありがとう@AshOfFireポイント3は悲しいことには不可能です。ヒント2:model.matrixメソッドをチェックしましたが、私はこれを愚かにすると思います。現時点では、53以上のレベルのdata.frameと1つの列について話しています。この列を抽出して値を行列に変換すると、この新しい生成行列を初期データと組み合わせてどのように使用できますか?私はgbmパッケージをチェックアウトします。 – Peter

+1

factor列をダミー変数に変換したら、その列を最初のデータフレームに結合するだけです( 'model.matrix'を使用する場合は同じ数の行を保持します)。私はあなたの使用方法の例を示すために投稿を編集します。 – AshOfFire

+0

ああ、私はポイントを得た。あなたの例に示されているように、mydf2と呼ばれるdata.frameがいくつかの追加の列で取得されます。だから私はこの新しい生成data.frameを使用し、必要な列を抽出することができます。この場合、 "var1"と "var2"という列を削除してください。意味をなさないしかし、RandomForestは実行時間に関する多くの要因に役立つと思いますか?経験はありますか?あなたはGBMのパッケージを言及しました...ありがとう! – Peter

関連する問題