通过合成数据构建XGBoost模型,预测墨尔本急诊诊所每日患者量,辅助排班。文章涵盖特征工程(天气、节假日、流感季)、模型对比(XGBoost胜出,MAPE 11.9%)、SHAP解释及预测区间,最终将预测结果转化为低中高三种人力配置等级。
墨尔本一家步行上门急诊诊所,每天要拍脑袋决定排几个医生。医生少了,候诊室爆满,患者跑去最近的三甲急诊;医生多了,钱烧得心疼。大多数诊所靠去年数据、直觉和运气来估计,尤其是流感季。
作者想解决的,正是这个“把急诊需求变成可预测数字”的问题。他构建了一套XGBoost预测管道,每天输出患者量预测和置信区间,排班经理可以据此安排医生。
本文是系列第一篇,覆盖数据生成、特征工程、模型训练与评估。第二篇将部署FastAPI后端、React + Tailwind仪表盘以及Supabase日志系统。全部代码已开源在GitHub。
预测急诊量与预测商场客流不一样。商场周二少50个顾客,大不了快餐店多开两个服务员。但急诊排班不足,患者可能等出问题;排班过多,本来就薄的利润更扛不住。这不是单纯的预测练习,而是有真实后果的运营问题。
由于没有真实数据(即使有也不能公开),作者用合成数据模拟了2023年1月到2025年12月共1096天的日度记录。合成数据的好处是可控信号噪声比,且能清晰展示方法。

上图为日度患者量(浅线)和30天移动平均(红线)。冬季流感推高、春季花粉过敏轻微上扬、夏季平淡,偶尔雷暴哮喘或热浪导致尖刺。
每条记录包含:
值得注意的是,一些特征在不同场景下作用相反。例如下雨可能减少娱乐场所客流,但轻微增加急诊需求(滑倒、无法拖延的感染)。作者花时间调整这些方向,否则看似合理的合成数据会导致模型学到错误关系。
患者量生成使用了乘积因子(基准100人/日):
day_multiplier = {0: 1.15, 1: 1.00, 2: 0.95, 3: 0.95, 4: 1.00, 5: 0.85, 6: 0.75}
df['patients'] *= df['day_of_week'].map(day_multiplier)
season_multiplier = {
1: 0.85, 2: 0.90, 3: 0.95, 4: 1.00, 5: 1.10, 6: 1.30,
7: 1.45, 8: 1.35, 9: 1.15, 10: 1.10, 11: 1.05, 12: 0.90
}
df['patients'] *= df['month'].map(season_multiplier)
再加高斯噪声(标准差12%)、2%异常点(1.5-2.5倍)、每日0.01%增长趋势,最终值限制在30-500人/日。

分布右偏(偏度1.14),大多数天集中在100-150人,但流感季长假可出现250+。
作者强调:原始数据得到基线预测,特征工程才得到好预测。从31个原始列,通过以下8类生成了87个特征:
关键技巧:shift(1)防止数据泄露,确保只用预测日前信息。

滚动7/14天均值与患者量的相关性最高(约0.61-0.69),说明近期趋势最重要。
采用时间序列切分:最后90天作为测试集(2025-10-03至2025-12-31),前面915天训练。使用TimeSeriesSplit交叉验证(5折,扩窗)。
建立三个基线:
三个模型:随机森林(300棵树)、XGBoost(500棵树,学习率0.05,对log1p患者量训练)、Prophet(facebook时间序列模型,使用乘法季节性和外部回归因子)。
结果:
| 模型 | MAE | RMSE | R² | MAPE |
|---|---|---|---|---|
| XGBoost | 17.04 | 27.69 | 0.30 | 11.89% |
| Prophet | 17.98 | 28.98 | 0.23 | 12.84% |
| 随机森林 | 18.34 | 29.35 | 0.21 | 12.91% |
| 基线(7日MA) | 22.93 | 32.36 | 0.04 | 17.18% |
| 基线(均值) | 24.04 | 33.04 | -0.00 | 18.06% |
| 基线(上周同日) | 24.09 | 35.87 | -0.18 | 17.22% |
XGBoost最优:MAPE 11.9%意味着平均每天预测误差约15人(基数为130)。相比最好的基线(7日移动平均),MAE从22.93降至17.04,误差降低26%。R²约0.30看似不高,但急诊日波动大,MAPE更能说明实用价值。

XGBoost最贴近真实值的周期性(红为预测,黑为实际)。
残差分析显示残差基本围绕0,无时间漂移,但模型对高峰日略低估(负偏差约6.5人/天)。因此生产中使用预测区间上界更安全。
使用SHAP解释特征重要性:

is_flu_peak、illness_driver_count、patients_lag_7是驱动预测的主要因素,与临床直觉一致。
还演示了最差预测日的瀑布图,可逐特征查看贡献——这对向临床主任解释“为什么昨天预测偏差大”非常有用。
用自助法(500次重采样)生成80%和95%预测区间。例如:“明天预测145人,80%区间为113-177人”。这比单个数字更有用,排班经理可根据区间上限安排人力(因为缺人风险高得多)。

实际值落在区间内的比例基本符合预期。
将患者量转化为三个排班等级:
这样排班经理不用盯着“145人”这个数字,而是直接知道“今天需要中级梯队”。作者指出,模型正确识别梯队天数的比例约8成(结合80%区间),这比单纯看MAE更有操作意义。
本文从业务问题出发,通过合成数据、特征工程、XGBoost建模、SHAP解释、预测区间和梯队分类,构建了一套可落地的急诊患者量预测系统。MAPE 11.9%意味着每天预测误差约15人,足以支撑“低-中-高”的排班决策。
所有代码已开源,读者可克隆后适配自己的诊所或场地。第二篇将介绍FastAPI部署、React仪表盘和实时监控。
如果你对“如何将预测数字转化为实际排班人数”感兴趣,欢迎留言,作者考虑单独写一篇。
免费获取企业 AI 成熟度诊断报告,发现转型机会
关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断