26妈妈杯|E题思路第[1]弹 细节拉满+可视化代码
其实这道题很适合用机器学习方法来做。这道题可以看作是一个多因素驱动的定价机制还原与微观成本优化的综合问题。数据集包含了历史谈判前后的价格和基本属性,但第二、三问需要我们利用开源数据库挖掘额外的流行病学和药理学特征。
简单分析一下就是说,假设我们有一种罕见病药物,谈判前卖10万元,谈判后降到了3万元。我们的模型首先要能根据它的适应症、类别等基础信息预测出这个降价幅度;然后还要结合这个病到底有多少人得、严不严重来修正这个预测价格;最后落实到具体一个病人身上,如果原研药太贵,我们能不能用算法在庞大的医药库里帮他找出平替方案,算出一套最省钱的用药组合。
下面是具体的赛题解析:
针对第一题
第一步是特征工程与影响因素测度。我们需要构建一个回归模型来预测谈判后的价格。特征主要分为几部分:原始的谈判前价格(数值型)、药品规格(需要提取剂量数值)、适应症(可以做NLP嵌入或频数编码)、药品类别(中成药/化药/生物药,做独热编码)。目标变量(标签)是谈判后药品价格。
第二步是特征重要性排序。题目明确要求“分析……因素对药物定价的影响程度并进行排序”。我们可以直接使用随机森林(Random Forest)或 XGBoost 树模型拟合这些特征和谈判后价格,利用模型自带的 feature_importances_ 输出各个因素的贡献度权重并排序。

第三步是构建定价模型。在筛选出高权重特征后,我们可以建立最终的定价预测模型。考虑到医保局谈判通常有一个底价逻辑,除了非线性树模型外,也可以尝试构建一个多元非线性回归方程,增强模型的可解释性。
代码部分:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestRegressor
import xgboost as xgb
# 假设加载了附件1的医保谈判数据
df = pd.read_csv('Attachment1_Negotiation_Data.csv')
# 1. 特征工程:编码分类变量,提取连续变量
le = LabelEncoder()
df['category_encoded'] = le.fit_transform(df['药品类别'])
df['indication_encoded'] = le.fit_transform(df['适应症'])
# 假设已经用正则提取了规格中的剂量数值
features = ['谈判前价格', '规格_剂量数值', 'category_encoded', 'indication_encoded']
X = df[features]
y = df['谈判后价格']
# 2. 影响程度排序:使用随机森林评估特征重要性
rf_model = RandomForestRegressor(random_state=42)
rf_model.fit(X, y)
importance_df = pd.DataFrame({'Feature': features, 'Importance': rf_model.feature_importances_})
print(importance_df.sort_values(by='Importance', ascending=False))
# 3. 建立最终定价模型:这里以 XGBoost 为例拟合复杂定价逻辑
xgb_model = xgb.XGBRegressor(objective='reg:squarederror')
xgb_model.fit(X, y)
df['预测谈判后价格'] = xgb_model.predict(X)
针对第二题
前一题很简单第二题是相对来说可以拉开差距的部分,第二题要求我们引入“罕见病特异性因素” 。这是拉开参赛队伍差距的关键。
第一步:外部数据融合(数据扩增)。我们要利用题目提供的 Orphanet、FDA 或中国罕见病联盟等数据库 ,去匹配第一问数据清单中的罕见病。爬取或手动查阅补充三个关键特征:受众人数(患病率)、是否为癌症类型(0或1)、危害程度轻重(可以转化为1-5的等级) 。
第二步:改进定价模型(引入博弈机制)。将新收集的特异性特征加入到第一问的特征矩阵中。背后的逻辑是:罕见病药物研发成本高、患者群体小 。如果受众人数极少,为了保证药企“快速回笼研发资金” ,医保局在谈判时可能会给予更高的价格容忍度;如果是重度致死性癌症,降价谈判的力度可能会更大以保民生。重新训练我们的预测模型。
第三步:合理性分析。我们要证明改进后的模型更好。
- 统计学指标:对比改进前后模型的预测误差(如 RMSE、MAE),证明引入特异性因素后预测更准。
- 机制解释(SHAP值分析):通过 SHAP 归因分析图展示,比如证明“受众人数越少,模型预测的价格折损率越小”,这不仅符合数据规律,也符合“保护创新药企可持续发展” 的现实医保政策逻辑。
代码部分:
import shap
# 1. 扩增新特征(假设已通过外部数据库匹配合并)
# new_features = features + ['受众人数', '是否癌症', '危害等级']
X_enhanced = df[new_features]
# 2. 重新训练改进后的定价模型
enhanced_model = xgb.XGBRegressor(objective='reg:squarederror')
enhanced_model.fit(X_enhanced, y)
# 3. 合理性分析:使用 SHAP 解释特异性因素对定价的贡献
explainer = shap.Explainer(enhanced_model)
shap_values = explainer(X_enhanced)
# 绘制 SHAP 摘要图,观察'受众人数'等特征如何推动价格上涨或下跌
# 如果患病人数极小的样本,其SHAP值为正(推高定价),则模型逻辑合理
shap.summary_plot(shap_values, X_enhanced)
针对第三题
这一问的视角从宏观定价转向了微观单体病人的运筹优化。
第一步:确定具体案例与寻找替代方案。我们要聚焦某一种具体的罕见病(比如脊髓性肌萎缩症 SMA) 。通过药理数据库(如 RDDC 或 DrugBank) ,查找它的核心治疗靶点或功效。然后搜寻市面上功效相近的替代药物 (比如原本要用诺西那生钠,现在找有没有机制类似的小分子药物或中成药辅助替代)。记录这些替代药的单价、单次用量、药效转换系数。
第二步:构建最小用药成本模型(线性/整数规划)。
我们需要设立一个最优化方程。
- 决策变量:每种替代药物的使用数量。
- 目标函数:单体病人的总用药成本最低(单价 x 用量之和) 。
- 约束条件:
- 药效约束:组合用药的总功效必须大于等于原特效药的最低治疗阈值(利用药效转换系数计算)。
- 毒副作用约束:不能为了省钱吃太多某种替代药,需设定单日最大安全剂量上限。
- 单体生理约束:根据该单体病人的体重、年龄、肝肾功能等,调整吸收率系数。
第三步:求解并输出具体方案。使用 Python 的 scipy.optimize 或 PuLP 库求解这个最优化问题,最终给出一个类似于“每天服用A药2片 + B药1次,每月成本从5万元降至1.2万元”的具体药物替代方案 。
代码部分:
import pulp
# 假设针对某单体病人(体重60kg),原方案每月需花费 50000 元
# 找到三种具有相似机制的替代药物 A, B, C
drugs = ['DrugA', 'DrugB', 'DrugC']
costs = {'DrugA': 50, 'DrugB': 120, 'DrugC': 300} # 单次用药成本
efficacy = {'DrugA': 0.2, 'DrugB': 0.5, 'DrugC': 1.2} # 相对原药的药效当量
max_safe_doses = {'DrugA': 60, 'DrugB': 30, 'DrugC': 15} # 每月最大安全用量
# 1. 初始化最小成本模型
model = pulp.LpProblem("Minimum_Cost_Medication", pulp.LpMinimize)
# 2. 定义决策变量:每月使用各药物的次数(整数)
x = pulp.LpVariable.dicts("Doses", drugs, lowBound=0, cat='Integer')
# 3. 目标函数:总花费最小
model += pulp.lpSum([costs[i] * x[i] for i in drugs]), "Total_Cost"
# 4. 约束条件
# 药效约束:假设每月需要达到 15 个单位的药效当量才能控制病情
model += pulp.lpSum([efficacy[i] * x[i] for i in drugs]) >= 15.0, "Efficacy_Requirement"
# 安全剂量约束
for i in drugs:
model += x[i] <= max_safe_doses[i], f"Max_Safe_{i}"
# 5. 求解并输出具体方案
model.solve()
print(f"最小用药成本: {pulp.value(model.objective)} 元/月")
for i in drugs:
print(f"{i} 每月建议用量: {x[i].varValue} 次")
后续都在数模加油站……
注:本内容由”数模加油站“ 原创出品,虽无偿分享,但创作不易。
欢迎参考teach,但请勿抄袭、盗卖或商用。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)