web-dev-qa-db-ja.com

XGBoostカテゴリー変数:ダミー化とエンコード

XGBoostを使用する場合、カテゴリ変数を数値に変換する必要があります。

以下の方法間でパフォーマンス/評価指標に違いはありますか?

  1. カテゴリ変数のダミー化
  2. からのカテゴリ変数のエンコード(a、b、c)から(1,2,3)

また:

たとえばlabelencoderを使用して方法2に進まない理由はありますか?

29
ishido

xgboostは数値列のみを扱います。

機能がある場合[a,b,b,c]これは、カテゴリー変数を記述します(つまり、数値的関係なし

LabelEncoder を使用すると、次のようになります。

array([0, 1, 1, 2])

Xgboostは、この機能を数値の関係があると誤って解釈します!これは各文字列をマッピングするだけです('a','b','c')整数に、それ以上。

適切な方法

OneHotEncoder を使用すると、最終的にこれに到達します。

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

これは、xgboostまたはその他の機械学習ツールのカテゴリ変数の適切な表現です。

Pandas get_dummies は、ダミー変数を作成するための便利なツールです(私の意見では使いやすい)。

上記の質問の方法#2はデータを適切に表しません

41
T. Scharf

この質問に答えるのは、XGBoostの観点だけでなく、カテゴリデータを扱う問題についても答えたいと思います。 「ダミー化」は非常にまばらな設定を作成しますが、特にレベルが異なる複数のカテゴリ列がある場合、数学表現はレベル間の関係を反映しないため、ラベルエンコーディングはしばしば偏ります。

Binary Classification問題の場合、従来のクレジットスコアリングモデルで非常に活用されている天才でありながら未踏のアプローチは、Weightを使用することですエビデンスのカテゴリレベルを置き換えます。基本的に、すべてのカテゴリレベルは、商品の割合/不良の割合に置き換えられます。

それについてもっと読むことができます こちら

Pythonライブラリ ここ

この方法を使用すると、1つの列の下に「レベル」をキャプチャし、ダミー化またはエンコードによって発生するスパースまたはバイアスの誘導を回避できます。

お役に立てれば !

4
mamafoku