2015-08-05 4 views
1

Учитывая массив текстовых данных,Преобразования текстовых данных в sklearn трубопроводе

X = np.array(['cat', 'dog', 'cow', 'cat', 'cow', 'dog']) 

Я хотел бы использовать трубопровод sklearn для получения вывода, как

np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0], [0, 0, 1], [0, 1, 0]]) 

Моей первой попыткой

pipe = Pipeline([ 
    ('encoder', LabelEncoder()), 
    ('hot', OneHotEncoder(sparse=False))]) 
print(pipe.fit_transform(X)) 

поднимает TypeError: fit_transform() takes exactly 2 arguments (3 given) , согласно this issue. Я попытался отредактировать подпись на LabelEncoder, так что SaneLabelEncoder().fit_transform(X) дает [0 2 1 0 1 2], но затем

pipe = Pipeline([ 
    ('encoder', SaneLabelEncoder()), 
    ('hot', OneHotEncoder(sparse=False))]) 
print(pipe.fit_transform(X)) 

дает [[ 1. 1. 1. 1. 1. 1.]]. Любые предложения по достижению желаемого результата?

ответ

3

Использование LabelBinarizer:

import numpy as np         
from sklearn import preprocessing                                
X = np.array(['cat', 'dog', 'cow', 'cat', 'cow', 'dog'])                              
binar = preprocessing.LabelBinarizer()                                   
X_bin = binar.fit_transform(X)                                     
print X_bin 

выход:

[[1 0 0] 
[0 0 1] 
[0 1 0] 
[1 0 0] 
[0 1 0] 
[0 0 1]] 
+0

Это идеально - вы могли бы добавить, что он работает в трубопроводе, как один шаг. В частности, если 'pipe = Pipeline (('encoder', LabelBinarizer()),])', то 'print (pipe.fit_transform (X))' работает, как вы описываете. – colcarroll

1

панды имеет метод get_dummies для этого:

pd.get_dummies(X) 

будет производить DataFrame:

cat cow dog 
0 1 0 0 
1 0 0 1 
2 0 1 0 
3 1 0 0 
4 0 1 0 
5 0 0 1 

Или, если вы должны иметь массив целых чисел:

pd.get_dummies(X).values.astype(int) 

даст:

[[1 0 0] 
[0 0 1] 
[0 1 0] 
[1 0 0] 
[0 1 0] 
[0 0 1]]