【pandas】ダミー変数化を使って質的→量的データに変換する方法
機械学習の前処理として、データの特徴を掴むことは必須です。
今回は、特徴量生成の際に必須の「ダミー変数化」についてご紹介します。
ダミー変数化とは
ダミー変数化とは質的データを量的データに変換することです。
データの種類を大きく2つに分けると
- 量的データ(数値)—例:145, 4000, 355
- 質的データ(カテゴリ変数)—例:朝, 昼, 夜
に分けられます。
機械学習を行う際には、質的データはそのままでは使用できません。
なぜなら、モデル構築の際にデータを使用できないからです。
計算を行うためには数値化してあげる必要があります。
One-Hot表現とは
ダミー変数化する手法として「One-Hot表現」があります。
One-Hot表現とは、1つのカラムを複数カラムに分割し、0と1で表現する手法です。
該当する項目には1を、それ以外には0を埋めます。
時間帯 | |
---|---|
0 | 朝 |
1 | 昼 |
2 | 夜 |
3 | 朝 |
4 | 夜 |
上記のようなカテゴリがあるとして、ダミー変数化すると
夜 | 昼 | 朝 | |
---|---|---|---|
0 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
2 | 1 | 0 | 0 |
3 | 0 | 0 | 1 |
4 | 1 | 0 | 0 |
このようになります。
なぜダミー変数化が必要なのか
わざわざ面倒なダミー変数化をなぜする必要があるのでしょうか。
それは数値に意味を持たせずにカテゴリとして表現する必要があるからです。
例えば、朝・昼・夜の項目を1,2,3とラベル付けしてみます。
時間帯 | No | |
---|---|---|
0 | 朝 | 1 |
1 | 昼 | 2 |
2 | 夜 | 3 |
3 | 朝 | 1 |
4 | 夜 | 3 |
朝が1、夜が3となりました。
しかし、データを持たせるという事は朝より夜のほうが大きいという大小関係を持ってしまうことになります。
カテゴリに大小関係など無いのにコンピュータにとっては意味のある数字となってしまうのです。
これを防ぐ手法として、ダミー変数化が使われます。
ダミー変数化する方法—pd.get_dummies()
pd.get_dummies()
関数を使います。DataFrameやSeriesを引数とします。
import pandas as pd
from pandas import DataFrame
data = {
'日付': [1,5,7,23,25],
'迷子': [0,1,1,0,1],
'時間帯':['朝','昼','夜','朝','夜']
}
df2 = pd.DataFrame(data=data)
df2
日付 | 迷子 | 時間帯 | |
---|---|---|---|
0 | 1 | 0 | 朝 |
1 | 5 | 1 | 昼 |
2 | 7 | 1 | 夜 |
3 | 23 | 0 | 朝 |
4 | 25 | 1 | 夜 |
上記データフレームを作成しました。pd.get_dummies()
関数を使ってみます。
df_dummies = pd.get_dummies(df2)
df_dummies
日付 | 迷子 | 時間帯_夜 | 時間帯_昼 | 時間帯_朝 | |
---|---|---|---|---|---|
0 | 1 | 0 | 0 | 0 | 1 |
1 | 5 | 1 | 0 | 1 | 0 |
2 | 7 | 1 | 1 | 0 | 0 |
3 | 23 | 0 | 0 | 0 | 1 |
4 | 25 | 1 | 1 | 0 | 0 |
時間帯の列が3つに分けられ、0と1で表現されています。
日付と迷子はint型ですのでダミー変数化はされていません。
ダミー変数化されるのは数値以外の型のみになります。(引数を指定しない場合)
>>> df2.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 時間帯 5 non-null object 1 No 5 non-null int64 dtypes: int64(1), object(1) memory usage: 208.0+ bytes
最初のカテゴリを除外する—drop_first=True
n
個のカテゴリを表現する場合、実際にはn-1
個のカテゴリ変数で表現できます。
最初のカテゴリを除外するには引数としてdrop_first=True
を指定します。
df_dummies2 = pd.get_dummies(df2, drop_first=True)
df_dummies2
日付 | 迷子 | 時間帯_昼 | 時間帯_朝 | |
---|---|---|---|---|
0 | 1 | 0 | 0 | 1 |
1 | 5 | 1 | 1 | 0 |
2 | 7 | 1 | 0 | 0 |
3 | 23 | 0 | 0 | 1 |
4 | 25 | 1 | 0 | 0 |
時間帯_夜が無くなり、2つのカテゴリで表現されています。
参考
pandas公式ドキュメント:pandas.get_dummies
機械学習・データ処理を学ぶのにおすすめの教材
じっくり書籍で学習するなら!
コメント