RのrandomForestは32レベル以上を処理できません。回避策は何ですか?


22

RのrandomForestパッケージは、32レベルを超える係数を処理できません。32レベルを超えると、エラーメッセージが表示されます。

32を超えるカテゴリを持つカテゴリカル予測子を処理できません。

しかし、私が持っているデータにはいくつかの要因があります。それらの一部には1000以上のレベルがあり、一部には100以上があります。52の米国の「状態」もあります。

だから、ここに私の質問があります。

  1. なぜそのような制限があるのですか?randomForestは、単純な場合でも実行を拒否します。

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.

    単にメモリ制限が原因である場合、scikit学習のrandomForeestRegressorは32を超えるレベルでどのように実行できますか?

  2. この問題を処理する最良の方法は何ですか?X1、X2、...、X50の独立変数があり、Yが従属変数であるとします。そして、X1、X2、X3には32を超えるレベルがあるとします。私は何をすべきか?

    私が考えているのは、距離がYの差として定義されるX1、X2、X3のそれぞれに対してクラスタリングアルゴリズムを実行することです。3つの問題のある変数があるので、3つのクラスタリングを実行します。そして、各クラスタリングで、同様のレベルを見つけることができればと思います。そして、それらをマージします。

    これはどのように聞こえますか?


パッケージ名とエラーメッセージを使用してWebを検索すると、いくつかの回答が得られます。
ローランド

5
@ローランド実際にここに私を導いて…
同型14年

1
データサイエンスを試してみてください。多くのディメンションを持つデータのプログラミング経験があるいくつかの統計マインドがあります。
aeroNotAuto

2
更新:バージョン4.6-9以降randomForest、最大53レベルのカテゴリカル予測子を処理できます。ニュース
ベン

Rのランダムフォレストはどのようにレベル数を決定しますか?レベルはカテゴリを意味すると思います。
-ajp

回答:


25

レベルの因子の分割は、実際には2 N2の可能な組み合わせの1つを選択するため、実際にはかなり合理的な制約です。したがって、25のようなNであっても、組み合わせのスペースは非常に大きいため、このような推論はあまり意味がありません。N2N2N

他のほとんどの実装では、因子を序数(つまり1からまでの整数)として単純に扱います。これは、この問題を解決する方法の1つです。実際、RFは多くの場合、これをいくつかの分割で任意のグループにスライスするのに十分賢明です。N

他のオプションは表現を変更することです-結果は州のエンティティに直接依存しないかもしれませんが、たとえば、面積、人口、一人当たりの松の木の数、または代わりに情報システムにプラグインできる他の属性です。

また、各状態は独立した無相関のエンティティであり、それ自体に対して個別のモデルが必要な場合もあります。

決定に基づいたクラスタリングは、おそらく悪い考えです。この方法では、決定から情報を属性に密輸しているため、多くの場合、過剰適合に終わります。


4
少し面倒ですが、簡単に移動できます。たとえば、レベルが33〜1024の場合、それぞれ<= 32レベルの2つの因子を作成します。
カエル

15

主な理由は、randomForestの実装方法です。Rからの実装は、元のBreimanの仕様から多くに従います。ここで注意すべき重要なことは、因子/カテゴリ変数の場合、分割基準はバイナリであり、左側にいくつかのラベル値があり、右側に残りのラベル値があることです。

つまり、2つのグループのグループ化ラベル値のすべての組み合わせを検索します。で表す場合01[0;2M1]

WekaとPythonの実装が機能する理由

weka実装は、デフォルトではCARTツリーを使用しません。カテゴリ計算の入力では、各レベル値に1つずつ、複数のノードに分割されるため、この計算上の問題のないC45ツリーを使用します。

Pythonのランダムフォレストの実装では、カテゴリ変数/因子変数を使用できません。これらの変数をダミー変数または数値変数にエンコードする必要があります。

M


2
どうもありがとう!カテゴリ値を処理するためのRの実装はPythonの実装より優れているという回答から得られますか(Max KuhnはRFのカテゴリ変数をグループ化すると、それらを弱めるよりもわずかに良い結果が得られることを覚えています)、または少なくともR Python異なる結果(精度など)が得られる可能性は非常に高いですか?あなたの経験から、モデリングするとき、(Rで)varをグループ化し、それらをダミー化してから2つのアプローチを比較するのは理にかなっていますか?
セルゲイブッシュマノフ

2
ダミーエンコーディングは機能しますが、すべてに対して1つのカテゴリのみを生成できます。エンコード後、変数は一度に1回テストされます。したがって、ツーリングを実装することは不可能です。この機能が役立つ場合、実質的に大きな違いはないと思います。ただし、変数の重要度を操作する際に注意が必要な可能性のある他の事項があります。いくつかの実装は、複数のレベルを持つカテゴリに偏っています。詳細については、カロリンシュトローブル論文を参照してください:statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdfを。Rには、このバイアスのない実装がいくつかあります。
ラパイオ

2

その1つの列を異なる方法で表現してみてください。同じデータをスパースデータフレームとして表すことができます。

最小実行可能コード。

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

元の列の各値が個別のダミー列になっていることに注意してください。

より広範なサンプルコード。

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

このコードは、実際にはエラーが発生しないことを示していますが、randomForestアルゴリズムが完了するまでに長い時間が必要になっていることに気付くでしょう。これはCPUの制約によるものであり、サンプリングによってこのタスクを削減することもできます。

詳細については、このブログ投稿をご覧ください。

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/


2番目のコードブロックは紛らわしく見えます。本文全体でdf_hardを使用していますが、最後の行で「first」と「second」をNULLに設定し、randomForestのデータとして「example」も使用しています私と、exampleとdf_hardの間に関係がないので。
Özgür

ヴィンセント、100以上の注文のレベルがある場合、私はそのような大きな問題に終わるとは思わないか。各列をランダムに入力として追加することを提案するか。
ハーディクグプタ

別の方法は、h2oでrandomforestの実装を使用することです。これにより、大規模なデータセットのサポートが向上します。「ランダムへの入力として各列を追加する」ビットがわかりません。
ビンセントウォーマーダム

0

代わりに、パッケージextraTreesを使用できます。極端にランダム化されたフォレストアルゴリズムは、ブレークポイント/スプリットを試行せず、スプリットの限られたランダムサブセットのみを試行します。


1
extraTreesには制限があります。つまり、入力は数値データ行列でなければなりませんか?
ハーディクグプタ

0

別のオプション:データのレベル数と観測値の数に応じて、いくつかのレベルをマージできます。制限を下回るだけでなく、観測数が少ないレベルが多数ある場合は、分散が減少する可能性があります。Hadleyforcats:fct_lumpはこれを行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.