web-dev-qa-db-ja.com

pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder、OneHotEncoderの違いを知りたい

4つの機能はすべて私によく似ています。状況によっては、同じ結果が得られる場合とそうでない場合があります。どんな助けでもありがたいです!

現在、私は知っており、内部ではfactorizeLabelEncoderは同じように機能し、結果に関して大きな違いはないと想定しています。大量のデータで同様の時間がかかるかどうかはわかりません。

get_dummiesOneHotEncoderは同じ結果になりますが、OneHotEncoderは数値しか処理できませんがget_dummiesはあらゆる種類の入力を受け取ります。 get_dummiesは、列の入力ごとに新しい列名を自動的に生成しますが、OneHotEncoderは生成しません(むしろ、新しい列名1、2、3 ...を割り当てます)。そう get_dummiesは、すべての関係者の方が優れています。

私が間違っていたら訂正してください!ありがとうございました!

20
Richard Ji

これらの4つのエンコーダは、次の2つのカテゴリに分類できます。

  • ラベルをカテゴリカル変数にエンコードします:Pandas factorizeおよびscikit-learn LabelEncoder 。結果は1次元になります。
  • カテゴリ変数をダミー/インジケーター(バイナリ)変数にエンコードします:Pandas get_dummiesおよびscikit-learn OneHotEncoder。結果はn個の次元を持ち、1つはエンコードされたカテゴリ変数の個別の値によるものです。

pandasとscikit-learnエンコーダーの主な違いは、scikit-learnエンコーダーがscikit-learnパイプラインfitおよびtransformメソッドを使用します。

ラベルをカテゴリカル変数にエンコードする

パンダfactorizeとscikit-learn LabelEncoderは最初のカテゴリに属します。たとえば、文字を数値に変換するなど、カテゴリ変数を作成するために使用できます。

from sklearn import preprocessing    
# Test data
df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])    
df['Fact'] = pd.factorize(df['Col'])[0]
le = preprocessing.LabelEncoder()
df['Lab'] = le.fit_transform(df['Col'])

print(df)
#   Col  Fact  Lab
# 0   A     0    0
# 1   B     1    1
# 2   B     1    1
# 3   C     2    2

カテゴリ変数をダミー/インジケーター(バイナリ)変数にエンコードする

パンダget_dummiesおよびscikit-learn OneHotEncoderは2番目のカテゴリに属します。バイナリ変数の作成に使用できます。 OneHotEncoderはカテゴリカル整数でのみ使用でき、get_dummiesは、他のタイプの変数とともに使用できます。

df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
df = pd.get_dummies(df)

print(df)
#    Col_A  Col_B  Col_C
# 0    1.0    0.0    0.0
# 1    0.0    1.0    0.0
# 2    0.0    1.0    0.0
# 3    0.0    0.0    1.0

from sklearn.preprocessing import OneHotEncoder, LabelEncoder
df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
# We need to transform first character into integer in order to use the OneHotEncoder
le = preprocessing.LabelEncoder()
df['Col'] = le.fit_transform(df['Col'])
enc = OneHotEncoder()
df = DataFrame(enc.fit_transform(df).toarray())

print(df)
#      0    1    2
# 0  1.0  0.0  0.0
# 1  0.0  1.0  0.0
# 2  0.0  1.0  0.0
# 3  0.0  0.0  1.0

また、この回答に基づいて、より詳細な post を記述しました。

28
Romain