LabelBinarizer 和 MultiLabelBinarizer 有什么区别?

数据挖掘 Python 分类 scikit-学习 多标签分类
2022-02-21 23:19:22

我试图了解输出变量的两种标签编码技术之间的区别。我已经阅读了一些东西,但仍然无法清楚地了解它们的不同之处。我们也可以将它们应用于自变量。

这是我正在进行的一个项目,我必须Roles为每个观察结果进行预测。大约有 15k 个独特的角色,每个输出变量都有 3-20 个角色组合。这就是二值化器发挥作用的地方。

现在当我这样做时

m=MultiLabelBinarizer()

ytrain=m.fit_transform(ytrain)
yval=m.transform(yval)

这是我收到的警告,但我知道这些标签不存在于我的训练集中,这也可以避免泄漏,但同时这不会影响我的模型的性能。

'Senior Android Engineer', 'Senior Asset Manager', 'Senior Billing Manager', 'Senior Buyer', 'Senior Finance Analyst', 'Senior Manager Technical', 'Senior Nodejs Developer', 'Senior Optometrist', 'Senior Procurement Manager', 'Senior Revenue Assurance', 'Senior Visual Designer', 'Service Delivery Consultant', 'Shop Assistant', 'Site Deployment', 'Software Lead Tester', 'Solar Design Engineer', 'Sous Chef', 'Specialist Support Worker', 'Storage And Backup Engineer', 'Subject Matter Expert Data Science', 'Support Accountant', 'Support Engineer Information Technology', 'Sustainability Coordinator', 'System Support Specialist', 'Systems Developer', 'Team Lead Business Developer', 'Team Leader IT', 'Technical Operations Manager', 'Telecommunications Engineer', 'Telemetry Technician', 'Training and Competence Manager', 'Tutor', 'VP Production', 'Vice President Internal Audit', 'Vice President Investor Relations', 'Visual FoxPro Developer', 'Web Marketing Specialist', 'Web Producer', 'Welding Inspector', 'Work Life'] will be ignored
  warnings.warn('unknown class(es) {0} will be ignored'

所以我想知道这是正确的使用方式MultiLabelBinarizer还是有其他处理方式。

感谢任何链接、模块或答案。谢谢!!

2个回答

当有分类任务时,两者都在一对多的方案中。

LabelBinarizer它将每个变量转换为矩阵中的二进制,其中该变量表示为一列。换句话说,它将一个列表变成一个矩阵,其中目标矩阵中的列数与输入集中的唯一值一样多。如果您的输入标签看起来像[1, 4, 5]生成的矩阵,则它是一个 3 列矩阵,每个1, 4, 5都是一列。那么如果您的实例(观察)是 1、4、5 中的任何一个,则将指示(二进制)该实例是否对应于标签 1、4 或 5。

您用于LabelBinarizer构建常规分类器,例如训练逻辑回归并创建可以使用的响应变量

from sklearn.preprocessing import LabelBinarizer
lb = LabelBinarizer()
lb.fit_transform(['yes', 'no', 'no', 'yes'])

输出是

array([[1],
       [0],
       [0],
       [1]])

或者如果您的特征列是 ['red', 'red', 'green', 'blue', 'blue']

array([[1, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [0, 0, 1],
       [0, 0, 1]])

MultiLabelBinarizer- 做类似的事情,但是当你有多个标签时。你什么时候有多个标签?例如,当您进行 mu 多标签分类时。假设您正在构建一个分类器来预测 StackoverFlow 上问题的标签。您的数据如下所示

   qId              Tag
0   1                       c#
1   2                     python
2   2                 machine_learning
3   2                     pandas
4   2                      nlp

但是您必须将其转换为可以进行机器学习的格式(每次观察一行)

qId C# Python 机器学习 熊猫 nlp
1 1 0 0 0 0
2 0 1 1 1 1

你会用

import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer

question_tags = pd.read_csv("question_tags.csv")
print(question_tags.head())
mlb = MultiLabelBinarizer()
print(mlb.fit_transform(question_tags))

我希望这可以消除实践中的差异

更新你的情况

您如何解析您的 15K 独特角色以获得这 3 个类别或组合?是像,资历,部门,角色如果是这样,你不应该让它像

question_tags = [{'Senior', 'Android', 'Engineer'}, {'Senior', 'Asset', 'Manager'}, {'Senior', 'Billing', 'Manager'}] 

然后将其传递给

mlb = MultiLabelBinarizer()
res = pd.DataFrame(mlb.fit_transform(question_tags), columns=mlb.classes_)

你最终会得到

在此处输入图像描述

这表明所有三个都是高级,第 2 和第 3 是经理等等?

更新 2

如果您没有解析它并且基本上只需要对 15K 个唯一标签中的每一个进行编码,那么您可以使用二进制文件。例如,您有四个观察结果,其中两个是高级 android 工程师。

question_tags = ['Senior Android Engineer','Senior Android Engineer', 'Senior Asset Manager',  'Senior Billing Manager'] 
lb = LabelBinarizer()
pd.DataFrame(lb.fit_transform(question_tags), columns = lb.classes_)

在此处输入图像描述

Scikit-learn 的LabelBinarizer将输入标签转换为二进制标签,每个示例是否属于单个类。

Scikit-learn 的MultiLabelBinarizer 将输入标签转换为多标签标签,每个示例可以属于多个类。