Fasttext 优化 - 多分类多标签任务
1 课程概览
本课讲解 Fasttext 多标签多分类任务。在生产环境中,多标签多分类问题一般拆解成多个二分类问题解决。使用 loss='ova'(One vs All,1 对所有)。预测时用 k 指定预测标签数量,threshold 指定阈值,只有大于阈值的标签才会被保留。
2 核心概念与定义
- ova(One vs All):1 对所有,多标签多分类的损失函数。
- k:预测的标签数量。
- threshold:阈值,只有大于该阈值的标签才会被保留。
3 模型与算法详解
多标签多分类解决方案
在生产环境中,多标签多分类拆解成多个二分类问题解决。
- 一条数据有多个标签
- 拆成多个二分类问题:有还是没有这个标签
- 例如:男/女、湖北人/非湖北人、武汉人/非武汉人
ova 损失函数
One vs All,1 对所有。
- 把多标签多分类拆成多个二分类问题
- 每个标签单独判断是和否
- 使用逻辑回归
预测参数
| 参数 | 说明 | 示例 |
|---|---|---|
| k | 预测的标签数量 | k=3 |
| threshold | 阈值,大于该值才保留 | threshold=0.5 |
预测流程
1. 模型计算每个标签的概率
2. 筛选概率大于阈值(0.5)的标签
3. 从中选取概率最高的 k 个标签
4. 如果不够 k 个,就有几个留几个
预测示例
假设有 7 个标签,概率分别为 0.8, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1。
| 步骤 | 说明 | 结果 |
|---|---|---|
| 1. 计算概率 | 7 个标签的概率 | 0.8, 0.7, 0.6, 0.4, 0.3, 0.2, 0.1 |
| 2. 筛选阈值 | 大于 0.5 | 0.8, 0.7, 0.6(3 个) |
| 3. 选取 k 个 | k=3 | 0.8, 0.7, 0.6(3 个) |
4 数学原理与推导
ova 损失函数
每个标签独立计算二分类损失。
$$L = \sum_{i=1}^{K} \text{BCE}(y_i, \hat{y}_i)$$
其中:
- $K$ 是标签数量
- $y_i$ 是第 $i$ 个标签的真实值(0 或 1)
- $\hat{y}_i$ 是第 $i$ 个标签的预测概率
预测
$$\text{labels} = \text{topk}({y_i : y_i > \text{threshold}}, k)$$
5 代码示例
import fasttext
def dm08_multi_label():
"""多标签多分类任务"""
# 训练模型(使用 ova 损失函数)
model = fasttext.train_supervised(
input="data/cooking_pre_train.txt",
epoch=25, # 训练轮数
lr=0.2, # 学习率
wordNgrams=2, # n-gram 特征
loss='ova' # 损失函数:ova(One vs All)
)
# 预测(多标签)
result = model.predict(
"Which baking dish is best to bake a banana bread ?",
k=3, # 预测 3 个标签
threshold=0.5 # 阈值:大于 0.5 才保留
)
print(f"预测结果: {result}")
# 评估
metrics = model.test("data/cooking_pre_validate.txt")
print(f"Precision@1: {metrics[1]}")
print(f"Recall@1: {metrics[2]}")
return model
# 测试
if __name__ == "__main__":
print("=== 多标签多分类任务 ===")
model = dm08_multi_label()
代码说明
| 代码 | 说明 |
|---|---|
loss='ova' | 损失函数:One vs All |
k=3 | 预测 3 个标签 |
threshold=0.5 | 阈值:大于 0.5 才保留 |
6 重难点与易错提醒
- ❗重点:多标签多分类使用
loss='ova'。 - ❗重点:k 指定预测标签数量,threshold 指定阈值。
- ⚠️易错:如果不够 k 个标签,就有几个留几个。
- 💡深入理解:ova 把多标签拆成多个二分类问题。
7 课堂问答精选
Q1:多标签多分类如何解决?
A:在生产环境中,多标签多分类拆解成多个二分类问题解决。使用 loss='ova'(One vs All),每个标签单独判断是和否。
Q2:ova 是什么?
A:ova 是 One vs All(1 对所有),多标签多分类的损失函数。把多标签拆成多个二分类问题,使用逻辑回归。
Q3:预测时如何控制标签数量?
A:用 k 指定预测标签数量(如 k=3),用 threshold 指定阈值(如 0.5)。只有大于阈值的标签才会被保留,从中选取概率最高的 k 个。
Q4:如果大于阈值的标签不够 k 个怎么办?
A:就有几个留几个。k 是期望数量,但实际数量取决于大于阈值的标签数量。
8 本课小结
- 多标签多分类:拆成多个二分类问题解决。
- 使用
loss='ova'(One vs All)。 - 预测参数:k(标签数量)、threshold(阈值)。
- 只有大于阈值的标签才会被保留。
- 不够 k 个就有几个留几个。
9 延伸思考
- 如何保存和加载模型?
- 模型保存后如何复用?