[machine learning]独熱符号化one hot encoding及びMNIST label独熱符号化例


1.なぜone hot encodingを使うのか


実際のシーンでは、変数が連続数値ではなく離散データである場合、暴力的な付与を使用すると、データに潜在的なソートウェイトが与えられます.言い換えれば、各ベクトル間の距離は等しくない.
例えば、性別(男性、女性)、私たちは暴力的に(0,1)に変えることができます.大丈夫です.
しかし、性別(男、女、人妖)は、暴力が(0,1,2)、「男」/「女」、「男」/「人妖」間のベクトル距離が等しくなければ、潜在的な大きさのソートを提供し、出力結果に影響を与える.
上記の問題を解決するために、1つの可能な解決策は、ユニサーマルコーディング(One−Hot Encoding)を用いることである. 
独熱符号化はOne-Hot符号化であり、Nビット状態レジスタを用いてN個の状態を符号化する方法であり、各状態は独立したレジスタビットであり、いずれの場合も1ビットしか有効ではない.したがって:(男、女、人妖)、符号を(-1,0,0)、(0,1,0)、(0,0,1))に変換することができ、ベクトル距離はいずれも等しい.

2.onehot符号化の利点


(1)非連続型数値特徴を扱うことができる. 
(2)特徴もある程度拡張されている.例えば性別自体が特徴で、onehotコードを経て、男か女の2つの特徴になりました.

3.sklearnのone hot encodingとpandasのget_dummies()比較


sklearn.preprocessingのOneHotEncoderはstringを直接処理することはできません.データセットのいくつかの特徴がstringタイプであれば、まずintegersタイプに変換する必要があります.新しいバージョンのsklearnでは、OneHotEncoderインスタンスのfitメソッドは1次元配列を受信せず、明示的な2次元形式でなければなりません.使用する場合は、まずfit()で全カテゴリに与えます.例えば、性別:(男性、女性)数値型(0、1)に変換し、2つのカテゴリを含む.気分:(よし、一般、差)数値型(0、1、2)に変換し、3つのカテゴリを含む.全カテゴリに与えるには、fit()に2次元配列[[0,0],[0,1],[1,2]]を埋め込む必要があります.配列の行(すなわち1次元)は様々な組合せを表し、例えば[0,0]は[男,はい]を表す.組み合わせはすべてのカテゴリをカバーすればよい.例えば[[0,0],[0,1,2]]は性別をカバーしている:[0][0][1]、気持ち[0][1][2]
from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder()

encoder.fit( [ [0,0],[0,1],[1,2] ] )
でtransform()関数を使用してターゲット配列を変換し、変換後にOneHotEncoderオブジェクトを返し、toarray()で配列に変換する必要がある:
encoder.transform([1,1]).toarray()
[1,1]は[男を表し、一般]出力結果は[0,1,0,1,0]のうち[0,1]は「男」の独熱符号化である.[0,1,0]は「一般」のユニサーマル符号化である
pd.get_dummies()は、stringをintegersタイプに直接変換します:
pd.get_dummies(['A', 'B', 'A'])
   A  B
0  1  0
1  0  1
2  1  0

4.MNISTデジタルlabel 0~9独熱符号化例:


元のデータがn個の28*28ピクチャであり、画素値とlabelが混合されていると仮定する.すなわち、元のデータはshape=(n,785)の配列data 1_である.array
data1_label = data1_array[:,0].reshape(n,1)        
ohe = OneHotEncoder()
ohe.fit([[0],[1],[2],[3],[4],[5],[6],[7],[8],[9]])
data1_label_oh = ohe.transform(data1_label).toarray()
print (data1_label_oh)