2017-07-24 84 views
4

我想在sklearn中使用MultiLabelBinarizer。我有一个熊猫系列,我想喂这个系列作为MultiLabelBinarizer的适合功能的输入。但是,我发现MultiLabelBinarizer的匹配需要输入表格iterable of iterables。我不知道如何将熊猫系列转换为所需类型。将熊猫系列转换为可迭代的迭代

import pandas as pd 
from sklearn.preprocessing import MultiLabelBinarizer 

data = pd.read_csv("somecsvFile") 
y = pd.DataFrame(data['class']) 

mlb = MultiLabelBinarizer() 
y = mlb.fit(???) 

我试图将其转换为numpy数组,尝试使用iter功能的熊猫,但似乎没有工作。

请给我一些建议。

感谢

EDIT1:的print(data['class'].head(10))输出是:

0  func 
1  func 
2  func 
3 non func 
4  func 
5  func 
6 non func 
7 non func 
8 non func 
9  func 
Name: status_group, dtype: object 
+0

你的数据框是什么样的?这个解决方案很简单,我只需要知道你的df有哪些列。 –

+0

你可以发布'print(data ['class']。head(10))''的输出吗? – MaxU

+0

@cᴏʟᴅsᴘᴇᴇᴅ - 编辑的问题添加头的输出。 –

回答

6

如何解决该事实MultiLabelBinarizer's fit needs an input of form iterable of iterables

In [8]: df 
Out[8]: 
     class 
0  func 
1  func 
2  func 
3 non func 
4  func 
5  func 
6 non func 
7 non func 
8 non func 
9  func 

In [10]: import pandas as pd 
    ...: from sklearn.preprocessing import MultiLabelBinarizer 

In [11]: y = df['class'].str.split(expand=False) # <--- NOTE !!! 

In [12]: mlb = MultiLabelBinarizer() 
    ...: y = mlb.fit_transform(y) 
    ...: 

In [13]: y 
Out[13]: 
array([[1, 0], 
     [1, 0], 
     [1, 0], 
     [1, 1], 
     [1, 0], 
     [1, 0], 
     [1, 1], 
     [1, 1], 
     [1, 1], 
     [1, 0]]) 

UPDATE:as proposed by @unutbu you can use pd.get_dummies()

In [21]: pd.get_dummies(df['class']) 
Out[21]: 
    func non func 
0  1   0 
1  1   0 
2  1   0 
3  0   1 
4  1   0 
5  1   0 
6  0   1 
7  0   1 
8  0   1 
9  1   0 
+1

唷!你解决了这个问题。 +1 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ,是的,错误信息不是100%清楚。谢谢! :) – MaxU

+2

这似乎将'non func'解释为2个标签:'non'和'func'。如果OP希望'non func'成为一个不同于'func'的标签,那么'pd.get_dummies(df ['class'])。values'就足够了。 – unutbu

3

你问什么

MultiLabelBinarizer需要iterables的迭代。

df['class']是一种迭代,因为这些值是一维的。您可以使它成为二维并解决您的问题。

mlb.fit_transform(df[['class']].values) 
# equivalently 
# mlb.fit_transform(df['class'].values[:, None]) 

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

近观
该示例具有一个3个唯一值,并且将产生3列。

mlb.fit_transform([ 
    ['a'], 
    ['b'], 
    ['a'], 
    ['c'] 
]) 

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

但是,我们可以通过非均匀子列表以及

mlb.fit_transform([ 
    ['a'], 
    ['b', 'a'], 
    ['a'], 
    ['c', 'b'] 
]) 

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

虽然你的情况下,并没有利用这一点,这就是为什么它需要iterables的迭代,使其可以做我刚刚展示的内容。


我会做什么,而不是

因为MultiLabelBinarizer可以做的比我们需要的,我们也许能够做的更好的东西有更清晰的工具

f, u = pd.factorize(df['class'].values) 
np.eye(u.size, dtype=int)[f] 

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

比较计时

%timeit mlb.fit_transform(df['class'].values[:, None]) 

10000 loops, best of 3: 191 µs per loop 

%%timeit 
f, u = pd.factorize(df['class'].values) 
np.eye(u.size, dtype=int)[f] 

10000 loops, best of 3: 68.8 µs per loop 
+0

感谢您的明确描述。我现在明白了。 –