AI 研伴
← AI 科研案例集 / 统计与数据科学

真实 OpenScience 对话 · 固定模型 GPT-5.6-sol · 数据完全虚构

预测模型验证:
为什么不能只看 AUC

这不是预先写好的静态答案。下面直接呈现 AI 研伴(OpenScience)同一个真实演示会话中的提问、工具活动、完整回复和项目文件。

原生会话实录

像进入工作台一样查看这次分析

页面直接读取公开的脱敏会话数据,按原顺序展示用户提问、Agent 活动、完整回复和实际文件;没有重新改写成宣传摘要。

预测模型验证:为什么不能只看 AUC

AI 研伴(OpenScience) · gpt-5.6-sol

真实运行记录
用户

请用 240 条完全虚构的研究项目数据,完成一个中文轻量案例:小样本预测模型为什么不能只看 AUC。 比较简单基线、正则化 Logistic 回归和树模型,采用嵌套分层交叉验证,报告折外 ROC-AUC、PR-AUC、Brier、校准和混淆矩阵;再用隔离的结局派生变量演示数据泄漏。生成可复现代码、数据、4 张中文图和 HTML/Markdown 报告。明确模拟数据不能当作真实证据,并实际执行、检查所有文件;失败时如实说明。

Agent 活动 · 12 个步骤展开查看
skillbashskillapply_patchbashapply_patchbashapply_patchbashbashbashartifact
AI 研伴(OpenScience) · gpt-5.6-sol

已完成并验证本次独立演示项目。所有计算均使用固定种子、CPU 单线程,在本项目工作区内完成;未访问其他项目、环境变量、密钥或主机内网,也未安装系统服务或下载大型模型。

主要结果

模拟数据:

  • 样本量:240
  • 阳性率:47.92%(115/240)
  • 固定种子:20260911
  • 模拟结果完全虚构,不代表真实人群证据,也不用于临床或现实决策
  • 实际分析耗时:约 47.4 秒

合法模型采用:

  • 外层 5 折分层交叉验证
  • 内层 3 折分层交叉验证
  • 所有预处理、特征筛选和调参均在训练折内完成
  • 保留每个样本的外层折外预测概率
  • 阈值固定为 0.5,未利用折外结果调阈值
模型ROC-AUCPR-AUCBrier 分数准确率敏感度特异度
简单基线0.5000.4790.2500.5210.0001.000
正则化 Logistic 回归0.6980.6880.2190.6420.6170.664
随机森林0.6710.6250.2260.6170.6170.616
错误示范:结果派生变量泄漏1.0001.0000.0031.0001.0001.000

PR-AUC 的阳性率基线为 0.479。泄漏方案明显虚高,且已明确隔离,没有参与合法模型选择。

已生成文件

项目工作区内已生成:

  • analysis.py:完整可复现分析脚本
  • report.md:中文科研案例报告
  • report.html:可独立离线阅读的 HTML 报告
  • simulated-project-data.csv
  • simulated-project-data.xlsx
  • oof-predictions.csv:3 个模型共 720 条折外预测记录
  • metrics.csv
  • feature-importance.csv
  • data-dictionary.csv
  • dependencies.txt
  • result-summary.json
  • figure-01-roc-pr.png
  • figure-02-calibration.png
  • figure-03-metrics-confusion.png
  • figure-04-leakage.png

图表包括:

  1. ROC 与 PR 曲线
  2. 折外概率校准图
  3. 合法模型指标比较
  4. 合法方案与泄漏方案对照,并醒目标注“不正确做法,仅用于教学”

验证结果

已执行:

python3 analysis.py

随后在项目工作区重新执行并检查:

  • 所有要求文件均存在
  • 原始数据行数:240
  • 折外预测行数:720
  • result-summary.json 可正常读取
  • 结果摘要包含随机种子、阳性率、耗时、模型指标及各文件 SHA-256
  • 中文报告 SHA-256:
ada9e19778bf65aa554276f4f7dda189013ecbc1567528fc9c558f38cc1cde12

最重要的教学结论已写入报告:ROC-AUC 只反映排序区分度,不能替代 PR-AUC、Brier 分数、校准图和阈值下混淆矩阵;此外,结果派生变量会造成极端虚高表现,必须在建模前完成数据泄漏审计。

用户

我打开了 4 张图,发现中文都显示成方框,当前结果不能发布。请使用 Google Noto 官方中文字体修复代码,重新生成并检查图片和报告;保留这次失败与修复过程,并明确说明代码运行成功不等于图像一定显示正常。

Agent 活动 · 8 个步骤展开查看
webfetchreadapply_patchapply_patchbashapply_patchbashbash
AI 研伴(OpenScience) · gpt-5.6-sol

已继续在同一独立项目中修复,并保留本轮用户反馈与我的处理回复作为真实对话记录。

首先明确承认

首轮视觉验收失败:虽然首轮代码成功运行并生成了 4 张 PNG,但中文标题、坐标轴和图例实际显示为方框,因此首轮结果不能发布。代码运行成功并不能证明图像没有乱码;本轮已针对字体文件、字体绑定和输出文件进行修复与验证。

本轮修复

已从 Google Noto 官方维护的 GitHub 仓库下载并使用:

字体:Noto Sans CJK SC
官方来源:
https://raw.githubusercontent.com/notofonts/noto-cjk/main/Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Regular.otf

修改后的 analysis.py:

  • 显式定义官方字体来源 URL
  • 显式要求脚本同目录存在 NotoSansCJKsc-Regular.otf
  • 使用:
font_manager.fontManager.addfont(str(FONT_PATH))
font_manager.FontProperties(fname=str(FONT_PATH))
  • 标题、坐标轴标签、图例、刻度标签和图表注释均显式绑定该 FontProperties
  • 设置:
plt.rcParams["axes.unicode_minus"] = False
  • 不再静默回退到可能缺少中文 glyph 的字体
  • 若字体缺失、为空或字体名称解析不符,脚本会清晰报错并停止

字体文件在重新渲染和验证完成后已按要求删除。由于 analysis.py 保留了官方获取命令、来源 URL 和失败提示,因此之后复现时需要先重新下载该官方字体;缺少字体时不会生成可能含方框的图像。

已重新生成的文件

以下文件均已更新:

  • figure-01-roc-pr.png
  • figure-02-calibration.png
  • figure-03-metrics-confusion.png
  • figure-04-leakage.png
  • report.html
  • report.md
  • result-summary.json
  • analysis.py
  • dependencies.txt

此外,重新运行同时保留并核验了:

  • metrics.csv
  • oof-predictions.csv
  • simulated-project-data.csv
  • simulated-project-data.xlsx
  • feature-importance.csv
  • data-dictionary.csv

实际验证

执行命令:

python3 analysis.py

重新生成后实际得到:

图像尺寸文件大小
figure-01-roc-pr.png2340 × 900177,348 bytes
figure-02-calibration.png1260 × 90092,069 bytes
figure-03-metrics-confusion.png1980 × 1440121,799 bytes
figure-04-leakage.png2160 × 90079,590 bytes

文件级验证结果:

  • 4 张 PNG 均存在
  • 4 张 PNG 均非空
  • 图像尺寸均可正常读取
  • 字体文件存在且非空时,字体解析名称为 Noto Sans CJK SC
  • report.html 已重新嵌入 4 张更新后的 PNG
  • metrics.csv 包含 4 行结果
  • 原始数据仍为 240 行
  • 折外预测仍为 720 行
  • 合法模型指标重新计算并与首轮一致:
    • 简单基线 ROC-AUC:0.500
    • 正则化 Logistic 回归 ROC-AUC:0.698
    • 随机森林 ROC-AUC:0.671
    • 独立泄漏教学示范 ROC-AUC:1.000

重新执行后已删除本地字体文件,并额外验证:

otf_exists_after_cleanup False

同时确认删除字体后再次运行会失败,而不是静默回退:

exit_code=1

这符合“缺少官方字体时清晰失败”的要求。

报告中的新增记录

report.md 和 result-summary.json 已记录:

  • 首轮视觉验收失败的原因
  • 官方字体名称
  • 官方来源 URL
  • 字体文件路径和名称验证
  • 图像尺寸与非空验证
  • 不静默回退字体的设置
  • “代码运行成功不等同于视觉无乱码,仍需人工查看图像”的限制说明

需要如实说明:本轮已完成官方字体绑定、字体解析、渲染输出和文件级检查,但我不会把这些检查夸大为人工视觉验收的替代品。最终发布前仍建议直接打开 4 张 PNG 和 report.html,确认中文 glyph 在实际查看器中无方框、无截断、无重叠。

实际计算结果

同一个 AUC,回答不了所有问题

模型ROC-AUCPR-AUCBrier(越低越好)
简单基线0.5000.4790.250
正则化 Logistic 回归0.6980.6880.219
随机森林0.6710.6250.226
错误示范:结果派生变量泄漏1.0001.0000.003
ROC 与 PR:两种区分能力视角
ROC 与 PR:两种区分能力视角
校准:预测概率是否可信
校准:预测概率是否可信
多指标与固定阈值表现
多指标与固定阈值表现
错误示范:泄漏造成虚高表现
错误示范:泄漏造成虚高表现

这个案例刻意保留了失败和返工

真实科研协作不是模型第一次回答就全部正确。图表最初出现中文方框,字体修复第一遍又触发 Matplotlib 参数错误;只有看到 traceback、修改代码、重新运行并实际检查图片后,结果才进入公开案例。这样的过程比一张“完美成品图”更能说明 Agent 的价值和边界。