我有一个类似的列表:
list = ['Opinion, Journal, Editorial',
'Opinion, Magazine, Evidence-based',
'Evidence-based']
其中逗号在类别之间分割,例如。意见和期刊是两个不同的类别。真实列表要大得多,并且有更多可能的类别。我想使用单热编码来转换列表,以便它可以用于机器学习。例如,从该列表中我想生成一个包含以下数据的稀疏矩阵:
list = [[1, 1, 1, 0, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]
理想情况下,我想使用scikit-learn's one hot encoder,因为我认为这将是最有效的。
回复@nbrayns评论:
这个想法是将类别列表从文本转换为矢量wherby,如果它属于该类别,它将被分配1,否则为0.对于上面的例子,标题将是:
headings = ['Opinion', 'Journal', 'Editorial', 'Magazine', 'Evidence-based']
答案 0 :(得分:6)
如果你能够使用Pandas,那么这个功能基本上就是内置的:
import pandas as pd
l = ['Opinion, Journal, Editorial', 'Opinion, Magazine, Evidence-based', 'Evidence-based']
pd.Series(l).str.get_dummies(', ')
Editorial Evidence-based Journal Magazine Opinion
0 1 0 1 0 1
1 0 1 0 1 1
2 0 1 0 0 0
如果您想坚持sklearn
生态系统,那么您正在寻找MultiLabelBinarizer
,而不是OneHotEncoder
。顾名思义,OneHotEncoder
每个类别每个样本只支持一个级别,而您的数据集有多个。
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer() # pass sparse_output=True if you'd like
mlb.fit_transform(s.split(', ') for s in l)
[[1 0 1 0 1]
[0 1 0 1 1]
[0 1 0 0 0]]
要将列映射回分类级别,您可以访问mlb.classes_
。对于上面的示例,这会给出['Editorial' 'Evidence-based' 'Journal' 'Magazine' 'Opinion']
。
答案 1 :(得分:1)
还有一种方法:
$client->request('GET', '/', ['proxy' => 'tcp://localhost:8125']);
答案 2 :(得分:0)
这可能不是最有效的方法,但可能很容易掌握
如果您还没有所有可能单词的列表,则需要创建该单词。在下面的代码中,它被称为unique
。输出矩阵s
的列将对应于那些唯一的单词;行将是列表中的项目。
import numpy as np
lis = ['Opinion, Journal, Editorial','Opinion, Magazine, Evidence-based','Evidence-based']
unique=list(set(", ".join(lis).split(", ")))
print unique
# prints ['Opinion', 'Journal', 'Magazine', 'Editorial', 'Evidence-based']
s = np.zeros((len(lis), len(unique)))
for i, item in enumerate(lis):
for j, notion in enumerate(unique):
if notion in item:
s[i,j] = 1
print s
# prints [[ 1. 1. 0. 1. 0.]
# [ 1. 0. 1. 0. 1.]
# [ 0. 0. 0. 0. 1.]]
答案 3 :(得分:-1)
pandas
非常容易:
import pandas as pd
s = pd.Series(['a','b','c'])
pd.get_dummies(s)
输出:
a b c
0 1 0 0
1 0 1 0
2 0 0 1