Hot Encoder
Hot Encoderとは
特徴量(行列X、多分類のときにはyも)をOne Hot Vectorつまり1つの成分が1で残りの成分が0となるような列ベクトルの集合に変換する機能(classだったり、methodだったり)
pythonとそのLibraryではいろいろ用意されている。
- OneHotEncoder
- get_dummies
- label_binirize
列ベクトルにて表現されている特徴量がカテゴリーの時(数値でない場合)に、特徴を0 or 1で列ごとに1つずつの特徴を表すように変換。そうしないと意味のない数値差(例えばasciiコードの数値差等)が学習データとして採用されてしまう。
カテゴリーの数だけ列を増やすので計算負荷がかかる。
Dataの準備
配管工のおじさんが大好きなキノコのデータを例として準備する
(画像を貼りたいが危険なのでガマン)
Column Nameの格納の仕方が汚かったために思わぬところで前処理の実践をすることに。。。
#UCIのデータベースからキノコデータをダウンロード url='https://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.data' data = requests.get(url, verify=False) df = pd.read_csv(io.StringIO(data.content.decode('utf-8')),header=None) #Column Nameを取得 url2='https://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.names' name_data = requests.get(url2, verify=False) name_data= pd.read_csv(io.StringIO(name_data.content.decode('utf-8')),sep='\n',engine='python',error_bad_lines=False) name_data = name_data.iloc[79:112,0].map(lambda x: str(x).strip()) name_data = name_data[name_data.map(lambda x: x[0].isnumeric())==True] name_data = name_data.map(lambda x: x.split(':')[0].split('.')[1].strip()) name_data[0] = 'classes' name_data=name_data.sort_index().reset_index(drop=True) #データに付加 df.columns=name_data
OneHotEncoder
Class
注意点として、nanをうまく扱えないので事前に処理が必要
変数をいい具合に全体から判断して勝手に詰めてくれる
Structure
sklearn.preprocessing.OneHotEncoder(*, categories='auto', drop=None, sparse=True, dtype=<class 'numpy.float64'>, handle_unknown='error')
主なParameters
Parameters | Description |
categories | defaultはautoで列の中からカテゴリを自動で作ってくれる。自分で指定もできる。 |
sparse | True: array, メモリを食う False: Sparse matrix(疎行列) |
Sample
from sklearn.preprocessing import OneHotEncoder henc= OneHotEncoder(sparse=False) hotMushroom=henc.fit_transform(df[['gill-color', 'gill-attachment', 'odor', 'cap-color']]) print(hotMushroom)
get_dummies
nanを勝手に処理してくれる
Structure
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
主なParameters
Parameters | Description |
data | One-Hotにしたいデータを入れる 統計ではdummy |
dummy_na | nanをdummyデータとして処理するか |
sparse | True: array, メモリを食う False: Sparse matrix(疎行列) |
drop_first | カテゴリー数がk個あった時、k-1個のダミー変数を作成する 統計の自由度の観点から |
Sample
import pandas as pd hotMushroom=pd.get_dummies(df[['gill-color', 'gill-attachment', 'odor', 'cap-color']],sparse=False) hotMushroom.head()
label_binarize
Label(y)用
1列に含まれる多種のLabelを複数列に置き換える。
Structure
sklearn.preprocessing.label_binarize(y, *, classes, neg_label=0, pos_label=1, sparse_output=False)
主なParameters
Parameters | Description |
y | array 次のclass指定を考慮すると現実的に1列なので目的変数が対象かな |
classes | カテゴリーを指定 対象列に対してuniqueの結果を流用しできる |
sparse_output | True: array, メモリを食う False: Sparse matrix(疎行列) |
Sample
from sklearn.preprocessing import label_binarize hotMushroom = label_binarize(df['classes'],classes=df['classes'].unique(),sparse_output=False) hotMushroom