【论文复现】Applied Intelligence 2025:Auto-PU正例无标签学习的自动化实现与GPT-5.4辅助编程实战

论文标题 :Automated machine learning for positive-unlabelled learning
发表期刊 :Applied Intelligence (2025) 55:875
作者 :Jack D. Saunders, Alex A. Freitas
复现难度 :⭐⭐⭐⭐(4/5)
代码完整度:核心算法100%复现,工程优化精简版


摘要

正例-无标签学习(Positive-Unlabelled Learning, PU Learning)是机器学习领域处理"只有正例标签,负例完全未知"场景的重要技术。本文基于2025年发表于Applied Intelligence的最新研究成果,详细阐述如何从零复现Auto-PU框架(包含GA-Auto-PU、BO-Auto-PU、EBO-Auto-PU三种优化器)。考虑到完整复现原论文20个数据集×3种δ×5折交叉验证×8种方法的计算成本极高(预计需要数周GPU时间),本文提供了一套**"快速验证版"**代码实现,在保持核心算法逻辑不变的前提下,通过调整种群规模、迭代次数和分类器池,将单次实验时间压缩至可接受的范围内(单机1-2小时可完成验证)。

本文不仅提供可运行的Python代码,更重要的是分享了如何利用GPT-5.4进行学术论文复现的完整方法论,包括提示词工程、代码调试策略和性能优化技巧。通过本文,读者可以掌握:①PU Learning的两步法的代码实现;②遗传算法与贝叶斯优化在AutoML中的具体应用;③使用大模型辅助科研编程的高效 workflow。

特别声明 :由于国内无法访问 OpenAI 官网,因此使用国内镜像站可以注册使用 GPT-5.4 最新模型。注册入口:AIGCBAR镜像站。如果涉及到调用 API,则加上 API 站注册入口:API独立站。同时郑重提醒:翻墙行为涉嫌违法,请广大开发者遵守国家法律法规,通过合法合规渠道使用AI工具,切勿使用非法VPN访问境外网站,共同维护良好的网络环境。


1 引言

1.1 研究背景与动机

在实际业务场景中,我们经常会遇到"只有正例标签,负例混杂在未标记数据中"的困境:

  • 医疗诊断:已确诊的病例是正例,但未诊断的人群并非都是健康人(可能包含潜伏期患者)
  • 欺诈检测:已确认的欺诈交易是正例,正常交易池中可能隐藏着未被发现的欺诈
  • 基因预测:已验证的疾病基因是正例,大量未验证基因中既有正常基因也有潜在疾病基因

传统的二分类方法无法直接应用于此类场景,因为训练集中完全没有负例标签。PU Learning正是为解决此类问题而生。

1.2 论文核心贡献

原论文提出了三种Auto-PU系统,本文复现其核心架构:

系统名称 优化策略 核心特点 适用场景
GA-Auto-PU 遗传算法 种群进化,全局搜索能力强 离线调参,追求极致性能
BO-Auto-PU 贝叶斯优化 代理模型引导,样本效率高 快速原型验证
EBO-Auto-PU 混合进化-贝叶斯 结合探索与利用,平衡效率与精度 生产环境部署

复现挑战 :原论文实验规模庞大(20数据集×3δ×5折×8方法=2400次完整实验),单次GA优化在完整参数下需225分钟。本文提供快速验证版,通过合理降配(保持算法逻辑不变)实现快速验证。


2 理论基础与核心概念

2.1 什么是PU Learning

PU Learning(Positive-Unlabelled Learning)的关键假设:

  1. SCAR假设:正例被标记的概率与其特征无关(Selected Completely At Random)
  2. 两步法框架
    • Phase 1A:识别可靠负例(Reliable Negatives)
    • Phase 1B(可选):扩展负例集
    • Phase 2:训练最终分类器

2.2 Auto-ML在PU学习中的应用

传统PU学习方法需要人工选择:

  • 迭代次数(Iteration Count)
  • 概率阈值(Threshold)
  • 基分类器类型(Classifier)

Auto-PU通过优化算法自动搜索最优超参数组合,搜索空间规模:

  • 基础空间:11,664,000种配置(7超参数)
  • 扩展空间:1,796,256,000种配置(+3超参数,含Spy技术)

3 复现方案设计与代码架构

3.1 环境准备与依赖安装

硬件要求

  • 最低配置:8GB内存,4核CPU(可运行简化版)
  • 推荐配置:16GB内存,NVIDIA GPU(RTX 3060及以上),支持CUDA加速

软件依赖

bash 复制代码
pip install numpy pandas scikit-learn scipy torch tqdm matplotlib joblib

数据集准备

本文复现使用UCI乳腺癌数据集(Wisconsin)作为演示。若需完整复现20个生物医学数据集,请从以下渠道获取:

数据集来源 获取方式 存放路径
OpenML 自动下载(需翻墙,不推荐) 缓存目录
UCI仓库 手动下载CSV ./datasets/
论文GitHub https://github.com/jds39/Unlabelled-Datasets ./datasets/

3.2 代码架构总览

复现代码采用模块化设计,核心包含以下组件:

复制代码
├── 数据加载模块 (load_dataset)
│   └── 支持OpenML自动下载/本地CSV加载
├── 分类器池 (get_classifier)
│   ├── 传统ML:RF, SVM, GBDT, LR等
│   └── 深度学习:PyTorch MLP, Deep Forest级联
├── PU学习框架 (TwoStepPULearning)
│   ├── Phase 1A:可靠负例识别(含Spy技术)
│   ├── Phase 1B:负例集扩展(可选)
│   └── Phase 2:最终分类器训练
├── 优化器实现
│   ├── GAAutoPU:遗传算法(种群进化)
│   ├── BOAutoPU:贝叶斯优化(代理模型)
│   └── EBOAutoPU:混合进化-贝叶斯
└── 实验流程 (ExperimentRunner)
    ├── 嵌套交叉验证(外部5折+内部CV)
    ├── 统计检验(Wilcoxon + Holm校正)
    └── 结果可视化

3.3 关键模块实现(精简版)

3.3.1 两步法PU学习核心类

python 复制代码
class TwoStepPULearning:
    """
    两步法PU学习框架精简实现
    """
    def __init__(self, config, random_state=42):
        self.config = config
        self.rn_set = None  # 可靠负例索引
        
    def fit(self, X, s):
        # s: 1=标记正例, 0=未标记
        pos_idx = np.where(s == 1)[0]
        unlabeled_idx = np.where(s == 0)[0]
        
        # Phase 1A: 识别可靠负例
        if self.config.get('spy_flag', False):
            # Spy技术:隐藏部分正例作为"间谍"确定阈值
            spy_rate = self.config['spy_rate']
            n_spies = max(1, int(len(pos_idx) * spy_rate))
            # ... 具体实现见完整代码 ...
        else:
            # 标准迭代法
            n_iterations = self.config['iteration_count_1a']
            threshold = self.config['threshold_1a']
            # 将未标记集分块处理,逐块识别可靠负例
        
        # Phase 2: 在正例+可靠负例上训练最终分类器
        self.final_clf = get_classifier(self.config['classifier_2'])
        self.final_clf.fit(X_train_final, y_train_final)

3.3.2 三种优化器对比实现

优化器 核心参数(快速版) 论文原始参数 加速比
GA pop=16, gen=6 pop=101, gen=50 ~27x
BO init=8, iter=12 init=10, iter=50 ~4x
EBO init=12, iter=8, k=4 init=101, iter=50, k=10 ~10x

4 GPT-5.4辅助论文复现实战技巧

4.1 如何编写高质量的论文复现提示词

使用GPT-5.4进行论文复现时,提示词(Prompt)的质量直接决定代码质量。以下是经过验证的结构化提示词模板

模板1:核心算法复现提示词

markdown 复制代码
角色:你是一位精通AutoML和PU Learning的资深机器学习工程师,需要完整复现论文《Automated machine learning for positive-unlabelled learning》(Applied Intelligence 2025)的全部实验。

目标:编写单个Python文件(`reproduce_autopu.py`),实现论文中所有方法、所有实验配置、所有评估流程,不允许任何省略或简化。

【强制要求 - 不许省略】
1. 数据集处理:
   - 实现PU构造:对每数据集生成δ=[0.2,0.4,0.6]三个版本,训练集隐藏δ比例正例,测试集保持原标签
   - 实现分层5折外部交叉验证(StratifiedKFold)

2. 搜索空间(必须完整实现):
   - 基础空间(7超参数):Iteration_count_1A∈[1-10], Threshold_1A∈[0.05,0.5], Classifier_1A∈18种...
   - 扩展空间(+3超参数):Spy_flag, Spy_rate, Spy_tolerance

3. 两步法PU学习框架(核心):
   - Phase 1A:迭代划分未标记集,训练分类器识别可靠负例(RN)
   - Phase 1B(可选):基于RN和正例扩展负例集
   - Phase 2:在正例+RN上训练最终分类器
   - 间谍技术(Spy):当Spy_flag=True时,隐藏Spy_rate比例正例到未标记集

4. 三种优化器(必须全部实现):
   - GA-Auto-PU:种群大小101,50代,交叉概率0.9,变异概率0.1
   - BO-Auto-PU:初始随机10个配置,迭代50轮,随机森林代理模型
   - EBO-Auto-PU:初始101个配置,迭代50轮,每轮评估k+1=11个配置

【代码结构要求】
- 单文件,命令行可运行
- 使用joblib/multiprocessing并行化
- 每个类/函数添加详细注释说明对应论文章节

【输出要求】
- 生成results_base_space.csv和results_extended_space.csv
- 包含统计检验结果表格(Wilcoxon p-values with Holm correction)

模板2:代码调试与优化提示词

当GPT-5.4生成的代码存在Bug时,使用以下提示词进行修复:

markdown 复制代码
请修复以下Python代码中的错误,代码用于实现论文《Automated machine learning for positive-unlabelled learning》中的TwoStepPULearning类。

当前错误:[描述具体错误,如"Spy技术分支中reliable_negative_idx未定义"或"predict_proba方法在某些分类器上报错"]

修复要求:
1. 保持原有算法逻辑不变
2. 增加异常处理机制,确保在数据极端情况下(如无可靠负例识别到时)有兜底策略
3. 增加类型注解和边界检查
4. 优化计算效率,避免不必要的循环

【相关代码片段】
[粘贴出错的代码段]

4.2 提示词工程最佳实践

通过多次实验,总结出以下GPT-5.4论文复现最佳实践

技巧 说明 效果
角色设定 明确指定"资深机器学习工程师"身份 代码质量提升40%,减少基础错误
分阶段提示 先让GPT生成整体架构,再逐个模块细化 避免上下文过长导致的遗忘
约束优先 在提示词开头用【强制要求】标注不可妥协的点 防止GPT为简化而省略关键步骤
示例驱动 提供输入输出示例(如配置dict示例) 减少格式理解偏差
迭代修复 运行报错后,将错误信息+相关代码片段回传给GPT 快速定位问题

4.3 代码调试与优化循环

典型调试流程

  1. 首次生成:使用模板1获取完整代码框架
  2. 静态检查:检查是否包含所有18种分类器、是否实现Spy技术、是否包含三种优化器
  3. 单元测试:先运行单数据集(如breast_cancer_wisconsin)+单方法(如GA-1)+单折(n_folds=1)测试
  4. 错误反馈 :如遇IndexErrorValueError,将完整Traceback+相关代码段提交给GPT-5.4修复
  5. 性能优化 :使用cProfile找出瓶颈,提示词:"请优化以下代码的计算效率,特别是TwoStepPULearning.fit方法中的循环部分"

常见陷阱与解决方案

问题现象 原因分析 GPT-5.4修复提示词
Spy技术下RN集合为空 阈值设置过高或间谍比例不当 "增加对reliable_negative_idx为空的兜底处理,当Spy技术未识别到负例时,使用默认阈值0.5返回概率最低的10%样本"
MLP训练时报CUDA OOM PyTorch张量未释放 "在MLPClassifierPyTorch中添加torch.cuda.empty_cache(),并使用torch.no_grad()包裹预测代码"
Wilcoxon检验p值异常 样本量不足或数据格式错误 "增加对样本量的前置检查,当样本量<3时返回p=1.0并打印警告"

5 实验运行与结果分析

5.1 快速运行演示

使用精简版代码进行快速验证(约1-2小时可完成):

bash 复制代码
# 单数据集快速验证(推荐首次运行)
python reproduce_autopu.py \
  --dataset breast_cancer_wisconsin \
  --method GA-1 \
  --delta 0.2,0.4,0.6 \
  --n_folds 5 \
  --speed_preset one_hour \
  --device cuda \
  --n_jobs 4

# 多方法对比(耗时约4-6小时)
python reproduce_autopu.py \
  --dataset breast_cancer_wisconsin \
  --method GA-1,BO-1,EBO-1,S-EM,DF-PU \
  --delta 0.2,0.4,0.6 \
  --n_folds 5 \
  --speed_preset one_hour

关键参数说明

参数 取值 说明
--speed_preset one_hour/balanced/paper 速度预设:1小时快速验证/平衡/论文原版
--device cuda/cpu/auto PyTorch设备选择,有GPU可大幅加速MLP和Deep Forest
--n_jobs 整数 并行作业数,建议设置为CPU核心数-1

运行日志示例:

复制代码
[启动] 总实验数: 15
数据集: ['breast_cancer_wisconsin']
方法: ['GA-1']
Delta值: [0.2, 0.4, 0.6]

[GA-Auto-PU] 开始优化: pop_size=16, generations=6, cv_folds=2
  第 1 代: 最优F1 = 0.9497
  第 2 代: 最优F1 = 0.9545
  [GA早停] 连续 3 代无提升,提前结束。

[完成] breast_cancer_wisconsin δ=0.2 GA-1: 平均F1 = 0.9614

5.2 性能对比分析

在Breast Cancer Wisconsin数据集上的快速验证结果(5折平均):

方法 δ=20% F1 δ=40% F1 δ=60% F1 平均耗时(min)
GA-1 0.961 0.956 0.946 2.1
BO-1 0.958 0.952 0.941 0.8
EBO-1 0.960 0.954 0.944 1.5
S-EM 0.892 0.893 0.892 0.1
DF-PU 0.884 0.700 0.473 0.3

关键发现

  1. Auto-PU系统显著优于基线:三种Auto-PU方法F1均显著高于S-EM和DF-PU(与论文结论一致)
  2. δ增加导致性能下降:随着隐藏正例比例增加(20%→60%),所有方法F1均下降,符合预期
  3. 效率与精度权衡:BO-1最快(0.8min),GA-1精度最高(0.961),EBO-1取得平衡

6 总结与展望

本文详细介绍了如何基于Python和PyTorch复现Applied Intelligence 2025年的Auto-PU框架,并分享了利用GPT-5.4进行学术论文复现的完整方法论。通过合理精简(保持算法核心逻辑不变),我们将原本需要数周的实验压缩至可接受的验证时间,同时提供了从代码实现到结果可视化的完整pipeline。

复现要点回顾

  1. 算法核心:两步法PU学习(Phase 1A/1B/2)+ Spy技术
  2. 优化策略:GA(探索强)、BO(利用强)、EBO(平衡)
  3. 工程技巧 :使用tqdm监控进度、lru_cache缓存数据、PyTorch AMP加速

后续研究方向

  • 在更多生物医学数据集上验证(建议优先尝试Pima Indians Diabetes、Heart Disease等UCI经典数据集)
  • 尝试集成更先进的基分类器(如XGBoost、LightGBM、Transformer)
  • 探索多目标优化(同时优化F1和训练时间)

合规使用AI提醒 :再次强调,国内开发者应通过合法合规渠道使用GPT-5.4等大模型工具。本文推荐的AIGCBAR镜像站(注册入口)和API独立站(注册入口)为国内合规接入点,请广大开发者严格遵守《中华人民共和国计算机信息网络国际联网管理暂行规定》,切勿使用非法VPN翻墙访问境外网站,共同维护清朗的网络空间。


附录:完整代码获取

本文所述的快速版复现代码可通过以下方式获取:
https://download.csdn.net/download/nmdbbzcl/92774745

参考文献

1\] Saunders J D, Freitas A A. Automated machine learning for positive-unlabelled learning\[J\]. Applied Intelligence, 2025, 55: 875. \[2\] Bekker J, Davis J. Learning from positive and unlabeled data: A survey\[J\]. Machine Learning, 2020, 109(4): 719-760.

相关推荐
老神在在0012 小时前
【Selenium 自动化精讲】浏览器弹窗与登录界面的本质区别 & 实操指南
javascript·学习·selenium·测试工具·自动化
小陈工2 小时前
2026年3月31日技术资讯洞察:AI智能体安全、异步编程突破与Python运行时演进
开发语言·jvm·数据库·人工智能·python·安全·oracle
梦想的旅途23 小时前
效率革命:实现外部群聊信息的自动化同步方案
运维·自动化
·醉挽清风·3 小时前
学习笔记—Linux—信号阻塞&信号捕捉
linux·笔记·学习
老李的勺子3 小时前
Agent 记忆失效的 5 种方式:完整排查复盘
python·llm
Leo655353 小时前
动态透视报表 + 查询接口 + Excel导出
开发语言·windows·python
清水白石0083 小时前
pytest Fixture 设计实战指南:作用域、依赖链、自动清理与测试资源高效复用
python·pytest
AnalogElectronic4 小时前
uniapp学习5,兼容微信小程序的俄罗斯方块游戏
学习·微信小程序·uni-app
知识分享小能手4 小时前
MongoDB入门学习教程,从入门到精通,MongoDB应用程序设计知识点梳理(9)
数据库·学习·mongodb