web-dev-qa-db-ja.com

Pandaのget_dummies対SklearnのOneHotEncoder()::長所と短所は何ですか?

機械学習分類器のカテゴリ変数を数値に変換するさまざまな方法を学んでいます。 pd.get_dummiesメソッドとsklearn.preprocessing.OneHotEncoder()に出くわしたので、パフォーマンスと使用法の違いを確認したかったのです。

https://xgdgsc.wordpress.com/2015/03/20/note-on-using-onehotencoder-in-scikit-learn-to-でOneHotEnocder()を使用する方法に関するチュートリアルを見つけましたwork-on-categorical-features /sklearnのドキュメントはこの機能ではあまり役に立たなかったためです。私はそれを正しくやっていないと感じています...しかし

pd.dummiessklearn.preprocessing.OneHotEncoder()経由で使用することの長所と短所を説明できますか?OneHotEncoder()スパース行列を提供しますが、それ以外の使用方法とpandasメソッドに対する利点はわかりません。非効率的に使用していますか?

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
sns.set()

%matplotlib inline

#Iris Plot
iris = load_iris()
n_samples, m_features = iris.data.shape

#Load Data
X, y = iris.data, iris.target
D_target_dummy = dict(Zip(np.arange(iris.target_names.shape[0]), iris.target_names))

DF_data = pd.DataFrame(X,columns=iris.feature_names)
DF_data["target"] = pd.Series(y).map(D_target_dummy)
#sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
#0                  5.1               3.5                1.4               0.2   
#1                  4.9               3.0                1.4               0.2   
#2                  4.7               3.2                1.3               0.2   
#3                  4.6               3.1                1.5               0.2   
#4                  5.0               3.6                1.4               0.2   
#5                  5.4               3.9                1.7               0.4   

DF_dummies = pd.get_dummies(DF_data["target"])
#setosa  versicolor  virginica
#0         1           0          0
#1         1           0          0
#2         1           0          0
#3         1           0          0
#4         1           0          0
#5         1           0          0

from sklearn.preprocessing import OneHotEncoder, LabelEncoder
def f1(DF_data):
    Enc_ohe, Enc_label = OneHotEncoder(), LabelEncoder()
    DF_data["Dummies"] = Enc_label.fit_transform(DF_data["target"])
    DF_dummies2 = pd.DataFrame(Enc_ohe.fit_transform(DF_data[["Dummies"]]).todense(), columns = Enc_label.classes_)
    return(DF_dummies2)

%timeit pd.get_dummies(DF_data["target"])
#1000 loops, best of 3: 777 µs per loop

%timeit f1(DF_data)
#100 loops, best of 3: 2.91 ms per loop
40
O.rka

OneHotEncoderは文字列値を直接処理できません。名目上の特徴が文字列である場合、まずそれらを整数にマッピングする必要があります。

pandas.get_dummiesはその逆です。デフォルトでは、列が指定されない限り、文字列の列のみがワンホット表現に変換されます。

41
nos

機械学習では、ほぼ間違いなくsklearn.OneHotEncoderを使用する必要があります。単純な分析などの他のタスクでは、pd.get_dummiesもっと便利。

sklearn.OneHotEncoderは最新のバージョンで更新されているため、カテゴリ変数および整数の strings を受け入れます。

重要なのは、sklearnエンコーダーが persists の関数を作成し、同じカテゴリを使用する新しいデータセットに適用できることです。一貫した結果を持つ変数

from sklearn.preprocessing import OneHotEncoder

# Create the encoder.
encoder = OneHotEncoder(handle_unknown="ignore")
encoder.fit(X_train)    # Assume for simplicity all features are categorical.

# Apply the encoder.
X_train = encoder.transform(X_train)
X_test = encoder.transform(X_test)

X_trainで作成した同じエンコーダーを新しいデータセットX_testに適用する方法に注意してください。

変数の1つに対してX_testX_trainと異なるレベルが含まれている場合はどうなるかを検討してください。たとえば、X_train["color"]には"red""green"のみが含まれますが、それらに加えて、X_test["color"]には"blue"が含まれることがあります。

pd.get_dummiesを使用すると、X_testには"color_blue"にはない追加のX_train列が追加されます。特に、 X_testでトレーニングしたsklearnモデルにX_trainを供給しています。

そして、一度に1つのサンプルを受け取る実稼働環境でこのようなデータを処理する場合、pd.get_dummiesは役に立ちません。

一方、sklearn.OneHotEncoderを使用すると、エンコーダーを作成したら、"red"および"green"の列のみを使用して、毎回同じ出力を生成するためにエンコーダーを再利用できます。そして、新しいレベル"blue"に遭遇したときの動作を明示的に制御できます。それが不可能だと思う場合は、handle_unknown="error"でエラーをスローするように指示できます。それ以外の場合は、続行するように指示し、handle_unknown="ignore"を使用して赤と緑の列を0に設定するだけです。

18
Denziloe