
前面的章节我们对XGBoost和规则引擎都做了详细的说明,今天我们结合实例,分享一下“慢病智能筛查与风险预警”的构建经历,核心本质是将机器学习、规则引擎与大模型技术融合,应用于医疗慢病管理场景的智能化解决方案。核心目标是通过技术手段辅助人工,对患者健康数据进行自动化分析,快速、精准、合规地判定患者风险等级,是属于低、中、高哪一类,提前识别并发症隐患,为临床决策提供数据支撑。
在传统慢病筛查中,医生需要手动对照纸质评分表,如高血压高危人群筛查表,逐条核对患者指标后判定风险,存在效率低、易遗漏、主观性强等问题;而智能筛查系统通过“机器学习模型自动打分 + 规则引擎合规校验 + 大模型辅助解读”的模式,既保证了效率,又兼顾了准确性和合规性。

要理解 XGBoost,首先要从“决策树”和“梯度提升”两个基础概念入手:
XGBoost是“极端梯度提升”,相比传统梯度提升树,它做了两大优化:
2.1 规则引擎的核心组成
规则引擎本质是“数据输入→规则匹配→逻辑执行→结果输出”的闭环系统,核心组成包括:
2.2 规则引擎的执行逻辑
以高血压高风险判定为例,规则库中预定义:“高风险 = 核心指标异常≥2 条”,核心指标包括:
当XGBoost模型输“患者A为高风险”后,规则引擎的执行逻辑是:

大模型的核心能力是自然语言理解和自然语言生成,在本系统中,它的应用原理可分为三类:
4.1 XGBoost:风险打分的智能大脑
XGBoost(Extreme Gradient Boosting)是一种基于梯度提升树的集成学习算法,也是当前医疗风险预测场景中应用最广泛的模型之一。在我们的系统需求中,它的核心价值是:

4.2 规则引擎:合规校验的安全闸
规则引擎是基于国家或地方慢病筛查标准预定义规则的逻辑判断系统,在本方案中它的核心作用是:
4.3 大模型:体验与解读的赋能器
大模型(如医疗专用大模型)在本方案中并非核心判定组件,但能显著提升系统的实用性和易用性,核心价值包括:
该系统主要应用于基层医疗机构、慢病管理中心、社区卫生服务站等场景,核心价值体现在:
整个智能筛查与风险预警系统的执行流程可分为“离线训练”和“在线预测”两大阶段,具体流程:

核心是收集符合国家慢病筛查标准的历史患者数据,数据类型包括:
数据质量要求:
特征工程是XGBoost模型效果的核心,也是医疗数据处理的关键环节,具体操作:
核心是通过训练数据让模型学习特征与风险等级的关联,具体操作:

核心是将国家或地方慢病筛查标准转化为机器可执行的规则,以高血压筛查为例:
{
"rule_id": "hypertension_high_risk",
"rule_name": "高血压高风险判定规则",
"condition": "core_abnormal_count >= 2 OR (core_abnormal_count == 1 AND family_history == '是')",
"action": "risk_level = '高风险'",
"description": "高风险判定需满足≥2条核心指标异常,或1条核心指标异常+有家族史"
}核心是为大模型准备解读所需的知识,包括:

支持两种数据输入方式:
核心是将文本转化为结构化特征,示例:
{
"age": 65,
"gender": "男",
"systolic_bp": 160,
"diastolic_bp": 100,
"family_history": "是",
"symptom": "头晕"
}将结构化特征输入训练好的 XGBoost 模型,输出:
核心是验证模型结果是否符合国家规则,示例:
将最终风险等级、异常指标、规则依据输入大模型,生成:
最终输出给用户或医生的内容包括:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import xgboost as xgb
# ---------------------- 1. 数据加载与预处理 ----------------------
# 模拟高血压患者数据(实际使用时替换为真实数据)
data = pd.DataFrame({
'age': [55, 68, 45, 70, 50, 62, 48, 75, 58, 65],
'gender': ['男', '女', '男', '女', '男', '女', '男', '女', '男', '女'],
'systolic_bp': [150, 160, 130, 170, 140, 155, 125, 165, 145, 160], # 收缩压
'diastolic_bp': [95, 100, 85, 105, 90, 98, 80, 102, 92, 100], # 舒张压
'bmi': [28, 29, 24, 30, 26, 28, 25, 31, 27, 29],
'family_history': ['是', '否', '否', '是', '否', '是', '否', '是', '否', '是'],
'risk_level': ['中风险', '高风险', '低风险', '高风险', '中风险', '高风险', '低风险', '高风险', '中风险', '高风险']
})
# 特征工程:处理类别特征
# 性别编码:男=1,女=0
le_gender = LabelEncoder()
data['gender_encoded'] = le_gender.fit_transform(data['gender'])
# 家族史编码:是=1,否=0
le_family = LabelEncoder()
data['family_history_encoded'] = le_family.fit_transform(data['family_history'])
# 衍生特征:核心指标异常数
def count_core_abnormal(row):
count = 0
# 收缩压≥140mmHg 算异常
if row['systolic_bp'] >= 140:
count += 1
# 舒张压≥90mmHg 算异常
if row['diastolic_bp'] >= 90:
count += 1
# BMI≥28 算异常
if row['bmi'] >= 28:
count += 1
return count
data['core_abnormal_count'] = data.apply(count_core_abnormal, axis=1)
# 风险等级编码:低风险=0,中风险=1,高风险=2
le_risk = LabelEncoder()
data['risk_level_encoded'] = le_risk.fit_transform(data['risk_level'])
# ---------------------- 2. 数据划分 ----------------------
# 特征列:选择核心特征
features = ['age', 'gender_encoded', 'systolic_bp', 'diastolic_bp', 'bmi',
'family_history_encoded', 'core_abnormal_count']
X = data[features]
y = data['risk_level_encoded']
# 划分训练集(70%)、验证集(20%)、测试集(10%)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=1/3, random_state=42)
# ---------------------- 3. XGBoost模型训练 ----------------------
# 转换为DMatrix格式(XGBoost专用格式,提升效率)
dtrain = xgb.DMatrix(X_train, label=y_train)
dval = xgb.DMatrix(X_val, label=y_val)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置模型参数
params = {
'max_depth': 4, # 树的深度,医疗数据建议3-5
'learning_rate': 0.1, # 学习率
'n_estimators': 100, # 树的数量
'objective': 'multi:softmax', # 多分类(低/中/高风险)
'num_class': 3, # 类别数:3类(0/1/2)
'eval_metric': 'mlogloss', # 评估指标:多分类对数损失
'random_state': 42 # 随机种子,保证结果可复现
}
# 训练模型
watchlist = [(dtrain, 'train'), (dval, 'val')] # 监控训练集和验证集效果
model = xgb.train(params, dtrain, num_boost_round=100, evals=watchlist, early_stopping_rounds=10)
# ---------------------- 4. 模型评估 ----------------------
# 测试集预测
y_pred = model.predict(dtest)
# 计算准确率
accuracy = np.mean(y_pred == y_test)
print(f"测试集准确率:{accuracy:.2f}")
# 特征重要性(查看哪些特征对风险判定最关键)
importance = model.get_score(importance_type='weight')
print("\n特征重要性:")
for feat, score in sorted(importance.items(), key=lambda x: x[1], reverse=True):
print(f"{feat}: {score}")
# ---------------------- 5. 模型保存 ----------------------
model.save_model('hypertension_risk_model.model')
print("\n模型已保存为:hypertension_risk_model.model")代码说明:
输出结果:
[0] train-mlogloss:1.03256 val-mlogloss:0.98087 [1] train-mlogloss:0.98270 val-mlogloss:0.95966 [2] train-mlogloss:0.93721 val-mlogloss:0.94164 [3] train-mlogloss:0.89562 val-mlogloss:0.92647 [4] train-mlogloss:0.85753 val-mlogloss:0.91385 [5] train-mlogloss:0.82257 val-mlogloss:0.90351 [6] train-mlogloss:0.79045 val-mlogloss:0.89520 [7] train-mlogloss:0.76088 val-mlogloss:0.88872 ...... [21] train-mlogloss:0.55510 val-mlogloss:0.89560 [22] train-mlogloss:0.54837 val-mlogloss:0.90310 [23] train-mlogloss:0.54191 val-mlogloss:0.91082 [24] train-mlogloss:0.53572 val-mlogloss:0.91874 测试集准确率:1.00 特征重要性: f0: 57.0 模型已保存为:hypertension_risk_model.model
使用Python模拟规则引擎库实现高血压风险规则校验:
# ---------------------- 1. 定义事实(患者数据) ----------------------
class PatientFact:
"""患者事实类:存储患者的核心指标和模型预测结果"""
def __init__(self, age, core_abnormal_count, family_history, model_risk_level):
self.age = age # 年龄
self.core_abnormal_count = core_abnormal_count # 核心指标异常数
self.family_history = family_history # 家族史:True=有,False=无
self.model_risk_level = model_risk_level # 模型预测的风险等级:低/中/高
# ---------------------- 2. 规则引擎定义 ----------------------
class HypertensionRuleEngine:
"""高血压风险规则引擎:基于国家规范校验模型结果"""
@staticmethod
def evaluate(patient):
"""评估患者风险等级"""
age = patient.age
core_abnormal_count = patient.core_abnormal_count
family_history = patient.family_history
model_risk = patient.model_risk_level
# 规则1:低风险判定规则
if (core_abnormal_count == 0 and
not family_history and
age < 65):
final_risk = "低风险"
reason = "无核心指标异常,无家族史,年龄<65岁"
# 规则2:中风险判定规则
elif (core_abnormal_count == 1 or
(age >= 65 and core_abnormal_count == 0)):
final_risk = "中风险"
reason = "1条核心指标异常,或年龄≥65岁且无核心指标异常"
# 规则3:高风险判定规则
elif (core_abnormal_count >= 2 or
(core_abnormal_count == 1 and family_history)):
final_risk = "高风险"
reason = "≥2条核心指标异常,或1条核心指标异常+有家族史"
# 规则4:模型结果修正规则(模型结果与规则不符时)
is_corrected = False
corrected_reason = None
if model_risk != final_risk:
is_corrected = True
corrected_reason = f"模型预测风险等级为{model_risk},但不符合国家规范,修正为{final_risk}"
return {
'final_risk_level': final_risk,
'reason': reason,
'is_corrected': is_corrected,
'corrected_reason': corrected_reason
}
# ---------------------- 3. 规则引擎执行 ----------------------
def run_rule_engine(patient_data):
"""
执行规则引擎校验
:param patient_data: 患者数据字典,包含age, core_abnormal_count, family_history, model_risk_level
:return: 最终风险等级、判定依据、是否修正
"""
# 创建患者事实对象
patient = PatientFact(
age=patient_data['age'],
core_abnormal_count=patient_data['core_abnormal_count'],
family_history=patient_data['family_history'],
model_risk_level=patient_data['model_risk_level']
)
# 执行规则评估
return HypertensionRuleEngine.evaluate(patient)
# ---------------------- 4. 测试规则引擎 ----------------------
if __name__ == "__main__":
# 测试案例1:模型预测高风险,规则引擎验证合规
patient1 = {
'age': 68,
'core_abnormal_count': 2,
'family_history': False,
'model_risk_level': '高风险'
}
result1 = run_rule_engine(patient1)
print("测试案例1结果:")
print(f"最终风险等级:{result1['final_risk_level']}")
print(f"判定依据:{result1['reason']}")
print(f"是否修正:{result1['is_corrected']}")
# 测试案例2:模型预测高风险,规则引擎修正为中风险
patient2 = {
'age': 55,
'core_abnormal_count': 1,
'family_history': False,
'model_risk_level': '高风险'
}
result2 = run_rule_engine(patient2)
print("\n测试案例2结果:")
print(f"最终风险等级:{result2['final_risk_level']}")
print(f"判定依据:{result2['reason']}")
print(f"是否修正:{result2['is_corrected']}")
print(f"修正原因:{result2['corrected_reason']}")代码解释:
输出结果:
测试案例1结果: 最终风险等级:高风险 判定依据:≥2条核心指标异常,或1条核心指标异常+有家族史 是否修正:False 测试案例2结果: 最终风险等级:中风险 判定依据:1条核心指标异常,或年龄≥65岁且无核心指标异常 是否修正:True 修正原因:模型预测风险等级为高风险,但不符合国家规范,修正为中风险
以混元大模型API 为例,实现风险结果的自然语言解读:
from openai import OpenAI
import json
# ---------------------- 1. 配置大模型API ----------------------
# 腾讯混元API配置
api_key = 'sk-bWlJ*************8Ze'
client = OpenAI(
api_key=api_key,
base_url="https://api.hunyuan.cloud.tencent.com/v1",
)
# ---------------------- 2. 大模型解读函数 ----------------------
def generate_risk_interpretation(risk_result, patient_info):
"""
生成风险结果的自然语言解读
:param risk_result: 规则引擎输出的风险结果字典
:param patient_info: 患者基本信息字典
:return: 自然语言解读文本
"""
# 构建提示词(Prompt):结合医疗规则和患者信息
prompt = f"""
你是一名专业的高血压慢病管理医生,需要根据以下信息为患者生成易懂的风险解读:
1. 患者基本信息:
- 年龄:{patient_info['age']}岁
- 性别:{patient_info['gender']}
- 收缩压:{patient_info['systolic_bp']}mmHg
- 舒张压:{patient_info['diastolic_bp']}mmHg
- BMI:{patient_info['bmi']}
- 家族史:{'有' if patient_info['family_history'] else '无'}
2. 风险判定结果:
- 最终风险等级:{risk_result['final_risk_level']}
- 判定依据:{risk_result['reason']}
- 是否修正:{'是' if risk_result['is_corrected'] else '否'}
- 修正原因:{risk_result['corrected_reason'] if risk_result['is_corrected'] else '无'}
要求:
1. 语言通俗易懂,避免专业术语;
2. 先告知风险等级,再解释判定依据,最后给出针对性的干预建议;
3. 若有修正,需简要说明修正原因;
4. 建议具体可行(比如饮食、运动、监测频率);
5. 语气亲切,符合医疗沟通规范。
"""
# 调用腾讯混元API生成解读
response = client.chat.completions.create(
model="hunyuan-lite", # 混元轻量级模型
messages=[
{"role": "system", "content": "你是专业的慢病管理医生,擅长用通俗易懂的语言解释风险等级和干预建议。"},
{"role": "user", "content": prompt}
],
temperature=0.3, # 温度越低,结果越稳定
max_tokens=500 # 最大生成字数
)
# 提取生成的文本
interpretation = response.choices[0].message.content.strip()
return interpretation
# ---------------------- 3. 测试大模型解读 ----------------------
if __name__ == "__main__":
# 患者信息
patient_info = {
'age': 68,
'gender': '女',
'systolic_bp': 160,
'diastolic_bp': 100,
'bmi': 29,
'family_history': False
}
# 规则引擎输出结果
risk_result = {
'final_risk_level': '高风险',
'reason': '≥2条核心指标异常,或1条核心指标异常+有家族史',
'is_corrected': False,
'corrected_reason': None
}
# 生成解读
interpretation = generate_risk_interpretation(risk_result, patient_info)
print("患者风险解读:")
print(interpretation)代码解释:
输出结果:
患者风险解读: 首先,我要告诉您,根据您提供的信息,您的血压水平是偏高的,被判定为高风险。接下来,我会详细解释这个风险等 级的判定依据,并给您一些具体的干预建议。 风险等级解读 高风险:这意味着您在未来发生高血压相关并发症(如心脏病、中风等)的可能性相对较大。因此,需要特别关注 和管理您的血压水平。 判定依据 1. 收缩压和舒张压均异常:您的收缩压(160mmHg)已经超过了正常范围(通常认为收缩压小于140mmHg才算正常),而舒张压(100mmHg)也高于正常范围(通常认为舒张压小于80mmHg才算正常)。这两项指标都显示出了高血压的特征。 2. 家族史无异常:虽然您的家族史中没有高血压病史,但仅凭这一点还不足以完全排除高血压的风险。因为高血压的发生可能受到多种因素的影响,包括遗传、生活方式等。 干预建议 为了降低您的高血压风险,我建议您采取以下措施: 1. 饮食调整: - 减少盐的摄入量,尽量避免食用高盐食品,如腌制品、咸鱼等。 - 增加蔬菜、水果和全谷物的摄入量,这些食物富含钾、镁等有助于降低血压的营养素。 - 控制脂肪和胆固醇的摄入,选择低脂、低胆固醇的食物,如瘦肉、鱼、禽类等。 2. 增加运动: - 每周至少进行150分钟的中等强度有氧运动,如快走、游泳、骑自行车等。运动可以帮助降低血压、改善心血管健 康。 - 如果您身体状况允许,也可以尝试进行力量训练,以增强肌肉力量和耐力。 3. 监测血压: - 建议您在家中定期测量血压,至少每周测量一次。记录血压值可以帮助您更好地了解自己的血压状况,并及时调整生活方式或药物治疗。 4. 保持良好的生活习惯: - 戒烟限酒,避免过度劳累和精神紧张,保持充足的睡眠时间。 - 学会放松自己,可以尝试进行深呼吸、冥想等放松技巧来缓解压力。 总的来说,通过调整饮食、增加运动、监测血压以及保持良好的生活习惯,您可以有效地降低高血压的风险。如果您有 任何不适或疑虑,请及时就医咨询。
基于慢病的智能筛查与风险预警系统,核心就是三件事:XGBoost 负责精准打分、规则引擎守住合规底线、大模型提升易用性,三者搭在一起,就能做出稳定、可落地、医生和患者都能用的慢病风险预警工具。简单说,XGBoost 从历史数据里学习规律,自动给新患者打出风险分,快速分出低、中、高风险,比人工更高效、更稳定。但模型毕竟是黑箱,所以必须配上规则引擎,严格按照国家慢病筛查标准做二次校验,确保风险等级不违规、不错判,该修正就修正,保证结果可信、可追溯。
再加上大模型,可以把病历文本转成结构化特征,把冰冷的分数和指标,翻译成普通人听得懂的风险解读,还能自动生成建议、回答疑问。我们应用过程中数据一定要干净、特征要贴合临床指标;规则必须紧跟国家指南;大模型尽量用本地或私有化部署,保护数据安全。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。