caemanuela/fake-news-classification

GitHub: caemanuela/fake-news-classification

这是一个针对假新闻检测的自然语言处理对比分析项目,通过深度剖析机器学习模型在基准数据上的「快捷学习」现象,验证并提升了基于 DistilBERT 的分类器在分布外数据中的泛化能力。

Stars: 0 | Forks: 0

# 假新闻分类:快捷学习与分布外泛化 本项目是一个由两个 Notebook 组成的 NLP 分析项目,基于 Kaggle 的[真假新闻数据集](https://www.kaggle.com/datasets/clmentbisaillon/fake-and-real-news-dataset)。 项目的目标不仅是分类假新闻,更是为了探究高基准测试性能是否反映了真正的泛化能力,还是仅仅源自快捷学习。 本项目作为个人的机器学习/NLP 作品集项目开发,重点关注数据集偏差、经典机器学习基线、transformer 微调以及鲁棒性评估。 ## 项目动机 假新闻分类在基准数据集上通常被报告为一项高准确率的任务。然而,在探索性数据分析过程中,该数据集显示出反复出现的人为痕迹和特定来源的模式,特别是真实新闻中路透社风格的格式,以及假新闻中的格式或词汇模式。 因此,本项目提出了一个更具批判性的问题: 为了回答这个问题,本项目比较了: 1. 在标题加上文章正文上训练的经典机器学习模型。 2. 仅在新闻标题上训练的微调 DistilBERT 模型。 3. 一个包含真实路透社/AP 新闻标题和合成假新闻标题的自定义分布外评估集。 ## 仓库结构 ``` . ├── .gitignore ├── 01_eda_ml_models_comparison.ipynb ├── 02_distilbert_generalization.ipynb ├── LICENSE ├── README.md └── requirements.txt ``` 原始的 Kaggle CSV 文件不包含在代码仓库中。为了复现这些 Notebook,请将它们在本地放置为: ``` dataset/Fake.csv dataset/True.csv ``` 对于 DistilBERT Notebook 的 Colab 版本,这些文件也可以从 Google Drive 中加载。 ## Notebook 1/2:EDA 与经典机器学习基线 第一个 Notebook 构建了一个完整的经典 NLP 流水线,并利用它揭示了基准准确率的局限性。 主要步骤: - 加载并合并 Kaggle 的真假新闻文件,带有二元标签:`0 = Fake`,`1 = Real`。 - 对类别分布、标点符号模式、词频、文章长度和标题/正文结构进行了探索性数据分析 (EDA)。 - 识别了数据集中反复出现的人为痕迹,包括与路透社相关的来源模式和格式痕迹。 - 应用了包含 NLTK 词形还原、停用词移除、TF-IDF 向化以及针对性正则表达式清洗的预处理。 - 使用 3 折交叉验证训练并调优了 XGBoost、LinearSVC 和 MLP 模型。 ### 经典机器学习设置 经典模型是在组合的标题和文章正文文本上进行训练的。 关键的预处理和向化选择: - `train_test_split(test_size=0.25, random_state=42, stratify=y)` - 使用 NLTK 进行 WordNet 词形还原 - 英文停用词移除 - TF-IDF 向化参数为: - `max_features=1000` - `max_df=0.5` - `ngram_range=(1, 2)` - 英文停用词 超参数调优: - `GridSearchCV` - `cv=3` - `scoring="accuracy"` 最佳经典模型配置: | 模型 | 最佳参数 | |---|---| | XGBoost | `learning_rate=0.2`, `max_depth=5`, `n_estimators=100`, `subsample=0.8` | | LinearSVC | `C=1`, `penalty="l1"` | | MLP | `hidden_layer_sizes=(32,)`, `alpha=0.01`, `learning_rate_init=0.01` | ### 经典机器学习基准结果 所有三个模型在 Kaggle 测试集上均取得了极高的分布内性能。 | 模型 | 准确率 | 精确率 | 召回率 | F1分数 | |---|---:|---:|---:|---:| | XGBoost | 98.45% | 98.32% | 98.42% | 98.37% | | LinearSVC | 98.23% | 97.88% | 98.40% | 98.14% | | MLP | 98.30% | 98.24% | 98.17% | 98.21% | 乍一看,这些结果非常出色。然而,EDA 和特征分析表明,模型很可能利用了数据集特定的信号,例如与路透社相关的 token、格式模式、URL、图片引用以及反复出现的政治措辞。 ### 自定义鲁棒性测试 为了评估泛化能力,我创建了一个包含 40 个标题的小型自定义基准测试: - 20 个合成假标题,模仿真实的新闻风格生成。 - 20 个来自路透社和 AP News 的真实标题。 - 主题包括政治新闻以及气候/可持续发展/能源新闻。 在这个自定义的分布外测试集上,经典 ML 模型的性能急剧下降: | 模型 | 准确率 | 精确率 | 召回率 | F1分数 | |---|---:|---:|---:|---:| | XGBoost | 0.350 | 0.000 | 0.000 | 0.000 | | LinearSVC | 0.350 | 0.312 | 0.250 | 0.278 | | MLP | 0.275 | 0.235 | 0.200 | 0.216 | 这证实了 Notebook 1 的主要发现:高基准准确率不足以证明真正的泛化能力。经典模型学习了针对 Kaggle 分布有用的模式,但在评估更多样化的标题时却失败了。 ## Notebook 2/2:DistilBERT 微调与泛化 第二个 Notebook 测试了基于 transformer 的模型是否能比基于 TF-IDF 的经典 ML 模型更好地泛化。 选择 DistilBERT 是因为它比 BERT 更轻量,同时仍能提供上下文 token 表示。为了减少计算量并使训练在 Google Colab 上可行,该模型仅在新闻标题上进行了训练。 ### DistilBERT 设置 基础模型: - `distilbert-base-uncased` 输入设置: - 仅标题 - `max_length=256` - Hugging Face `Dataset` 格式 - 带有 `input_ids`、`attention_mask` 和 `label` 的 PyTorch 张量 训练/测试集划分: - `test_size=0.25` - `random_state=42` - `stratify=y` 正则化和微调选择: - `dropout=0.3` - `attention_dropout=0.3` - `weight_decay=0.1` - 通过 `optim="adamw_torch"` 使用的 AdamW 优化器 - `learning_rate=2e-5` - `num_train_epochs=3` - `per_device_train_batch_size=16` - `per_device_eval_batch_size=16` - 余弦学习率调度器 - `warmup_ratio=0.1` - 带有 `early_stopping_patience=1` 的早停机制 - `load_best_model_at_end=True` - 通过 `eval_loss` 选择最佳模型 该 Notebook 还将微调后的模型和分词器保存到了 Google Drive,因此 GPU 训练步骤只需运行一次。之后,可以快速重新加载该模型以进行评估或推理(包括在 CPU 上)。 ### DistilBERT 基准结果 在 Kaggle 测试集上,DistilBERT 取得了稳健且均衡的分布内性能: | 类别 | 精确率 | 召回率 | F1分数 | 支持数 | |---|---:|---:|---:|---:| | Fake | 0.99 | 0.97 | 0.98 | 4477 | | Real | 0.98 | 0.99 | 0.98 | 5300 | 总体基准结果: | 指标 | 分数 | |---|---:| | 准确率 | 0.98 | | 宏观 F1 | 0.98 | | 加权 F1 | 0.98 | 这些结果表明,该模型有效地学习了分布内分类任务。然而,更重要的测试是使用与 Notebook 1 中相同的自定义基准测试。 ### DistilBERT 自定义基准结果 在自定义的分布外基准测试中,DistilBERT 取得了以下成绩: | 类别 | 精确率 | 召回率 | F1分数 | 支持数 | |---|---:|---:|---:|---:| | Fake | 0.75 | 0.60 | 0.67 | 20 | | Real | 0.67 | 0.80 | 0.73 | 20 | 总体自定义结果: | 指标 | 分数 | |---|---:| | 准确率 | 0.70 | | 宏观 F1 | 0.70 | | 加权 F1 | 0.70 | 与经典 ML 基线相比,DistilBERT 在自定义测试集上的泛化能力要好得多。 最大的改进体现在真实新闻检测上。该模型对真实类别的召回率很高,并且能够非常可靠地识别出路透社风格的真实标题,即使它们来自原始训练/测试集划分之外的样本。 该模型仍然显示出一些局限性: - 它在处理 AP News 标题时更加困难,可能是因为其风格和结构与 Kaggle 数据集中以路透社为主的模式差异较大。 - 它在识别一些以正式新闻风格撰写的合成假标题时感到棘手。 - 在自定义测试集上,假新闻的召回率低于真实新闻的召回率,这表明逼真的格式仍然会影响模型。 ## 主要发现 1. 经典 ML 模型达到了约 98% 的基准性能,但在分布外样本上失败了。 2. EDA 和特征分析揭示了 Kaggle 数据集中存在严重的快捷学习风险。 3. 必须使用自定义基准测试来揭示基准准确率与真实泛化能力之间的差距。 4. 经过带正则化微调的 DistilBERT,其泛化能力显著优于基于 TF-IDF 的模型。 5. 该 transformer 模型在识别原始分布之外的真实路透社风格标题方面特别强大,尽管 AP News 和逼真的假标题仍然具有挑战性。 ## 未来工作:包含 LLM 提示的 Notebook 3 一个自然的下一步是添加第三个 Notebook,重点在于使用大型语言模型进行提示。 这将使项目更加符合当前 NLP 领域的最先进水平,并允许在以下方法之间进行比较: - 使用 TF-IDF 特征的经典 ML - 使用 DistilBERT 微调的 transformer 分类 - 使用指令微调 LLM 的基于提示的分类 Notebook 3 可能进行的实验: - 零样本提示 - 少样本提示 - 包含明确推理标准的提示模板 - 直接标签预测与基于解释的提示之间的比较 - 在更大、更多样化的自定义基准上进行评估 自定义数据集还应扩展,包含更多的来源、主题和写作风格。这将使鲁棒性评估更加可靠,并有助于区分事实推理、来源风格识别和快捷学习。 ## 展示的技能 - 针对 NLP 数据集的探索性数据分析 - 使用 NLTK 和正则表达式进行文本预处理 - TF-IDF 特征工程 - 经典 ML 模型训练和超参数调优 - 网格搜索和交叉验证 - 使用精确率、召回率、F1 分数和混淆矩阵进行模型评估 - 快捷学习和数据集偏差分析 - 使用 Hugging Face 和 PyTorch 进行 Transformer 微调 - 针对 NLP 微调的正则化策略 - 分布外评估设计 ## 环境依赖 安装所需依赖: ``` pip install -r requirements.txt ``` DistilBERT Notebook 可以在启用 GPU 加速的 Google Colab 上运行。一旦微调后的模型保存到 Google Drive,后续的评估运行即可重新加载检查点,而无需重新训练。 ## 数据集 数据集:[Kaggle 真假新闻数据集](https://www.kaggle.com/datasets/clmentbisaillon/fake-and-real-news-dataset) 所需文件: ``` dataset/Fake.csv dataset/True.csv ``` 数据集文件被排除在版本控制之外,以保持代码仓库轻量化,并避免重新分发外部数据。
标签:Apex, DistilBERT, DLL 劫持, IaC 扫描, Kaggle数据集, Naabu, NLP, Python, Transformer, 传统机器学习基线, 假新闻检测, 内容安全, 凭据扫描, 分布外泛化, 合成数据, 大语言模型, 快捷学习, 探索性数据分析, 数据偏见, 数据科学, 数据集构建, 文本分类, 无后门, 机器学习, 模型微调, 泛化能力, 深度学习, 特征工程, 网络安全应用, 虚假信息治理, 资源验证, 逆向工具, 鲁棒性评估