# 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), } ```