给出变体长度特征列表:
features = [
['f1', 'f2', 'f3'],
['f2', 'f4', 'f5', 'f6'],
['f1', 'f2']
]
其中每个示例都有不同数量的要素,而且要素dtype
为str
并且已经很热。
为了使用sklearn的特征选择工具,我必须将features
转换为2D数组,如下所示:
f1 f2 f3 f4 f5 f6
s1 1 1 1 0 0 0
s2 0 1 0 1 1 1
s3 1 1 0 0 0 0
我怎么能通过sklearn或numpy来实现呢?
答案 0 :(得分:10)
您可以使用专门用于执行此操作的scikit中的MultiLabelBinarizer。
您的示例代码:
features = [
['f1', 'f2', 'f3'],
['f2', 'f4', 'f5', 'f6'],
['f1', 'f2']
]
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
new_features = mlb.fit_transform(features)
输出:
array([[1, 1, 1, 0, 0, 0],
[0, 1, 0, 1, 1, 1],
[1, 1, 0, 0, 0, 0]])
这也可以在管道中使用,以及其他feature_selection实用程序。
答案 1 :(得分:3)
这是使用NumPy方法并输出为pandas数据帧的一种方法 -
import numpy as np
import pandas as pd
lens = list(map(len, features))
N = len(lens)
unq, col = np.unique(np.concatenate(features),return_inverse=1)
row = np.repeat(np.arange(N), lens)
out = np.zeros((N,len(unq)),dtype=int)
out[row,col] = 1
indx = ['s'+str(i+1) for i in range(N)]
df_out = pd.DataFrame(out, columns=unq, index=indx)
示例输入,输出 -
In [80]: features
Out[80]: [['f1', 'f2', 'f3'], ['f2', 'f4', 'f5', 'f6'], ['f1', 'f2']]
In [81]: df_out
Out[81]:
f1 f2 f3 f4 f5 f6
s1 1 1 1 0 0 0
s2 0 1 0 1 1 1
s3 1 1 0 0 0 0