python - 类别的一次性编码

标签 python numpy machine-learning scikit-learn one-hot-encoding

我有一个类似这样的列表:

list = ['Opinion, Journal, Editorial',
        'Opinion, Magazine, Evidence-based',
        'Evidence-based']

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

list = [[1, 1, 1, 0, 0],
        [1, 0, 0, 0, 1],
        [0, 0, 0, 0, 1]]

理想情况下,我想使用 scikit-learn's one hot encoder因为我认为这是最有效的。

回应@nbrayns评论:

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

headings = ['Opinion', 'Journal', 'Editorial', 'Magazine', 'Evidence-based']

最佳答案

如果您能够使用 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']

关于python - 类别的一次性编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42034338/

相关文章:

python - 在Python中检索括号中的第一个单词

linux - 如何将 "tar"shell 命令翻译成 Python

python - 从 NumPy 数组中删除一个值

python - 计算卷积神经网络中特征图的维度

math - 平移等方差及其与卷积层和空间池化层的关系

python - 对标记文本进行分类时出现问题,预测错误?

python - 使用 python doctest 时出错

arrays - 创建 NumPy 数组时无法理解数据类型

python - 将列表值分配给 Pandas 数据框

machine-learning - 为什么特征太多会导致过拟合?