順序がないもの:one-hotエンコーディング

ここでは名義特徴量であるcolorも整数値にエンコーディングすることを考えます。
もし、下記のようにエンコーディングしてしまうと、本来順序がないデータにも関わらず、「red > green > blue」のような大小の関係が成り立ってしまいます。

  • blue -> 0
  • green -> 1
  • red -> 2

このような状態のデータを学習アルゴリズムに入力すると、本来は順序関係がないにも関わらず誤った順序関係を想定してしまうことがあります。

このような問題を避けるためにone-hotエンコーディングという手法を用います。

colorに存在する4種類の色をそれぞれ列として表現して該当の色の場合には1を、それ以外は全て0で表現します。

まずはinput/data2.csvを読み込んでみましょう。データは前回の課題と一緒です。

  • OneHotEncoderオブジェクトを生成します
  • fit_transformメソッドを使ってエンコーディングします
  • エンコーディングした結果を元にDataFrameを生成します。
import pandas as pd
df = pd.read_csv('./input/data2.csv')

# 全データの表示
df
from sklearn.preprocessing import OneHotEncoder

# OneHotEncoder で  それぞれの色が列になり、該当の色に1がセットされる
encoder = OneHotEncoder()
result = encoder.fit_transform(df[["color"]])

# one-hotエンコーディングされたデータをDataFrameに変換
colors_df = pd.DataFrame(result.toarray(),
                         columns=sorted(list(set(df["color"]))))
colors_df

変換したい列だけのDataFrameをOneHotEncoderに渡すことで求める結果を得られます。

encoder = OneHotEncoder()
result = encoder.fit_transform(df[["color"]])

ここでは、resultをDataFrameに変換して、確認しやすくしています。

colors_df = pd.DataFrame(result.toarray(),
                         columns=sorted(list(set(df["color"]))))

get_dummies関数を用いた方法

  • get_dummies関数を利用する
  • 指定されたcolor列に対してone-hotエンコーディングされた結果が取得できる
  • 取得した結果を元のDataFrameと結合する。
import pandas as pd
df = pd.read_csv('./input/data2.csv')

# 全データの表示
df
# one-hotエンコーディングされたDataFrameを取得
colors_df = pd.get_dummies(df['color'])

# 元のDataFrameと、変換されたDataFrameを結合
df = pd.merge(df, colors_df, left_index=True, right_index=True, how='outer')
df

pandasのget_dummies関数を利用することでもone-hotエンコーディングできることがわかりました。

名義特徴量を扱う時は、one-hotエンコーディングすることで、機械学習アルゴリズムが利用しやすい形にしましょう。

コメント

タイトルとURLをコピーしました