ここでは名義特徴量である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エンコーディング
することで、機械学習アルゴリズムが利用しやすい形にしましょう。
コメント