カテゴリ変数のエンコーディングのまとめ

目次

1.数字変数のエンコーディング
1.1 OrdinalEncoder
1.2 CountEncoder
2. ダミー値エンコーディング
2.1 OneHotEncoder
2.2 SumEncoder
2.3 BinaryEncoder
2.4 BaseNEncoder
2.5 HashingEncoder
3. 別のレベルの比較エンコーディング
3.1 HelmertEncoder
3.2 BackwardDifferenceEncoder
3.3 PolynomialEncoder
4. ターゲットありエンコーダー
4.1 TargetEncoder
4.2 LeaveOneOutEncoder
4.3 MEstimateEncoder
4.4 CatBoostEncoder
4.5 GLMMEncoder
4.6 JamesSteinEncoder
4.7 WOEEncoder

 

ライブラリのインストール

!pip install category_encoders

 

ライブラリのインポート

import category_encoders as ce

 

1.数字変数のエンコーディング

1.1 OrdinalEncoder

サンプルデータ作成

import pandas as pd

 

df = pd.DataFrame({‘color’:  [‘Red’, ‘Green’,’Red’, ‘Red’, ‘Blue’, ‘Blue’]})

print(df)

color

0    Red

1  Green

2    Red

3    Red

4   Blue

5   Blue

 

OrdinalEncoderは、整数の単一列を使用してクラスを表します。

ce_ord = ce.OrdinalEncoder(cols = [‘color’])

encoded_df = ce_ord.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  color

0    Red      1

1  Green      2

2    Red      1

3    Red      1

4   Blue      3

5   Blue      3

 

1.2 CountEncoder

特定のカテゴリ機能について、グループの名前をグループ数に置き換えます。

ce_ord = ce.CountEncoder(cols = [‘color’])

encoded_df = ce_ord.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  color

0    Red      3

1  Green      1

2    Red      3

3    Red      3

4   Blue      2

5   Blue      2

 

2. ダミー値エンコーディング

2.1 OneHotEncoder

OneHotEncoder(またはダミー)コーディングは、カテゴリごとに0か1の値を生成していきます。

Encoder = ce.OneHotEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  color_1  color_2  color_3

0    Red        1        0        0

1  Green        0        1        0

2    Red        1        0        0

3    Red        1        0        0

4   Blue        0        0        1

5   Blue        0        0        1

 

2.2 SumEncoder

1つの水準を全て-1で表現し、残りはOne-Hotで表現します。

Encoder = ce.SumEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  intercept  color_0  color_1

0    Red          1      1.0      0.0

1  Green          1      0.0      1.0

2    Red          1      1.0      0.0

3    Red          1      1.0      0.0

4   Blue          1     -1.0     -1.0

5   Blue          1     -1.0     -1.0

 

2.3 BinaryEncoder

カテゴリ変数のバイナリエンコーディング。Onehotencoderに似ていますが、カテゴリを

文字列として格納します。

Encoder = ce.BinaryEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  color_0  color_1  color_2

0    Red        0        0        1

1  Green        0        1        0

2    Red        0        0        1

3    Red        0        0        1

4   Blue        0        1        1

5   Blue        0        1        1

 

2.4 BaseNEncoder

BaseNEncoderはbaseオプションに指定する値によって、One-Hot / Binary / Ordinal Encodingを使い分けることができます。

1のベースはワンホットエンコーディング(実際にはベース1ではありませんが、便利です)と同等であり、2のベースはバイナリエンコーディングと同等です。

Encoder = ce.BaseNEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  color_0  color_1  color_2

0    Red        0        0        1

1  Green        0        1        0

2    Red        0        0        1

3    Red        0        0        1

4   Blue        0        1        1

5   Blue        0        1        1

 

2.5 HashingEncoder

構成可能な次元/精度を備えた多変量ハッシュの実装です。このエンコーダーの利点は、観察されたカテゴリーの辞書を維持しないことです。 その結果、エンコーダーのサイズが大きくなることはなく、設計によるデータスコアリング中に新しい値を受け入れます。

Encoder = ce.HashingEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  col_0  col_1  col_2  col_3  col_4  col_5  col_6  col_7

0    Red      0      0      0      0      0      0      0      1

1  Green      0      1      0      0      0      0      0      0

2    Red      0      0      0      0      0      0      0      1

3    Red      0      0      0      0      0      0      0      1

4   Blue      0      1      0      0      0      0      0      0

5   Blue      0      1      0      0      0      0      0      0

 

3. 別のレベルの比較エンコーディング

3.1 HelmertEncoder

カテゴリ特徴をエンコードするためのヘルマート対比コーディングです。

Encoder = ce.HelmertEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  intercept  color_0  color_1

0    Red          1     -1.0     -1.0

1  Green          1      1.0     -1.0

2    Red          1     -1.0     -1.0

3    Red          1     -1.0     -1.0

4   Blue          1      0.0      2.0

5   Blue          1      0.0      2.0

 

3.2 BackwardDifferenceEncoder

カテゴリ変数をエンコードするための後方差分コントラストコーディングです。

Encoder = ce.BackwardDifferenceEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  intercept   color_0   color_1

0    Red          1 -0.666667 -0.333333

1  Green          1  0.333333 -0.333333

2    Red          1 -0.666667 -0.333333

3    Red          1 -0.666667 -0.333333

4   Blue          1  0.333333  0.666667

5   Blue          1  0.333333  0.666667

 

3.3 PolynomialEncoder

カテゴリ特徴の符号化のための多項式対比符号化します。

Encoder = ce.PolynomialEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df)

print(pd.concat([df, encoded_df], axis=1))

color  intercept       color_0   color_1

0    Red          1 -7.071068e-01  0.408248

1  Green          1 -4.433780e-17 -0.816497

2    Red          1 -7.071068e-01  0.408248

3    Red          1 -7.071068e-01  0.408248

4   Blue          1  7.071068e-01  0.408248

5   Blue          1  7.071068e-01  0.408248

 

4. ターゲットありエンコーダー

4.1 TargetEncoder

カテゴリターゲットの場合:特徴は、特定のカテゴリ値が与えられた場合のターゲットの事後確率と、すべてのトレーニングデータにわたるターゲットの事前確率の割合に置き換えられます。

連続ターゲットの場合:機能は、特定のカテゴリ値が与えられた場合のターゲットの期待値と、すべてのトレーニングデータにわたるターゲットの期待値の値に置き換えられます。

データ作成

df2 = pd.DataFrame({‘color’:  [‘Red’, ‘Green’,’Red’, ‘Red’, ‘Blue’, ‘Blue’],

‘value’:  [1, 2, 2, 1, 3, 1]

})

print(df2)

 

Encoder = ce.TargetEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df2[‘color’], df2[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

color  value     color

0    Red      1  1.373068

1  Green      2  1.666667

2    Red      2  1.373068

3    Red      1  1.373068

4   Blue      3  1.910353

5   Blue      1  1.910353

 

4.2 LeaveOneOutEncoder

これはターゲットエンコーディングと非常に似ていますが、外れ値の影響を減らすためにレベルの平均ターゲットを計算するときに現在の行のターゲットを除外します。

Encoder = ce.LeaveOneOutEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df2[‘color’], df2[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

color  value     color

0    Red      1  1.500000

1  Green      2  1.666667

2    Red      2  1.000000

3    Red      1  1.500000

4   Blue      3  1.000000

5   Blue      1  3.000000

 

4.3 MEstimateEncoder

これは、ターゲットエンコーダーの簡略化されたバージョンであり、m確率推定や、既知の発生率による追加平滑化などの名前が付けられています。 ターゲットエンコーダーと比較すると、m確率推定には1つの調整可能なパラメーター(m)しかありませんが、ターゲットエンコーダーには2つの調整可能なパラメーター(min_samples_leafとsmoothing)があります。

Encoder = ce.MEstimateEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df2[‘color’], df2[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

Encoder = ce.MEstimateEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df2[‘color’], df2[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

 

4.4 CatBoostEncoder

これは、leave-one-outエンコーディングと非常に似ていますが、値を「オンザフライ」で計算します。 したがって、値はトレーニングフェーズ中に自然に変化し、ランダムノイズを追加する必要はありません。

Encoder = ce.CatBoostEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df2[‘color’], df2[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

color  value     color

0    Red      1  1.666667

1  Green      2  1.666667

2    Red      2  1.333333

3    Red      1  1.555556

4   Blue      3  1.666667

5   Blue      1  2.333333

 

4.5 GLMMEncoder

これは、TargetEncoderまたはMEstimateEncoderに似た教師ありエンコーダですが、いくつかの利点があります。

1)技術の背後にある確かな統計理論。 混合効果モデルは、統計の成熟した分野です。

2)調整するハイパーパラメータはありません。 収縮量は、推定プロセスによって自動的に決定されます。

3)この手法は、連続ターゲットと二項ターゲットの両方に適用できます。

Encoder = ce.GLMMEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df2[‘color’], df2[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

color  value     color

0    Red      1 -0.004782

1  Green      2  0.001599

2    Red      2 -0.004782

3    Red      1 -0.004782

4   Blue      3  0.003183

5   Blue      1  0.003183

 

4.6 JamesSteinEncoder

特徴値iの場合、James-Stein推定量は次の加重平均を返します。

観測された特徴値の平均目標値iです。

平均目標値(機能値に関係なく)

Encoder = ce.JamesSteinEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df2[‘color’], df2[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

color  value     color

0    Red      1  1.333333

1  Green      2  2.000000

2    Red      2  1.333333

3    Red      1  1.333333

4   Blue      3  2.000000

5   Blue      1  2.000000

 

4.7 WOEEncoder

カテゴリ機能のエビデンスコーディングの重みです。

サポートされるターゲットは二項でなければなりません。

 

サンプルデータを作成します。

df3 = pd.DataFrame({‘color’:  [‘Red’, ‘Green’,’Red’, ‘Red’, ‘Blue’, ‘Blue’],

‘value’:  [1, 0, 1, 1, 0, 1]

})

print(df3)

color  value

0    Red      1

1  Green      0

2    Red      1

3    Red      1

4   Blue      0

5   Blue      1

 

Encoder = ce.WOEEncoder(cols=[‘color’])

encoded_df = Encoder.fit_transform(df3[‘color’], df3[‘value’])

print(pd.concat([df2, encoded_df], axis=1))

color  value     color

0    Red      1  0.980829

1  Green      2  0.000000

2    Red      2  0.980829

3    Red      1  0.980829

4   Blue      3 -0.405465

5   Blue      1 -0.405465

 

担当者:HM

香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当

理化学研究所にて研究員を拝命中 応用数理学会所属