首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiLabelBinarizer提供单个字符,而不是类

MultiLabelBinarizer提供单个字符,而不是类
EN

Stack Overflow用户
提问于 2019-09-13 13:48:25
回答 3查看 715关注 0票数 0

我正在研究一个多标签文本分类问题。为了对标签进行编码,我使用了MultiLabelBinarizer。数据集的标签如下所示-

代码语言:javascript
复制
[cs.AI, cs.CL, cs.CV, cs.NE, stat.ML]
[cs.CL, cs.AI, cs.LG, cs.NE, stat.ML]
[cs.CL, cs.AI, cs.LG, cs.NE, stat.ML]
[stat.ML, cs.AI, cs.CL, cs.LG, cs.NE]
[cs.CL, cs.AI, cs.LG, cs.NE, stat.ML]

当我使用

代码语言:javascript
复制
mlb = MultiLabelBinarizer()
mlb.fit(labels)
print(mlb.classes_)

它给了我-

代码语言:javascript
复制
array([' ', ',', '.', 'A', 'B', 'C', 'D', 'E', 'G', 'H', 'I', 'L', 'M',
       'N', 'O', 'P', 'R', 'S', 'T', 'V', 'Y', '[', ']', 'a', 'c', 'h',
       'm', 's', 't'], dtype=object)

我(部分)通过mlb.fit([y_train])修复了这个问题,我得到了(我打印了前10个类)-

代码语言:javascript
复制
array(['[cs.AI, cs.CC]', '[cs.AI, cs.CV]', '[cs.AI, cs.CY]',
       '[cs.AI, cs.DB]', '[cs.AI, cs.DS]', '[cs.AI, cs.GT]',
       '[cs.AI, cs.HC]', '[cs.AI, cs.IR]', '[cs.AI, cs.LG, stat.ML]',
       '[cs.AI, cs.LG]'], dtype=object)

理想情况下,它应该输出单个类(我的代码中可能有错误)。当我使用mlb.fit_transform([y_train])时,我得到-

代码语言:javascript
复制
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

如果您能帮忙,我们将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2019-09-16 12:35:14

它不起作用,因为您的标签格式不是所需的。它应该是一个列表列表。在您的示例中,您有5行数据,每行都有5个标签,您的标签应该是包含5个标签列表的列表(1个标签列表对应1行数据),每个标签列表包含所有5个标签:

代码语言:javascript
复制
y_train= [['cs.AI', 'cs.CL', 'cs.CV', 'cs.NE', 'stat.ML'],
          ['cs.CL', 'cs.AI', 'cs.LG', 'cs.NE', 'stat.ML'],
          ['cs.CL', 'cs.AI', 'cs.LG', 'cs.NE', 'stat.ML'],
          ['stat.ML', 'cs.AI', 'cs.CL', 'cs.LG', 'cs.NE'],
          ['cs.CL', 'cs.AI', 'cs.LG', 'cs.NE', 'stat.ML']]

然后使用sklearn对标签进行二进制化

代码语言:javascript
复制
from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
y_label_binarized = mlb.fit_transform(y_train)

您将获得所需的输出,其中y_label_binarized为:

代码语言:javascript
复制
array([[1, 1, 1, 0, 1, 1],
       [1, 1, 0, 1, 1, 1],
       [1, 1, 0, 1, 1, 1],
       [1, 1, 0, 1, 1, 1],
       [1, 1, 0, 1, 1, 1]])

mlb.classes_

代码语言:javascript
复制
array(['cs.AI', 'cs.CL', 'cs.CV', 'cs.LG', 'cs.NE', 'stat.ML'],
      dtype=object)
票数 2
EN

Stack Overflow用户

发布于 2019-09-16 12:20:46

因为当您调用mlb.fit([y_train])时,您不会将训练数据传递给MultiLabelBinarizer,而是传入一个只有一个元素的数组,该数组就是您的训练数据。这就解释了为什么你的类很奇怪--每个“类”都是你的“样本”之一:

代码语言:javascript
复制
array(['[cs.AI, cs.CC]', '[cs.AI, cs.CV]', '[cs.AI, cs.CY]',
       '[cs.AI, cs.DB]', '[cs.AI, cs.DS]', '[cs.AI, cs.GT]',
       '[cs.AI, cs.HC]', '[cs.AI, cs.IR]', '[cs.AI, cs.LG, stat.ML]',
       '[cs.AI, cs.LG]'], dtype=object)

它还解释了为什么当您调用fit_transform时,您会得到一个每个值都设置为1的类-因为您向它传递了一个样本,其中包含[cs.AI, cs.CC][cs.AI, cs.CV]等等-它将每个样本解释为一个类,并将整个数据集解释为一个样本。

代码语言:javascript
复制
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

相反,您只需要使用y_train调用各种函数

代码语言:javascript
复制
mlb.fit(y_train)
mlb.fit_transform(y_train)
票数 1
EN

Stack Overflow用户

发布于 2020-06-26 21:57:12

解决了这个问题:

首先,你需要去掉括号/引号:

代码语言:javascript
复制
data['labels']=data['labels'].str.replace("[","")
data['labels']=data['labels'].str.replace("]","")
data['labels']=data['labels'].str.replace("'","")

在此之后,您需要在逗号之间定义类:

代码语言:javascript
复制
one_hot = MultiLabelBinarizer()

y_classes = one_hot.fit_transform(data['labels'].str.split(', '))

现在您已经有了编码的标签。这解决了我的问题,这个问题和你的非常相似。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57917936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档