機械学習分類器のカテゴリ変数を数値に変換するさまざまな方法を学んでいます。 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.dummies
をsklearn.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
OneHotEncoder
は文字列値を直接処理できません。名目上の特徴が文字列である場合、まずそれらを整数にマッピングする必要があります。
pandas.get_dummies
はその逆です。デフォルトでは、列が指定されない限り、文字列の列のみがワンホット表現に変換されます。
機械学習では、ほぼ間違いなく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_test
にX_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に設定するだけです。