在sklearn / pandas中编码“k out of n labels”功能

时间:2016-06-09 15:52:19

标签: python pandas scikit-learn

我有一个功能是一组标签的子集。

>>> labels = ['ini', '', 'pdf', 'flac', 'php']
>>> data = [random.sample(labels, random.randint(0, len(labels))) for _ in range(20)]
>>> data[:5]
[['pdf'], [], ['pdf', 'flac'], ['php', 'pdf', 'ini'], ['', 'php', 'ini']]

我需要一个“k out of n encoder”来编码这个功能。我尝试使用/ hacking OneHotEncoder,LabelEncoder,get_dummies但是无法很好地表示这些数据。可能不会提前知道这组标签。

在纯python中,(慢)实现可能是 -

>>>> feature_space = sorted(list(set(sum(data, []))))
>>>> data2 = [[int(c in row) for c in feature_space] for row in data]
>>> data2[:5]
[[0, 0, 1, 1, 0], [1, 1, 0, 1, 0], [1, 1, 0, 0, 0], [0, 0, 1, 0, 1], [1, 0, 1, 1, 1]]

是否有编码此类功能的pandas或sklearn功能/管道?

1 个答案:

答案 0 :(得分:2)

使用pandas系列跟踪其索引中的标签。然后通过1方法访问.loc的值。使用0填写缺失的值。

import pandas as pd
import numpy as np

s1 = pd.Series(np.ones(len(labels)), labels)
s0 = pd.Series(np.zeros(len(labels)), labels)

df = pd.concat([s1.loc[d].combine_first(s0) for d in data], axis=1)
df.astype(int).T[labels].values

设置

import pandas as pd
import numpy as np

np.random.seed([3,1415])
labels = ['ini', '', 'pdf', 'flac', 'php']
data = [random.sample(labels, random.randint(0, len(labels))) for _ in range(20)]

s1 = pd.Series(np.ones(len(labels)), labels)
s0 = pd.Series(np.zeros(len(labels)), labels)

验证

data[0]为空

data[0]

[]

用它切片s1会产生一个空系列。

s1.loc[data[0]]

Series([], dtype: float64)

结合s0填写0     s1.loc [数据[0]]。combine_first(S0)

        0.0
flac    0.0
ini     1.0
pdf     0.0
php     0.0
dtype: float64

pd.concat让他们在一起。

df = pd.concat([s1.loc[d].combine_first(s0) for d in data], axis=1).T

print df.head()

       flac  ini  pdf  php
0   0     0    1    0    0
1   0     0    0    0    1
2   1     1    0    1    1
3   0     1    0    0    0
4   0     0    0    1    0

按标签切片以获得正确的订单并获取值

df.astype(int)[labels].values

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