论文标题 :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)的关键假设:
- SCAR假设:正例被标记的概率与其特征无关(Selected Completely At Random)
- 两步法框架 :
- 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获取完整代码框架
- 静态检查:检查是否包含所有18种分类器、是否实现Spy技术、是否包含三种优化器
- 单元测试:先运行单数据集(如breast_cancer_wisconsin)+单方法(如GA-1)+单折(n_folds=1)测试
- 错误反馈 :如遇
IndexError或ValueError,将完整Traceback+相关代码段提交给GPT-5.4修复 - 性能优化 :使用
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 |
关键发现:
- Auto-PU系统显著优于基线:三种Auto-PU方法F1均显著高于S-EM和DF-PU(与论文结论一致)
- δ增加导致性能下降:随着隐藏正例比例增加(20%→60%),所有方法F1均下降,符合预期
- 效率与精度权衡:BO-1最快(0.8min),GA-1精度最高(0.961),EBO-1取得平衡
6 总结与展望
本文详细介绍了如何基于Python和PyTorch复现Applied Intelligence 2025年的Auto-PU框架,并分享了利用GPT-5.4进行学术论文复现的完整方法论。通过合理精简(保持算法核心逻辑不变),我们将原本需要数周的实验压缩至可接受的验证时间,同时提供了从代码实现到结果可视化的完整pipeline。
复现要点回顾:
- 算法核心:两步法PU学习(Phase 1A/1B/2)+ Spy技术
- 优化策略:GA(探索强)、BO(利用强)、EBO(平衡)
- 工程技巧 :使用
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.