多くのカテゴリ変数を使用して分類を改善する


37

私は200,000以上のサンプルとサンプルあたり約50の特徴を持つデータセットに取り組んでいます:10の連続変数と他の〜40はカテゴリ変数(国、言語、科学分野など)です。これらのカテゴリ変数には、たとえば150か国、50の言語、50の科学分野などがあります。

これまでの私のアプローチは次のとおりです。

  1. 多くの可能な値を持つカテゴリ変数ごとに、この値を取得する10000個を超えるサンプルを持つ変数のみを取得します。これにより、150ではなく5〜10のカテゴリに減少します。

  2. カテゴリカル変数ごとにダミー変数を作成します(10か国の場合、サンプルごとにサイズ10のバイナリベクトルを追加します)。

  3. このデータをランダムフォレスト分類器(パラメーターのクロス検証など)にフィードします。

現在、このアプローチでは、65%の精度しか得られず、さらに多くのことができるように感じています。特に、1)に満足していません。サンプルの数に応じて「最も関連性の低い値」を勝手に削除してはいけないように感じるからです。一方、RAMには、可能なすべての値を保持することで、データに500列* 200000行を追加する余裕がありません。

この多くのカテゴリ変数に対処するための提案はありますか?


2
あなたはまだ興味があるなら、あなたはチェックすることをお勧めします私の答えを上の次元削減私の答え階層的な分類
アレクサンドルブレフ

1
「各カテゴリーごとにダミー変数を作成する」と言うと、RではなくPythonを使用しているように聞こえますか?R randomforestは、カテゴリカルをネイティブに処理でき、結果としてメモリを削減できます。Rを試す
smci

回答:


20

1)ランダムフォレストはカテゴリ値をネイティブに処理できる必要があるため、これらの機能をすべてエンコードしてメモリをすべて使用する必要がないように、異なる実装を探してください。

2)高カーディナリティーのカテゴリー機能の問題は、それらに簡単にオーバーフィットすることです。十分なデータがあるため、これは問題ではありませんが、注意してください。

3)ブリーマンが提案した方法または人工的なコントラストのいずれかを使用して、ランダムフォレストベースの特徴選択を検討することをお勧めします。人工コントラスト法(ACE)は、特徴の重要性を、高濃度の問題のいくつかと戦うシャッフルされたバージョンの重要性と比較するため、興味深いものです。高度に相関する機能のグループを認識する機能選択方法を使用するため、より多くの機能がある場合に興味深い新しい論文「Module Guided Random Forests」があります。

4)別の場合に使用されるオプションは、アルゴリズムを微調整して、バッグ内ケースに分割をフィッティングした後、バッグ外ケースを使用して、時々オーバーフィットと戦うのに役立つ最終的な特徴選択を行うことです。

ここにはほぼ完全なace実装があり、ここでカテゴリ変数をネイティブに処理するメモリ効率/高速rf実装がより多くあります ... -evaloobオプションはオプション4をサポートしますベースの機能選択方法ですが、まだ完了していません。


4
これらの提案はすべて興味深いものです。ランダムフォレストはネイティブのカテゴリ変数を処理する必要があることに同意しますが、scikit-learnはそうではありません。私のデータであなたのコードを試し、何が起こるかを確認し、他の提案について見ていきます!
バートランドR 14

1
R実装を試してください。それを実行すると、1つのライナーです。データの読み取りは非常に簡単で、非常に高速でメモリ効率に優れた最新の並列実装があります:r-bloggers.com/…一方で。クラスのバランスが崩れていますか?rの実装では、バランスのとれたブートストラップサンプルsampsize = c(x、x)から各ツリーを成長させることができます。これにより、より良いバイナリ分類が作成されました。OOB混同マトリックスR出力を使用して、サイズをいじり、分類を微調整できます。
JEquihua

2
RのrandomForest実装では、最大32レベルのファクターを使用できます。scikit-learnの制限は緩和されており、最初にダミー変数を作成します(pandas.get_dummies関数を参照)。H2Oのランダムフォレストの実装は、私にとって非常にうまく機能しています(0xdata.com/docs/master/model/rfを参照)。
アレックスウールフォード

1
ランダムフォレストのより新しくより高速な実装があり、パッケージはレンジャーと呼ばれます。本当に素晴らしい。桁違いに速く、32レベルの制限はありません。
マーベル

6

カテゴリをダミー化する代わりに、それぞれに単一の数値変数を使用しないのはなぜですか?ランダムフォレストのコンテキストでは、それを行うことの結果についてよく疑問に思っていました(カテゴリデータに通常の意味を持たない場合が多いので、通常の意味を導入することは疑わしいことに同意するため)私が使用しているRFのscikit-learn実装では)、結果に違いが生じないことをよく観察しました(理由はわかりません)。


1
これは、n <= 3のカテゴリフィーチャの場合は問題ありません。これは、フィーチャをネイティブにカテゴリカルと見なすことで、同じ分割をすべて生成できるためです。nが大きい場合、カテゴリ分割と同等の分割セットを実現することができますが、アルゴリズムはそれらを効率的に見つけることができる場合とできない場合があります...アルゴリズムは分割を見つけることができます。それ以外の場合は素晴らしいので、誰かがカテゴリ変数のサポートをscikit-learn実装に追加する必要があります。
ライアンブレスラー14

カテゴリデータに序数を導入することは疑わしいと言ったとき、私はあなたに同意します。
バートランドR 14

4
私はsklearnメーリングリストでこの質問について長い議論をしました(その一部をここで読むことができます:mail-archive.com/scikit-learn-general@lists.sourceforge.net/…)。実装者の1人の意見は、十分に深いツリーでは、順序エンコードされたカテゴリ機能が(計算効率が高いことに加えて)合理的に機能する可能性があるというものでした。とにかく、あなたがそれを試してみたら、私はあなたの結果/結論について聞いてみたいと思います。これは私がぶつかる問題だからです。
チャウビン14

1
そのため、カテゴリ変数に対して単一の数値変数を保持しようとしましたが、実際には驚くほどうまく機能し、多数のバイナリエントリを追加するよりもはるかに優れています。また、ターゲットに対する平均wrtに従って値をソートしようとしました。 。そしてそれもうまく動作します
バートランドR 14

実際のところ、私は驚くことはありません。これは、いくつかの異なる設定で観察したものと一致していますが、賛成票の数から判断すると、これはかなり直感に反するアイデアです。
チャウビン14

5

さまざまな変数削減手法を検討する必要があると思います。それはそれほど影響力のない予測因子を取り除きます。

データの前処理について多くのことを読んできましたが、変数の数を減らすのに最適なソリューションです。

私の提案は次のとおりです。

  • 以下のために質的変数、カテゴリ「行方不明」に欠損値を置き換えます。データがランダムに欠落していない場合、バイアスが発生する可能性がありますが、少なくとも、すべての観測結果はそのままであり、欠落によって異なる動作が明らかになる可能性があります。
  • ゼロ分散予測変数またはゼロに近い分散予測変数を削除します(Yを効率的に分離できる不均衡なカテゴリのダミー変数を削除しないように注意してください。重要と思われる変数のグラフを作成します)。Rでは'nzv''caret'パッケージの関数を使用できます。これにより、データディメンションが大幅に削減されます。
  • 相関する予測因子を排除します。カテゴリ変数の存在下で構築するのにより適しているため、Kendallの相関行列を使用します。欠点は、すべての名目変数をカテゴリカル変数に変換する必要があることです。
  • ある特徴選択法( -あなたは...など、各クラスタの単一の代表、LASSO回帰を、選択したクラスタリング)、さらにその数を減らします。他の手順で変数を100未満に減らしたため、まだテストする機会がありませんでした。

また、RFの代わりにAdaBoostアルゴリズムを使用することをお勧めします。個人的には、私が行った研究により、これらの両方の方法で非常に類似したGini係数が得られました。AdaBoostの良い点は、Rで欠落している観測値を処理することです。したがって、このリストの最初のステップをスキップできます

少しでも役に立てば幸いです。がんばろう


4

混合効果モデルを検討することもできます。これらは、高カーディナリティのカテゴリデータでのパフォーマンスのために社会科学で人気があり、勾配ブーストツリー、ランダムフォレスト、エラスティックネット正則化ロジスティック回帰などの一般的な機械学習アプローチを上回る優れた予測モデルを作成するために使用しました。最もよく知られている実装は、Rのlme4パッケージです。分類に使用する関数はglmerであり、混合効果ロジスティック回帰を実装しています。データセットへのスケーリングに問題がある可能性がありますが、15の機能を備えた80k行をそれほど困難なく実行しました。


2
  1. 「各カテゴリーごとにダミー変数を作成する」と言うと、RではなくPythonを使用しているように聞こえますか?R randomforestは、カテゴリカルをネイティブに処理でき、結果としてメモリを削減できます。Rをお試しください

  2. 次に、カテゴリレベルを手動で整理/マージする必要はありません。これは大きな苦痛のように聞こえます。そして、たとえあなたがそうしたとしても、あなたは最も人口の多いカテゴリーが最も予測的であることを保証されません。パラメーターnodesizeでランダムフォレストの複雑さを制御します。大きなnodesizeから始めて、徐々に小さくします(これはハイパーパラメーター検索です)。

  3. 変数の選択が役立ちます。@lorelaiは良い提案をします。役に立たない(重要度の低い、または相関の高い)機能を排除してください。ツリーの構築は、フィーチャの数に対して2次であるため、3番目を削除したとしても、それは利益をもたらします。


0

あなたは見なければならないH2O.aiのパッケージ。カテゴリ変数は、エンコードを行わずにそのまま使用できます(変数が要因であることを確認してください)。

モデルの構築後に変数の重要度を確認できるため、特にGradient Boosted Machine(GBM)の実装が気に入っています。GBMには、オーバーフィットに強いという優れた機能もあります。

他のモデルを探索する場合は、GLM、ランダムフォレスト、単純ベイズ、ディープラーニングなどがあります。

参照:http : //docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html

また、インストールが簡単(Windows、Linux、Mac)で、R、Python、Java、およびScalaを使用したAPIを使用して簡単に実行できます。

複数のコアを使用して速度を上げることができます。

近い将来、GPUをサポートする予定です。

また、オープンソースで無料です(エンタープライズサポートがあります)。

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