# Summary
1. 数据和特征决定了机器学习的上限,而模型和算法只是在逼近这个上限
2. 解决 data 如何变成类似[[embedding]]的数字序列的问题
# Cues
# Notes
# 一、在传统机器学习 vs 深度学习中的区别
## 1.1 🔧 传统机器学习(如逻辑回归、随机森林)
传统机器学习不会"看懂"文本。传统[[机器学习ML@]]模型的本质:传统模型(逻辑回归、随机森林、SVM等)只能处理数字,而且是通过**简单的数学运算**。
所以需要将文字手动定义成数字的特征向量,单个特征信息太少,特征工程非常关键,需要手工设计大量特征,让特征尽可能丰富。
```Java
features = {
'text_length': 55, # 长度
'has_click_here': 1, # 有"click here"
'has_url': 0, # 有链接吗
'exclamation_count': 2, # 感叹号数量
'all_caps_ratio': 0.0, # 全大写比例
'has_bank': 1, # 包含"bank"
'has_spam_words': 1, # 包含垃圾词汇
'word_count': 11, # 词语数
'avg_word_length': 4.5, # 平均词长
# ... 可能需要几十上百个特征
}
# 现在是数字向量了!模型可以用
X = [55, 1, 0, 2, 0.0, 1, 1, 11, 4.5, ...]
```
```Java
# 传统特征工程示例
features = {
'text_length': len(text),
'has_url': int('http' in text),
'has_exclamation': int('!' in text),
'num_caps': sum(c.isupper() for c in text),
'word_count': len(text.split()),
'subreddit_encoded': label_encode(subreddit),
# 可能需要几十甚至上百个手工特征...
}
```
## 1.2 🤖 深度学习
特征工程简化了,BERT 会自动学习特征:
```Java
# 你的特征工程:简单拼接即可
text = f"{subreddit} [SEP] {rule} [SEP] {body}"
```
核心原因:
[[BERT]]的[[自注意力机制 Self-attention]]内部会自动学习:
- 词语的语义关系
- 上下文信息
- subreddit 和 rule 的关联
- body 中的违规模式
- ...(几百种隐藏特征)
```Java
输入: "Banks don't want you to know this! Click here..."
Layer 1: 学习基础词义
- "Banks" → [金融机构]
- "Click" → [点击动作]
- "here" → [位置指示]
Layer 2: 学习词组关系
- "Click here" → [常见于垃圾信息]
- "don't want you to know" → [煽动性语言]
Layer 3: 学习句子语义
- 整体语气:煽动性的
- 意图:吸引点击
Layer 4-12: 学习更复杂的模式
- 这是典型的垃圾广告模式
- 与规则"No Advertising"冲突
最后: 判断
- rule_violation = 1
```
# 二、你可以尝试的其他特征工程方法 🚀
虽然 BERT 能自动学习特征,但你仍然可以尝试:
## 2.1 更好的文本组合方式
```Java
# 当前:简单拼接
text = f"{subreddit} [SEP] {rule} [SEP] {body}"
# 尝试:添加语义提示
text = f"Subreddit: {subreddit} [SEP] Rule: {rule} [SEP] Comment: {body}"
# 尝试:利用正负例样本
text = f"{subreddit} [SEP] {rule} [SEP] Positive: {pos_ex1} [SEP] Negative: {neg_ex1} [SEP] Comment: {body}"
```
## 2.2 [[数据增强]](也算特征工程的一部分)
# 同义词替换
# 回译(EN→FR→EN)英语 → 翻译成法语 → 再翻译回英语。这样得到的句子意思相同,但表达方式不同!
# 随机删除词语
## 2.3 文本清洗
# 去除 HTML 标签
# 统一 URL 为` [URL]`
# 处理特殊字符
## 2.4 添加元特征
# 虽然 BERT 主要看文本,但可以在分类器层添加额外特征
```Java
features = {
'text_embedding': bert_output,
'text_length': len(text),
'subreddit_id': encode(subreddit),
}
```