报告的分数很大一块落在新特征让模型涨了多少。Feature Engineering 这一栏的 DIST 档写 marked improvements in model fit,HD 档写 drastically elevate,两档都在看 R²。三餐的平方项和交互项在留出集上几乎不动,能把 R² 抬起来的列在 G0 的低端。这些做法我拿官方 CSV 跑过,数字留给你们的 Notebook。
按 G0 分组看 TIR,再加断点列
你的相关矩阵里 G0 和 TIR 是不小的正相关,读起来像基础血糖越高越好。跑一行 df.groupby('G0').TIR.mean() 能看到 G0 只有 12 个取值:70 那一档的平均 TIR 很低,往上很快爬升,到 100 附近开始缓慢下降。
图:横轴是 G0 从 70 到 125,纵轴是平均 TIR。均值曲线在 70 很低,快速上升,到 100 附近后缓慢下降;线性系数对应一条缓慢上升的虚线。
结构示意 · 曲线形状按官方 CSV 全量均值画,纵轴不标刻度,数值请自己跑。
我会在增强模型里加两列:G0 == 70 的 0/1 列和断点列 max(c − G0, 0),c 只用训练集来定。留出集 R² 的涨幅比三餐的平方项和交互项全部加起来大几百倍。解释也现成:brief 把低血糖定在 70 以下,TIR 把这段时间算作出界,起点压在 70 上的记录很容易出界。这条机制在报告里写成假设,模拟数据证明不了它。
模型比较做成四行阶梯表
新特征一次全塞进增强模型,报告里只有 baseline 和 enhanced 两行,marker 看不出哪个特征出的力,brief 问的却是 which transformations yielded the greatest improvements。我会报四行:baseline、加 G0 断点、加餐次平方项、加交互项,列是调整后 R²、留出 R²、条件数和越出 0–1 的预测数。加断点那一行 R² 大涨,条件数只升一点,越界预测基本消失;加平方项那一行 R² 几乎不动,条件数跳上去。建模栏 DIST 档点名的 trade-offs 照这两行写就够。
把 nunique 乘起来再写样本量
brief 写的是 more than 16 million observations。把 8 个原始自变量的 nunique() 乘一下:12 × 19 × 7 × 7 × 5 × 10 × 10 × 3 = 16,758,000,正好等于总行数。这份数据是一张完整的模拟网格,每行是一个参数组合,没有一行对应真实病人。
写进 audit 以后,原始变量之间相关接近 0 就有了解释,共线只来自 TimeDiff_*、Total_Glucose_Grams 这些恒等式列和你自己造的特征,数据清洗栏 DIST 档的 justifies handling of collinear columns 就落在这里。这些行是模拟网格上的组合,Q&A 被问显著性时,讲系数大小和留出表现比报 p 值站得住。
运动建议按 G0 分档写成条件句
no exercise 组的平均 TIR 高于 stronger,而网格里三组的 G0 和饮食分布完全一样,组间条件不同解释不了这个差异。把 G0 和运动类别做成透视表:G0 低的几档差距很大,到 100 往上两组贴在一起,次序还反过来。






