转换sklearn管道中的文本数据

时间:2015-08-05 21:17:36

标签: python pandas scikit-learn

给定一组文本数据,

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))

根据this issue提出TypeError: fit_transform() takes exactly 2 arguments (3 given) 。我尝试在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.]]。有关获得所需输出的任何建议吗?

2 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:1)

pandas有一个方法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]]