Fasttext - 直接训练 - 代码实现
1 课程概览
本课实现 Fasttext 文本分类。文本分类是将文档分配给一个或多个类别,需要有监督学习。分类种类:二分类、单标签多分类、多标签多分类。案例:烹饪数据集。流程:获取数据 → 训练集和验证集划分 → 训练模型 → 预测评估 → 调优 → 保存重加载。
2 核心概念与定义
- 文本分类:将文档分配给一个或多个类别,有监督学习。
- 二分类:A 或 B。
- 单标签多分类:文本被分为多个类别中的一个。
- 多标签多分类:文本被分为多个类别中的多个,转成多个二分类问题解决。
3 模型与算法详解
文本分类种类
| 类型 | 说明 | 损失函数 |
|---|---|---|
| 二分类 | A 或 B | BCE Loss(二元交叉熵) |
| 单标签多分类 | 多个类别中的一个 | Cross Entropy Loss(多分类交叉熵) |
| 多标签多分类 | 多个类别中的多个 | 转成多个二分类,用 BCE Loss |
损失函数选择
| 类型 | 损失函数 | 说明 |
|---|---|---|
| 二分类 | BCE Loss | 二元交叉熵 |
| 单标签多分类 | Cross Entropy Loss | 多分类交叉熵(softmax) |
| 多标签多分类 | BCE Loss | 转成多个二分类 |
多标签多分类解决方案
实际开发中,转成多个二分类问题解决。
- 每个类别单独判断是和否
- 5 个分类 → 5 个二分类问题
- 本质:多个独立的二分类判断
案例流程
1. 获取数据
2. 训练集和验证集划分
3. 训练模型
4. 预测并评估模型
5. 调优
6. 保存和重加载
烹饪数据集
| 文件 | 说明 |
|---|---|
| cooking_train.txt | 未处理的训练集 |
| cooking_validate.txt | 未处理的验证集 |
| cooking_pre_train.txt | 处理后的训练集 |
| cooking_pre_validate.txt | 处理后的验证集 |
4 数学原理与推导
二分类交叉熵(BCE Loss)
$$L = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)]$$
多分类交叉熵(Cross Entropy Loss)
$$L = -\sum_{i=1}^{N} y_i \log(\hat{y}_i)$$
5 代码示例
import fasttext
def dm01_fasttext_train():
"""Fasttext 直接训练"""
# 1. 获取数据并训练模型
model = fasttext.train_supervised(
input="data/cooking_train.txt", # 训练数据
epoch=25, # 训练轮数
lr=1.0, # 学习率
wordNgrams=2 # n-gram 特征
)
# 2. 预测
result = model.predict("Which baking dish is best to bake a banana bread ?")
print(f"预测结果: {result}")
# 3. 评估
metrics = model.test("data/cooking_validate.txt")
print(f"样本数: {metrics[0]}")
print(f"Precision@1: {metrics[1]}")
print(f"Recall@1: {metrics[2]}")
return model
def dm02_test_predict(model):
"""测试预测"""
# 预测多个句子
sentences = [
"Why not put knives in the dishwasher?",
"How to bake a cake?",
"What is the best way to cook pasta?"
]
for sent in sentences:
result = model.predict(sent)
print(f"句子: {sent}")
print(f"预测: {result}\n")
# 测试
if __name__ == "__main__":
# 训练模型
model = dm01_fasttext_train()
# 测试预测
dm02_test_predict(model)
代码说明
| 代码 | 说明 |
|---|---|
fasttext.train_supervised() | 训练文本分类模型 |
input | 训练数据路径 |
epoch | 训练轮数 |
lr | 学习率 |
wordNgrams | n-gram 特征 |
model.predict() | 预测 |
model.test() | 评估,返回 (样本数, Precision, Recall) |
6 重难点与易错提醒
- ❗重点:文本分类需要有监督学习(需要标签)。
- ❗重点:多标签多分类转成多个二分类问题解决。
- ❗重点:二分类用 BCE Loss,单标签多分类用 Cross Entropy Loss。
- ⚠️易错:直接训练精度较低,需要调优。
- 💡深入理解:多标签多分类本质是多个独立的二分类判断。
7 课堂问答精选
Q1:文本分类有哪些种类?
A:①二分类(A 或 B);②单标签多分类(多个类别中的一个);③多标签多分类(多个类别中的多个)。
Q2:不同分类种类的损失函数如何选择?
A:二分类用 BCE Loss(二元交叉熵);单标签多分类用 Cross Entropy Loss(多分类交叉熵);多标签多分类转成多个二分类,用 BCE Loss。
Q3:多标签多分类如何解决?
A:实际开发中,转成多个二分类问题解决。每个类别单独判断是和否,5 个分类就转成 5 个二分类问题。
Q4:Fasttext 训练的流程是什么?
A:获取数据 → 训练集和验证集划分 → 训练模型 → 预测评估 → 调优 → 保存重加载。
8 本课小结
- 文本分类:二分类、单标签多分类、多标签多分类。
- 二分类用 BCE Loss,单标签多分类用 Cross Entropy Loss。
- 多标签多分类转成多个二分类问题解决。
- Fasttext 1 行 API 训练:
fasttext.train_supervised()。 - 直接训练精度较低,需要调优。
9 延伸思考
- 如何优化 Fasttext 模型?
- 数据预处理如何提升精度?