PyInv

プログラミングのメモ、海外投資のメモ

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) 

f:id:singapp:20200922005550p:plain

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()


f:id:singapp:20200922012454p:plain

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


f:id:singapp:20200922014548p:plain