单一的热门编码

use*_*576 1 python numpy machine-learning scikit-learn one-hot-encoding

我有一个类似于此的列表:

list = ['Opinion, Journal, Editorial',
        'Opinion, Magazine, Evidence-based',
        'Evidence-based']
Run Code Online (Sandbox Code Playgroud)

逗号在类别之间分割的地方,例如.意见和期刊是两个不同的类别.真实列表要大得多,并且有更多可能的类别.我想使用单热编码来转换列表,以便它可以用于机器学习.例如,从该列表中我想生成一个包含以下数据的稀疏矩阵:

list = [[1, 1, 1, 0, 0],
        [1, 0, 0, 0, 1],
        [0, 0, 0, 0, 1]]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想使用scikit-learn的一个热编码器,因为我认为这将是最有效的.

回应@nbrayns评论:

我们的想法是将类别列表从文本转换为矢量wherby,如果它属于该类别,它将被分配1,否则为0.对于上面的示例,标题将是:

headings = ['Opinion', 'Journal', 'Editorial', 'Magazine', 'Evidence-based']
Run Code Online (Sandbox Code Playgroud)

Igo*_*ush 8

如果您能够使用Pandas,则此功能基本上是内置的:

import pandas as pd

l = ['Opinion, Journal, Editorial', 'Opinion, Magazine, Evidence-based', 'Evidence-based']
pd.Series(l).str.get_dummies(', ')
Run Code Online (Sandbox Code Playgroud)
   Editorial  Evidence-based  Journal  Magazine  Opinion
0          1               0        1         0        1
1          0               1        0         1        1
2          0               1        0         0        0
Run Code Online (Sandbox Code Playgroud)

如果您想坚持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)
Run Code Online (Sandbox Code Playgroud)
[[1 0 1 0 1]
 [0 1 0 1 1]
 [0 1 0 0 0]]
Run Code Online (Sandbox Code Playgroud)

要将列映射回分类级别,您可以访问mlb.classes_.对于上面的例子,这给出了['Editorial' 'Evidence-based' 'Journal' 'Magazine' 'Opinion'].

  • @user7347576是的,如果你问“意见,日记”或“日记,意见”是否有区别,答案是没有。 (2认同)