【机器学习笔记 Ⅱ】8 多标签和多类别
多标签分类(Multi-label Classification) vs 多类别分类(Multi-class Classification)
以下是两者的核心区别、应用场景及技术实现的系统对比:
1. 定义与核心区别
特性 | 多类别分类(Multi-class) | 多标签分类(Multi-label) |
---|---|---|
标签性质 | 类别互斥(一个样本仅属于一个类别) | 类别独立(一个样本可同时属于多个类别) |
输出形式 | 单标签(如“猫”或“狗”) | 多标签(如“猫”和“阳光”同时存在) |
数学表达 | One-hot向量(只有一个1,其余为0) | 二进制向量(多个位置可为1) |
示例任务 | MNIST手写数字识别(0~9) | 图像标签(“人物+沙滩+日落”) |
2. 应用场景对比
(1) 多类别分类
- 场景:目标类别互斥,必须选择唯一答案。
- 手写数字识别(0~9)
- 新闻主题分类(政治/经济/体育)
- 垃圾邮件检测(垃圾/非垃圾)
(2) 多标签分类
- 场景:目标属性可同时存在。
- 图像标注(“人物+狗+公园”)
- 电影类型分类(“科幻+喜剧”)
- 医学诊断(“糖尿病+高血压”)
3. 模型输出与损失函数
组件 | 多类别分类 | 多标签分类 |
---|---|---|
输出层激活函数 | Softmax(概率和为1) | Sigmoid(每个类别独立概率) |
损失函数 | 分类交叉熵(Categorical Cross-Entropy) | 二元交叉熵(Binary Cross-Entropy) |
预测解码 | argmax 取概率最高的类别 | 设定阈值(如0.5),概率超阈值的标签均选中 |
代码对比:
# 多类别分类(Softmax + CCE)
model.add(Dense(10, activation='softmax')) # MNIST 10类
model.compile(loss='categorical_crossentropy')# 多标签分类(Sigmoid + BCE)
model.add(Dense(5, activation='sigmoid')) # 5个可能标签
model.compile(loss='binary_crossentropy')
4. 标签格式示例
(1) 多类别(One-hot编码)
y_true = [0, 2, 1] # 原始标签(3个样本)
y_one_hot = [[1, 0, 0], # 类别0[0, 0, 1], # 类别2[0, 1, 0] # 类别1
]
(2) 多标签(二进制向量)
y_multilabel = [[1, 0, 1], # 同时属于类别0和2[0, 1, 1], # 类别1和2[1, 1, 0] # 类别0和1
]
5. 评估指标差异
指标 | 多类别分类 | 多标签分类 |
---|---|---|
准确率(Accuracy) | 严格匹配(预测类别 = 真实类别) | 子集准确率(所有标签完全匹配) |
F1分数 | 宏平均/微平均F1(按类别计算) | 样本级平均F1(每个样本的标签组合计算) |
Hamming Loss | 不适用 | 错误预测的标签比例(越小越好) |
多标签评估示例:
from sklearn.metrics import hamming_loss
y_true = [[1, 0, 1], [0, 1, 1]]
y_pred = [[1, 1, 0], [0, 0, 1]]
print(hamming_loss(y_true, y_pred)) # 输出 0.5(50%标签错误)
6. 解决多标签问题的技术
(1) 问题转换方法
- 二元关联(Binary Relevance):为每个标签训练独立的二分类器。
- 标签组合(Label Powerset):将多标签组合为单类别(可能类别爆炸)。
(2) 专用算法
- Classifier Chains:标签间建立依赖关系(序列预测)。
- 神经网络输出层:直接使用Sigmoid激活 + 二元交叉熵。
(3) 深度学习模型
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Densemodel = Sequential([Dense(64, activation='relu', input_shape=(100,)),Dense(10, activation='sigmoid') # 10个可能标签
])
model.compile(loss='binary_crossentropy', optimizer='adam')
7. 总结
-
多类别分类:
- 核心:互斥类别,Softmax输出。
- 适用:必须单选的任务(如数字识别)。
-
多标签分类:
- 核心:非互斥标签,Sigmoid输出。
- 适用:多属性共存的任务(如图像标注)。
关键记忆点:
- 多类别用Softmax,多标签用Sigmoid。
- 多标签的评估更复杂(需关注部分匹配或Hamming Loss)。
- 两者可互相转换(如将多标签拆分为多个二分类问题)。