2016-04-14 10 views
21

Uczę się różnych metod przekształcania zmiennych jakościowych na liczbowe dla klasyfikatorów maszynowych. Natknąłem się na metodę pd.get_dummies i sklearn.preprocessing.OneHotEncoder() i chciałem zobaczyć, jak różnią się pod względem wydajności i użytkowania.Panda's get_dummies vs. OneHotEncoder Sklearna() :: Co jest bardziej wydajne?

Znalazłem samouczek dotyczący korzystania z OneHotEnocder() na https://xgdgsc.wordpress.com/2015/03/20/note-on-using-onehotencoder-in-scikit-learn-to-work-on-categorical-features/, ponieważ dokumentacja sklearn nie była zbyt pomocna w tej funkcji. Mam wrażenie, że nie robię tego poprawnie ... ale

Czy można wyjaśnić wady i zalety używania pd.dummies przez sklearn.preprocessing.OneHotEncoder() i na odwrót? Wiem, że OneHotEncoder() daje rzadką matrycę, ale poza tym nie jestem pewien, w jaki sposób jest używany i jakie są korzyści w stosunku do metody pandas. Czy używam go nieefektywnie?

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 

Odpowiedz

17

OneHotEncoder nie może przetwarzać strunowe wartości bezpośrednio. Jeśli twoje nominalne cechy są ciągami, musisz najpierw odwzorować je na liczby całkowite.

pandas.get_dummies jest swego rodzaju przeciwieństwem. Domyślnie konwertuje kolumny tekstowe tylko na jedną reprezentację, chyba że podano kolumny.

+0

Hej, Hej, przepraszam za opóźnienie w otrzymaniu odpowiedzi na tę odpowiedź. –

+0

Poza tym, czy jest skuteczny w porównaniu z innymi? –

Powiązane problemy