ディシジョンツリーのカテゴリ機能をコーディングするためのベストプラクティスは?


13

線形回帰のカテゴリカル特徴をコーディングする場合、ルールがあります。ダミーの数は、レベルの総数よりも1少なくする必要があります(共線性を回避するため)。

ディシジョンツリーにも同様のルールがありますか(バグ、ブースト)?Pythonの標準的な方法はnレベルをnダミー(sklearns OneHotEncoderまたはPandas pd.get_dummies)に拡張するように思われるため、これを私は質問します。

ディシジョンツリーのカテゴリ機能をコーディングするためのベストプラクティスとして何を提案しますか?

回答:


12

線形回帰とは異なり、完全な共線性について心配する必要がないためn、とは対照的にn-1、レベルを設定できることを理解しているようです。

(これはRの観点から来ていますが、Pythonでも同じだと思います。)それは、1)使用しているパッケージ、2)持っている因子レベルの数など、いくつかの要因によって異なります。

1)RのrandomForestパッケージを使用している場合、33未満の因子レベルがあれば、必要に応じてそれらを1つの機能に残すことができます。これは、Rのランダムフォレスト実装では、分割の片側にある因子レベルと反対側にある因子レベルを確認するためです(たとえば、レベルの5つが左側にグループ化され、7つがグループ化される可能性があります)一緒に右側)。カテゴリ機能をnダミーに分割すると、アルゴリズムはこのオプションを自由に使用できなくなります。

明らかに、使用している特定のパッケージがカテゴリカル機能を処理できない場合は、nダミー変数を作成するだけで済みます。

2)上記で触れたように、Rのランダムフォレストの実装では32の因子レベルしか処理できません。それ以上の場合は、因子をより小さなサブセットに分割するか、各レベルにダミー変数を作成する必要があります。


1
ありがとう!私はあなたを正しく理解していますか?Rでモデリングしている場合を除き、カテゴリカル機能はrandomForest自動的にコード化されますが、nコリニアリティはRFの問題ではないので、ダミーを使用する必要がありますか?
Sergey Bushmanov

3
32レベルを超えるバイナリエンコードされたカテゴリがあると、ツリー内の動作が若干異なります。RFは、多くのレベルを持つ因子の単一の列を選択するのではなく、それらのバイナリ列から選択するだけだからです。この微妙な違いは、バイナリ列での分割は、ファクター列での分割に比べて情報量が少ないことを意味します。これは、(1 / {2,3}、{2,1} / 3に対して1つの選択肢(0/1)しかないためです。 )など
Sycoraxは、

@ user777 32を超える変数があっても問題ありません。これは、Pythonに「グループ化された」カテゴリ変数がないことの問題ですsklearn。実際には、「ダミー化された」変数は「グループ化された」カテゴリ変数よりもパフォーマンスが悪いという証拠があります(実務経験、研究など)[R]
セルゲイブッシュマノフ

1
理論的には、モデルの柔軟性が低下するため、グループ化されていないグループのパフォーマンスはやや低下することが予想されます。グループ化されたケースでは、その機能をグループ化されていないものとして扱う方が本当に優れている場合、モデルはそれを実行できます(一方のグループを一方に配置し、残りのすべてを他方に配置することにより)。ただし、実際には、大きな違いがある場合は特に驚かされます(特にRFの場合、非常に多くの木を作成しています)
Tchotchke

2
前述のように、多くの因子レベル(> 15)の機能を使用したrandomForest実装は遅いが、モデルのパフォーマンスが平凡であることがわかります。可能な分割の数が非常に多いと、集合内の木の意図した非相関が減少すると思います。extraTreesとRboristは、各ノードでカテゴリカル分割のサブサンプルのみを試行します。それは無相関化と確かにスピードアップに役立ちます。したがって、「randomForestはすべての分割を試行する」と「ダミー変数は1対残りの分割のみを試行する」の間のさまざまなソリューションが可能です。また、多くのレベルのより少ないレベルへの異なるクラスタリングが役立つ場合があります。
Soren Havelund Welling 2015

4

カテゴリー変数を処理するには、ターゲット/インパクトエンコーディングと呼ばれる別のアプローチがあります。

このスキームのアイデアは、値がカテゴリを共有するすべての行のターゲット変数の平均である単一のfloat列を使用して機能をエンコードすることです。これは、フィーチャ内に順序関係を課し(つまり、カテゴリの右側の値は左側の値よりも平均応答が高いため)、ツリーベースのモデルに特に役立ち、予測空間を分割しやすくなります。

これは主題の良い説明です:https :
//towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

そして、これは最初にエンコーディングを提案した論文へのリンクです:http : //helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

カウントの少ないカテゴリで平均を推定しないようにするための詳細がいくつかあります。また、このエンコーディングによって導入されるバイアスの解決策を提案する別のモデル、CatBoostもありますが、私の経験では、これは高濃度のカテゴリ変数をエンコードするためのシンプルで非常に便利な方法です。 。

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