2016-04-14 29 views
21

私は機械学習の分類子のためにカテゴリ変数を数値に変換するためのさまざまな方法を学んでいます。私はpd.get_dummiesメソッドとsklearn.preprocessing.OneHotEncoder()を見つけたので、パフォーマンスと使用方法がどのように異なっているかを見たいと思っていました。パンダのget_dummies対SklearnのOneHotEncoder()::もっと効率的です。

https://xgdgsc.wordpress.com/2015/03/20/note-on-using-onehotencoder-in-scikit-learn-to-work-on-categorical-features/で使用する方法に関するチュートリアルが見つかりました。sklearnのドキュメントは、この機能にはそれほど役に立たなかったためです。私はそれを正しくやっていないと感じています...しかし、の賛否両論を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 

答えて

17

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

pandas.get_dummiesは逆の種類です。デフォルトでは、列が指定されていない限り、文字列を1ホット表現に変換するだけです。

+0

こんにちは@nos、この回答であなたに戻って遅れてごめんね。 –

+0

それ以外は、他のものより効率的ですか? –

関連する問題