我正在研究一个多标签文本分类问题。为了对标签进行编码,我使用了MultiLabelBinarizer。数据集的标签如下所示-
[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]当我使用
mlb = MultiLabelBinarizer()
mlb.fit(labels)
print(mlb.classes_)它给了我-
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个类)-
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])时,我得到-
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]])如果您能帮忙,我们将不胜感激。
发布于 2019-09-16 12:35:14
它不起作用,因为您的标签格式不是所需的。它应该是一个列表列表。在您的示例中,您有5行数据,每行都有5个标签,您的标签应该是包含5个标签列表的列表(1个标签列表对应1行数据),每个标签列表包含所有5个标签:
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对标签进行二进制化
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
y_label_binarized = mlb.fit_transform(y_train)您将获得所需的输出,其中y_label_binarized为:
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_是
array(['cs.AI', 'cs.CL', 'cs.CV', 'cs.LG', 'cs.NE', 'stat.ML'],
dtype=object)发布于 2019-09-16 12:20:46
因为当您调用mlb.fit([y_train])时,您不会将训练数据传递给MultiLabelBinarizer,而是传入一个只有一个元素的数组,该数组就是您的训练数据。这就解释了为什么你的类很奇怪--每个“类”都是你的“样本”之一:
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]等等-它将每个样本解释为一个类,并将整个数据集解释为一个样本。
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调用各种函数
mlb.fit(y_train)
mlb.fit_transform(y_train)发布于 2020-06-26 21:57:12
解决了这个问题:
首先,你需要去掉括号/引号:
data['labels']=data['labels'].str.replace("[","")
data['labels']=data['labels'].str.replace("]","")
data['labels']=data['labels'].str.replace("'","")在此之后,您需要在逗号之间定义类:
one_hot = MultiLabelBinarizer()
y_classes = one_hot.fit_transform(data['labels'].str.split(', '))现在您已经有了编码的标签。这解决了我的问题,这个问题和你的非常相似。
https://stackoverflow.com/questions/57917936
复制相似问题