カテゴリデータの処理
Coding
code: Python
import pandas as pd
# サンプルデータを生成(Tシャツの色・サイズ・価格・クラスラベル)
df = pd.DataFrame([
'green', 'M', '10.1', 'class1',
'red', 'L', 13.5, 'class2',
'blue', 'XL', 15.3, 'class1'])
# 列名を設定
df.columns = 'color', 'size', 'price', 'classlabel'
df
----------------------------------------------------------------------
color size price classlabel
0 green M 10.1 class1
1 red L 13.5 class2
2 blue XL 15.3 class1
----------------------------------------------------------------------
順序特徴量のマッピング
code: Python
# Tシャツのサイズと整数を対応させるディクショナリを生成
size_mapping = {'XL': 3, 'L': 2, 'M': 1}
# Tシャツのサイズを整数に変換
df'size' = df'size'.map(size_mapping)
df
----------------------------------------------------------------------
color size price classlabel
0 green 1 10.1 class1
1 red 2 13.5 class2
2 blue 3 15.3 class1
----------------------------------------------------------------------
code: Python
# 元に戻す
inv_size_mapping = {v: k for k, v in size_mapping.items()}
df'size' = df'size'.map(inv_size_mapping)
df
----------------------------------------------------------------------
color size price classlabel
0 green M 10.1 class1
1 red L 13.5 class2
2 blue XL 15.3 class1
----------------------------------------------------------------------
クラスラベルのエンコーディング
code: Python
import numpy as np
# クラスラベル(順序関係ない)と整数を対応させるディクショナリを生成
class_mapping = {label: idx for idx, label in enumerate(np.unique(df'classlabel'))}
class_mapping
# クラスラベルを整数に変換
df'classlabel' = df'classlabel'.map(class_mapping)
df
----------------------------------------------------------------------
{'class1': 0, 'class2': 1}
color size price classlabel
0 green M 10.1 0
1 red L 13.5 1
2 blue XL 15.3 0
----------------------------------------------------------------------
code: Python
# 元に戻す
inv_class_mapping = {v: k for k, v in class_mapping.items()}
df'classlabel' = df'classlabel'.map(inv_class_mapping)
df
----------------------------------------------------------------------
color size price classlabel
0 green M 10.1 class1
1 red L 13.5 class2
2 blue XL 15.3 class1
----------------------------------------------------------------------
code: Python
# 以下のようにもできる
from sklearn.preprocessing import LabelEncoder
# ラベルエンコーダのインスタンスを生成
class_le = LabelEncoder()
# クラスラベルから整数に変換
y = class_le.fit_transform(df'classlabel'.values)
y
# クラスラベルを文字列に直す
class_le.inverse_transform(y)
----------------------------------------------------------------------
array(0, 1, 0, dtype=int64)
array('class1', 'class2', 'class1', dtype=object)
----------------------------------------------------------------------
カテゴリ特徴量での One-Hot エンコーディング
色の値には順序はありませんが、例えば、blueが0でredが1のようにしてしまうと、学習アルゴリズムはredがblueより大きいと判断してしまします。この問題を解決する一般的な方法がOne-Hotエンコーディングです。
code: Python
pd.get_dummies(df'price', 'color', 'size')
----------------------------------------------------------------------------------------------------
price_13.5 price_15.3 price_10.1 color_blue color_green color_red size_L size_M size_XL
0 0 0 1 0 1 0 0 1 0
1 1 0 0 0 0 1 1 0 0
2 0 1 0 1 0 0 0 0 1
----------------------------------------------------------------------------------------------------