2016-08-16 6 views
1

カテゴリの特徴を離散化する私はLabelEncoderとOneHotEncoderを使用しています。私はLabelEncoderがアルファベット順にデータをマッピングすることを知っていますが、OneHotEncoderはどのようにデータをマップしますか?OneHotEncodingマッピング

私はパンダのデータフレーム、dataFeatに5つの異なる列と4つの可能なラベル、上記のようなものがあります。 dataFeat = data[['Feat1', 'Feat2', 'Feat3', 'Feat4', 'Feat5']]

Feat1 Feat2 Feat3 Feat4 Feat5 
    A  B  A  A  A 
    B  B  C  C  C 
    D  D  A  A  B 
    C  C  A  A  A 

私は、これはラベルが、私は、この

ようOneHotEncoderを適用LabelEncoder

Label LabelEncoded 
A   0 
B   1 
C   2 
D   3 

によってコードされている方法です

le = preprocessing.LabelEncoder() 

intIndexed = dataFeat.apply(le.fit_transform) 

、このようなlabelencoderを適用

enc = OneHotEncoder(sparse = False) 

encModel = enc.fit(intIndexed) 

dataFeatY = encModel.transform(intIndexed) 

intIndexed.shape = 94,5およびdataFeatY.shape=94,20

私はちょっと、dataFeatYという形で混乱しています。それも95,5ではないでしょうか?

MhFarahaniは、以下の答えの後、私はラベルが

import numpy as np 

S = np.array(['A', 'B','C','D']) 
le = LabelEncoder() 
S = le.fit_transform(S) 
print(S) 

[0 1 2 3] 

ohe = OneHotEncoder() 
one_hot = ohe.fit_transform(S.reshape(-1,1)).toarray() 
print(one_hot.T) 

[[ 1. 0. 0. 0.] 
[ 0. 1. 0. 0.] 
[ 0. 0. 1. 0.] 
[ 0. 0. 0. 1.]] 

をマッピングされている方法を確認するために、これを行っている。このラベルは、次のようにマッピングされていることを意味し、またはそれは列ごとに異なっているのか? (形状が94,20であると説明します)

Label LabelEncoded OneHotEncoded 
A   0    1. 0. 0. 0 
B   1    0. 1. 0. 0. 
C   2    0. 0. 1. 0. 
D   3    0. 0. 0. 1. 

答えて

6

1つのゼロエンコードは、1とゼロのベクトルを作成することを意味します。だから順序は関係ありません。 sklearnでは、まずあなたは、たとえば、数値データへのカテゴリのデータをエンコードし、その後OneHotEncoderにそれらを供給する必要があります。

[1 0 2] 

[[ 0. 1. 0.] 
[ 1. 0. 0.] 
[ 0. 0. 1.]] 

しかしpandasが直接カテゴリを変換します。その結果

from sklearn.preprocessing import LabelEncoder 
from sklearn.preprocessing import OneHotEncoder 

S = np.array(['b','a','c']) 
le = LabelEncoder() 
S = le.fit_transform(S) 
print(S) 
ohe = OneHotEncoder() 
one_hot = ohe.fit_transform(S.reshape(-1,1)).toarray() 
print(one_hot) 

データ:

import pandas as pd 
S = pd.Series({'A': ['b', 'a', 'c']}) 
print(S) 
one_hot = pd.get_dummies(S['A']) 
print(one_hot) 

出力:

A [b, a, c] 
dtype: object 

    a b c 
0 0 1 0 
1 1 0 0 
2 0 0 1 

マッピング中に表示されているように、各カテゴリフィーチャに対してベクトルが作成されます。ベクトルの要素は、カテゴリー的特徴の位置に1つあり、それ以外の場合は0である。

A [a, a, c] 
dtype: object 

    a c 
0 1 0 
1 1 0 
2 0 1 

編集が

はこの質問を開始できますNEW質問に答えるために:中

S = pd.Series({'A': ['a', 'a', 'c']}) 
print(S) 
one_hot = pd.get_dummies(S['A']) 
print(one_hot) 

結果:ここではシリーズの2つだけのカテゴリ機能がある場合の例であります: 1つのホットエンコーディングを実行するのはなぜですか? ['a'、 'b'、 'c']などのカテゴリデータを整数[1,2,3]にエンコードする場合(例:LableEncoderを使用して)、カテゴリデータをエンコードするだけでなく、1 のような重みを与えます。3.このエンコード方法は、RandomForestのような一部の機械学習テクニックでは問題ありません。しかし、多くの機械学習技法では、この場合、それぞれ '1,' b '<' c 'と仮定します。この問題を回避するには、データ内の固有のカテゴリ変数ごとに列を作成します。言い換えれば、それぞれのカテゴリ変数(ここでは、 'a'は 'b'の1つの列、 'c'は1つの列)ごとに新しい機能を作成します。これらの新しい列の値は、その変数がそのインデックスにあった場合は1に設定され、他の場所ではゼロに設定されます。あなたの例では、配列のために

、1つのホットエンコーダは、次のようになります。

features -> A B C D 

      [[ 1. 0. 0. 0.] 
      [ 0. 1. 0. 0.] 
      [ 0. 0. 1. 0.] 
      [ 0. 0. 0. 1.]] 

あなたは4つのカテゴリ変数 "A"、 "B"、 "C"、 "D" を持っています。したがって、OneHotEncoderは(4、)配列に(4,4)を代入して、各カテゴリ変数(新しい機能になります)ごとに1つのベクトル(または列)を設定します。 "A"は配列の0要素なので、最初の列のインデックス0は1に設定され、残りは0に設定されます。同様に、2番目のベクトル(列)は機能 "B"に属し、 "B"あなたの配列のインデックス1では、 "B"ベクトルのインデックス1は1に設定され、残りはゼロに設定されます。他の機能についても同様です。

アレイを変更できます。おそらく、ラベルエンコーダーがどのように動作するかを理解するのに役立ちます。

S = np.array(['D', 'B','C','A']) 
S = le.fit_transform(S) 
enc = OneHotEncoder() 
encModel = enc.fit_transform(S.reshape(-1,1)).toarray() 
print(encModel) 

結果は次のようになります。ここで最初の列は、「A」であり、それはあなたの配列(インデックス= 3)の最後の要素だったので、最初の列の最後の要素は、あなたのパンダのデータフレーム、dataFeatについて1.

features -> A B C D 
      [[ 0. 0. 0. 1.] 
      [ 0. 1. 0. 0.] 
      [ 0. 0. 1. 0.] 
      [ 1. 0. 0. 0.]] 

だろう、あなたは間違っていますどのようにLableEncoderが動作するかについての最初のステップでも。 LableEncoderを適用すると、その時点で各列に適合し、エンコードされます。次に、次の列に移動し、その列に新しい適合をします。ここであなたが得るべきである:

from sklearn.preprocessing import LabelEncoder 
df = pd.DataFrame({'Feat1': ['A','B','D','C'],'Feat2':['B','B','D','C'],'Feat3':['A','C','A','A'], 
        'Feat4':['A','C','A','A'],'Feat5':['A','C','B','A']}) 
print('my data frame:') 
print(df) 

le = LabelEncoder() 
intIndexed = df.apply(le.fit_transform) 
print('Encoded data frame') 
print(intIndexed) 

結果:

my data frame: 
    Feat1 Feat2 Feat3 Feat4 Feat5 
0  A  B  A  A  A 
1  B  B  C  C  C 
2  D  D  A  A  B 
3  C  C  A  A  A 

Encoded data frame 
    Feat1 Feat2 Feat3 Feat4 Feat5 
0  0  0  0  0  0 
1  1  0  1  1  2 
2  3  2  0  0  1 
3  2  1  0  0  0 

注最初の列Feat1に「」0に符号化されているが、2番目の列にFeat2「B」の要素が0であること。これは、LableEncoderが各列に適合し、それを別々に変換するために発生します。 2番目の列( 'B'、 'C​​'、 'D')では、変数 'B'はアルファベット順に優れていることに注意してください。最後に、ここで

そして、あなたはsklearnで探しているものです:あなたはpandasを使用する場合

[[ 1. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 0.] 
[ 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 0. 1.] 
[ 0. 0. 0. 1. 0. 0. 1. 1. 0. 1. 0. 0. 1. 0.] 
[ 0. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 1. 0. 0.]] 

、あなたがうまくいけば、結果を比較することができます与える:あなたを与える

from sklearn.preprocessing import LabelEncoder 
from sklearn.preprocessing import OneHotEncoder 

encoder = OneHotEncoder() 
label_encoder = LabelEncoder() 
data_lable_encoded = df.apply(label_encoder.fit_transform).as_matrix() 
data_feature_onehot = encoder.fit_transform(data_lable_encoded).toarray() 
print(data_feature_onehot) 

より良い直感:

encoded = pd.get_dummies(df) 
print(encoded) 

結果:

 Feat1_A Feat1_B Feat1_C Feat1_D Feat2_B Feat2_C Feat2_D Feat3_A \ 
0  1  0  0  0  1  0  0  1 
1  0  1  0  0  1  0  0  0 
2  0  0  0  1  0  0  1  1 
3  0  0  1  0  0  1  0  1 

    Feat3_C Feat4_A Feat4_C Feat5_A Feat5_B Feat5_C 
0  0  1  0  1  0  0 
1  1  0  1  0  0  1 
2  0  1  0  0  1  0 
3  0  1  0  1  0  0 

これはまったく同じです!

+0

ありがとう@MhFarahani、私はもっと理解しています。もっと具体的な質問で投稿を更新しました。私は訓練されたモデルを別のデータセットで使用できるようにするために 'get_dummies'を使用したくありません – gbhrea

+0

通常、人はそのカテゴリのデータを最初にエンコードし、それらを分割して訓練とテストデータセットに分割します。それをもっと明確にするために私の答えを編集しました。 'LableEncoder'がデータフレーム上でどのように動作するかについてのあなたの理解は間違っています。 – MhFarahani

+0

すばらしい答え、ありがとう!私は 'LabelEncoder'が列単位ではなくデータフレーム全体に適合しているという印象を受けました。私は 'LabelEncoder'と' OneHotEncoder'の両方がどのように動作するかを理解しました。したがって、別のデータが同じようにエンコードされていることを確認したいのであれば、将来の使用のために、 'LabelEncoder'オブジェクトと' OneHotEncoder'オブジェクトを保存するだけですか? – gbhrea