データ解析 カテゴリ変数

2022/10/13,

機械学習でデータを突っ込むとき、「男」「女」や職業の「営業」「プログラマー」「作家」「投資家」「事務」などのデータはそのまま突っ込むことができない。

カテゴリを表すので、カテゴリ変数と呼ばれる。

そのままだと学習に問題があるのでデータの下処理を行なう。

カテゴリ変数の手法

One hot Encoding (ワンホットエンコーディング)

ダミー変数と呼ばれる。カテゴリに含まれているかどうかを0,1で表す。カテゴリ数が多いと次元の爆発が起こるので、カテゴリ数が多い場合は他の手法を使う。

職業
営業
事務
プログラマー
作家
投資家
営業 事務 プログラマー 作家
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Label Encoding (ラベルエンコーディング)

カテゴリを数値に変換する。

職業 ラベル
営業 0
事務 1
プログラマー 2
作家 3
投資家 4

n個のカテゴリがある場合、n-1個のラベルを割り当てる。数字に意味がないので、One hot Encodingの方が良い。しかしながら、ラベルエンコーディングの方がメモリを節約できる。カテゴリが多い場合はラベルエンコーディングを使う。次元の呪いを回避するために、ラベルエンコーディングを使う。向かない学習モデルはロジスティック回帰や決定木の分岐など。

Pythonでの実装

One hot Encoding

pandasのget_dummiesを使う。

import pandas as pd

df = pd.DataFrame({
    '個人番号': [1, 2, 3, 4, 5],
    '職業': ['営業', '事務', 'プログラマー', '作家', '投資家']
})

df = pd.get_dummies(df, columns=['職業'])
print(df)

出力

    個人番号  職業_事務  職業_作家  職業_営業  職業_プログラマー  職業_投資家
0        1        0        0        1                 0          0
1        2        1        0        0                 0          0
2        3        0        0        0                 1          0
3        4        0        1        0                 0          0
4        5        0        0        0                 0          1

sklearnのOneHotEncoderを使う。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

df = pd.DataFrame({
    '個人番号': [1, 2, 3, 4, 5],
    '職業': ['営業', '事務', 'プログラマー', '作家', '投資家']
})

enc = OneHotEncoder(handle_unknown='ignore', sparse=False)
df_one_hot = pd.DataFrame(enc.fit_transform(df[['職業']]))
df_one_hot.columns = enc.get_feature_names(['職業'])
df = pd.concat([df, df_one_hot], axis=1)
df = df.drop('職業', axis=1)
print(df)

出力

    個人番号  職業_事務  職業_作家  職業_営業  職業_プログラマー  職業_投資家
0        1        0        0        1                 0          0
1        2        1        0        0                 0          0
2        3        0        0        0                 1          0
3        4        0        1        0                 0          0
4        5        0        0        0                 0          1

Label Encoding

sklearnのLabelEncoderを使う。

import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame({
    '個人番号': [1, 2, 3, 4, 5],
    '職業': ['営業', '事務', 'プログラマー', '作家', '投資家']
})

le = LabelEncoder()
df['職業'] = le.fit_transform(df['職業'])
print(df)

まとめ

カテゴリ変数を扱うときは、One hot EncodingやLabel Encodingを使い、数値に変換する。


この記事はOuvill(おーびる)が書きました。IT関連の記事執筆やサイト作成や、ウェブアプリケーション開発の業務委託などのご依頼を賜っております。

ご要件がある方はコンタクトフォームからご連絡ください。

@Ouvill