LightGBM 主力算法与模型矩阵
47项基础字段与12项建议补充项说明
评估结论、规则引擎与评分分级
应用部署、备份机制与服务器预算
24篇权威中英文临床防治文献
系统分三层:数据层负责字段映射和质量检查,模型层通过机器学习算法输出连续评分,规则引擎层综合多维度指标给出最终风险判定。
近5年(2020-2025)的肝病预测研究中,梯度提升树模型已成为主流方法。PubMed检索"lightgbm liver fibrosis"可找到70+篇相关论文,Google Scholar相关结果超过1200篇。以下是最新的研究证据:
| 模型 | 近5年肝病领域应用情况 | 代表文献 |
|---|---|---|
| LightGBM | 2024-2025年肝病预测领域使用最多的模型之一,多个研究将其作为主力模型,AUC普遍达到0.85-0.92 | Deng et al. BMC Public Health 2024; Ganie et al. Healthcare Analytics 2024 |
| XGBoost | 结构化临床数据的标准强基线,与LightGBM并列为最常用的梯度提升实现 | Singh et al. IEEE 2021 (59 citations); Pandey et al. IEEE 2024 |
| CatBoost | 在包含诊断编码、用药等类别字段的肝病数据中表现突出,2024年后使用量显著增长 | Ganie et al. 2024 (AUC 0.862); T Udhaya et al. 2025 |
| Random Forest | 经典的非线性基线模型,几乎所有肝病预测研究都会纳入作为对照 | Singh et al. 2021; Nararrya et al. Procedia 2025 |
| Logistic Regression | 透明可解释的统计基线,用于验证复杂模型是否真正带来增益 | Ganie et al. 2024; Jeyabalan 2024 |
| Elastic Net | 线性模型的正则化版本,适合处理临床数据中高度相关的变量 | 广泛用于生物医学特征选择 |
| Stacking集成 | 多模型融合框架,2025年多篇论文将XGBoost+LightGBM+CatBoost集成用于肝病预测 | Saranya et al. ExplaiLiver+ 2025 |
| FLAML AutoML | 自动化模型搜索工具,用于在有限时间内找到最优模型配置 | 微软开源,广泛用于AutoML基准测试 |
| 选择维度 | LightGBM | XGBoost | CatBoost |
|---|---|---|---|
| 训练速度 | 最快(直方图加速) | 较快 | 中等 |
| 类别变量处理 | 需手动编码 | 需手动编码 | 原生支持 |
| 可解释性 | TreeSHAP原生支持 | SHAP库支持 | 内置SHAP |
| 小样本表现 | 较好 | 较好 | 较好(对称树防过拟合) |
| 行业采用率 | 肝病预测领域最高 | 结构化数据标准选择 | 2024年后增长最快 |
本项目建立了完整的模型矩阵,覆盖从传统临床评分到深度学习的多种方法。所有模型使用本地临床数据从头训练,使用同一数据集、同一验证切分、同一评价指标进行公平比较。47个基础字段是当前的已实现输入维度,建议再补12项常见信息,让模型看到更多和代谢、生活习惯、血压、肾功能、炎症有关的线索。
| 类别 | 模型 | 原理详解 | 在本项目中的角色 |
|---|---|---|---|
| 传统临床评分 (固定公式) | FIB-4 | 原理:基于年龄、AST、ALT、血小板四项指标的纤维化初筛公式。公式为 age × AST / (platelet × √ALT)。这是一个固定权重的线性组合,无论本地患者特点如何,各变量的权重都不会自动调整。 优势:计算简单、广泛使用、成本低、可解释性强。 局限:没有使用血糖、血脂、胰岛素抵抗、影像等信息,不能单独代表MASLD的全部风险。 角色:建立最低成本的临床基线,如果机器学习模型不能比FIB-4提供更多稳定信息,就没有必要增加系统复杂度。 | 最低成本的纤维化初筛基线 |
| APRI | 原理:AST与正常上限的比值,再除以血小板计数×100。主要关注AST升高程度和血小板变化。 优势:计算简单,只用两个指标。 局限:同样没有使用代谢、共病、影像等信息。 角色:作为FIB-4的补充对照,验证简单评分的预测能力。 | 补充FIB-4的对照基线 | |
| NFS | 原理:NAFLD Fibrosis Score,使用年龄、BMI、糖尿病/空腹血糖异常、AST/ALT比值、血小板、白蛋白共6个变量。相比FIB-4,加入了肥胖和糖代谢信息,更接近MASLD的代谢特点。 优势:纳入了代谢维度,与MASLD的病理生理更匹配。 局限:仍然是固定公式,权重不会随本地数据调整。 角色:验证加入代谢信息后是否提升预测能力。 | 加入代谢信息的评分基线 | |
| 透明统计模型 (可学习权重) | Logistic Regression | 原理:线性模型,通过最大似然估计学习每个特征的权重系数。每个系数代表该特征对风险对数几率的贡献方向和大小。可以理解为一张从本地数据中学习权重的评分表。 优势:透明、可解释,系数即特征方向,能检查变量方向是否符合医学常识。 局限:只能学习近似线性关系。如果风险只有在某项指标超过特定阈值后才明显上升,或者两个指标组合后才产生影响,LR往往难以完整表达。 角色:可解释性基线,验证复杂模型是否真正带来增益。 | 可解释性基线,验证复杂模型增益 |
| Elastic Net | 原理:线性回归 + L1(Lasso) + L2(Ridge)双重正则化。L1会将部分特征系数压缩为0(特征选择),L2会缩小所有系数(防止过拟合)。当多个指标表达相似信息时(如体重和BMI、血糖和HbA1c),Elastic Net会压低重复信息的影响。 优势:自动处理多重共线性,适合临床数据中高度相关的变量。 局限:仍为线性模型,不擅长复杂非线性关系。 角色:稳定的统计基线,判断复杂模型是否真正带来增益。 | 压缩重复特征,降低过拟合 | |
| 梯度提升树 (核心模型) | LightGBM ⭐ | 原理:梯度提升决策树(GBDT)的高效实现。核心创新:(1) 直方图加速:将连续特征离散化为直方图区间,大幅减少计算量;(2) 叶子优先生长:优先扩展误差下降最大的叶子,而非逐层生长;(3) GOSS采样:保留大梯度样本,随机采样小梯度样本。 训练过程:可以理解为一支不断复盘错题的评估团队——每轮训练都集中解决当前最容易判断错误的患者,逐步提升整体准确度。 优势:训练速度快(比传统GBDT快20倍+)、能处理非线性关系和变量交互、适合高维结构化数据、内置TreeSHAP支持。 角色:本项目的主力模型,从本地数据从头训练。 | 主力模型,从本地数据训练 |
| XGBoost | 原理:与LightGBM同属梯度提升树,但更强调控制模型复杂度。通过正则化项(L1/L2)限制树的复杂度,防止模型为了适应训练数据而变得过于复杂。 优势:结构化数据中的标准强基线,正则化更严格,泛化能力通常较好。 局限:训练速度比LightGBM慢,对大规模数据效率较低。 角色:检验LightGBM结果是否稳定——如果XGBoost也给出类似结果,说明结论不是某个模型的偶然表现。 | 检验LightGBM结果稳定性 | |
| CatBoost | 原理:特别擅长处理类别变量(如诊断编码、用药类别、科室来源)。核心创新:(1) Ordered Boosting:在训练时使用排序统计,避免目标泄漏;(2) 对称树:每层使用相同的分裂条件,推理更快且更稳定。 优势:类别变量原生支持,不需要手动one-hot编码;对称树结构更稳定。 角色:当后续加入诊断编码、用药等类别字段时,CatBoost可能表现更好。 | 处理诊断编码、用药等类别字段 | |
| HistGradientBoosting | 原理:scikit-learn内置的梯度提升实现,与LightGBM原理类似(直方图分箱 + 梯度提升),但不需要额外安装第三方库。 优势:与scikit-learn生态无缝集成,部署简单。 角色:无需额外依赖的Boosting对照,验证LightGBM的性能是否来自其独特的实现细节。 | 无需第三方依赖的Boosting对照 | |
| Bagging | Random Forest | 原理:训练多棵独立的决策树,每棵树使用随机采样的数据和特征,最后取所有树的平均值。可以理解为让多名评估人员分别判断,再集体表决。 优势:比单棵树更稳定,能发现非线性关系和变量交互,不容易过拟合。 局限:模型较大,个体结果不如线性模型直观。 角色:稳定的非线性基线。 | 稳定的非线性基线 |
| 神经网络 (探索性) | MLP | 原理:多层感知机,由输入层、隐藏层、输出层组成。每一层的神经元与下一层全连接,通过非线性激活函数学习复杂关系。可以理解为多轮综合会诊——每一轮都把前一轮的判断重新组合。 局限:需要更多样本、数据标准化和调参。样本量不足时容易过拟合。 角色:探索性模型,需要足够数据后再比较。 | 需要更多样本 |
| TabNet | 原理:专为表格数据设计的神经网络。核心创新:使用注意力机制,在多个判断步骤中逐步选择当前最有用的指标。可以理解为分阶段查看检查结果——先看基础信息,再根据前一步结果决定下一步重点看哪些指标。 局限:需要较大样本和稳定的字段体系。 角色:探索复杂表格关系,对样本量要求较高。 | 需要更多样本 | |
| FT-Transformer | 原理:将每个表格字段当作一个信息单元,使用Transformer的自注意力机制学习不同字段之间的关联。不仅看每项指标本身,还持续判断不同指标之间应该互相参考多少。 局限:通常需要较大样本、稳定特征体系和GPU算力。 角色:技术储备,属于真实样本和算力充足后的探索方向。 | 技术储备,需GPU | |
| 集成方法 (高级) | Stacking | 原理:让多个基础模型分别作出判断,再训练一个二层模型学习如何综合这些判断。可以理解成先让多名专家独立评估,再由一名负责人综合各方意见。 局限:增加解释和部署复杂度。样本量不足时二层模型容易过拟合。 角色:需要更多数据,用于提升集成稳定性。 | 需要更多数据 |
| FLAML AutoML | 原理:在限定时间内自动尝试不同模型和参数组合,帮助找到值得进一步验证的候选配置。可以理解成自动安排多轮试验的工具。 局限:不能替代人工判断、临床验证和固定配置复训。 角色:辅助筛选候选模型,最终模型仍需人工确认。 | 辅助筛选候选模型 |
本项目的核心是用本地临床数据从头训练模型,而不是复现公开模型。47个基础字段提供了第一版信息维度;建议补充的12项字段主要是为了让数据更完整,后面用本地病例训练时更好校准。训练流程如下:
# train.py - 本地训练LightGBM模型 # 核心: 用本地收集的临床数据从头训练,不依赖任何预训练模型 import lightgbm as lgb import numpy as np import pandas as pd from sklearn.model_selection import train_test_split # ============================================ # 1. 定义训练特征 (排除泄漏字段) # ============================================ # 47个基础字段 + 派生特征, 排除会影响标签生成的字段 # 这些泄漏字段如果进入训练, 模型会"偷看"标签 LEAKAGE_EXCLUDE = { 'pdff_percent', # 直接影响case判定 (PDFF>=5% → case) 'masld_icd_code', # 直接影响case判定 (ICD编码 → case) 'masld_icd_flag', # 直接影响case判定 'cardiometabolic_flag', # 直接影响case判定 'patient_id', # 标识列, 不参与预测 'assessment_time', # 标识列 'masld_score', # 标签本身 'fib4_label', # 标签本身 } # ============================================ # 2. 准备训练数据 # ============================================ # 读取经过字段映射和派生特征计算后的训练表 train_df = pd.read_csv("data/training_data.csv") # 特征: 所有列减去泄漏字段 X = train_df.drop(columns=LEAKAGE_EXCLUDE, errors='ignore') # 标签: FIB-4分层后的0-3分数 # 0=非MASLD, 1=低风险(FIB-4<1.3), 2=中风险(1.3-2.67), 3=高风险(>2.67) y = train_df['fib4_label'] # 训练/验证/测试集划分 (8:1:1) # random_state=42 保证结果可复现 X_train, X_temp, y_train, y_temp = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) X_val, X_test, y_val, y_test = train_test_split( X_temp, y_temp, test_size=0.5, random_state=42, stratify=y_temp ) # ============================================ # 3. 训练LightGBM模型 # ============================================ # LightGBM回归模型参数 # objective='regression': 回归任务, 预测连续值 # num_leaves=31: 每棵树最多31个叶子, 控制复杂度 # learning_rate=0.05: 学习率, 每棵树的贡献权重 # n_estimators=1000: 最大迭代次数, 配合early stopping # min_child_samples=20: 叶子节点最少样本数, 防止过拟合 # feature_fraction=0.8: 每棵树随机使用80%特征 # bagging_fraction=0.8: 每棵树随机使用80%样本 model = lgb.LGBMRegressor( objective='regression', num_leaves=31, learning_rate=0.05, n_estimators=1000, min_child_samples=20, feature_fraction=0.8, bagging_fraction=0.8, bagging_freq=5, random_state=42, verbose=-1 ) # 训练模型 # eval_set: 用于early stopping的验证集 # callbacks: 当验证集loss不再下降时提前停止 model.fit( X_train, y_train, eval_set=[(X_val, y_val)], callbacks=[lgb.early_stopping(50), lgb.log_evaluation(100)] ) # ============================================ # 4. 评估模型性能 # ============================================ # 在测试集上评估 y_pred = model.predict(X_test) # 计算评价指标 from sklearn.metrics import mean_squared_error, r2_score rmse = np.sqrt(mean_squared_error(y_test, y_pred)) r2 = r2_score(y_test, y_pred) print(f"测试集 RMSE: {rmse:.4f}") print(f"测试集 R²: {r2:.4f}") # ============================================ # 5. 保存模型 # ============================================ # 保存训练好的模型, 用于后续推理 model.booster_.save_model("models/lgbm_trained.txt")
咱们这个项目的核心思路是:用咱们自己收集的本地临床数据,从头训练模型,不依赖任何外部预训练模型。这样做有几个好处:
| 维度 | 固定公式 (FIB-4/APRI/NFS) | 数据驱动训练 (LightGBM等) |
|---|---|---|
| 权重来源 | 文献报告的固定权重,通常来自西方或特定队列人群 | 从本地临床数据集自主学习,完美契合本地患者的病理特征 |
| 变量选择 | 固定包含4-6个变量,无法利用其他多维实验室或影像学信息 | 自动利用47个及更多维度特征,挖掘隐藏在指标之间的组合效应 |
| 非线性关系 | 基于固定数学系数,仅能表达单纯的线性风险趋势 | 能够自动捕捉非线性关联,例如指标的特殊“阈值效应”与变量交互作用 |
| 可扩展性 | 公式由历史文献写死,无法新增或调整变量体系 | 具备极强扩展性,临床加入新字段或新标签后仅需重新训练即可完成升级 |
| 本地适应性 | 直接套用可能由于人种、实验室仪器基线差异造成误判 | 权重完全基于本地数据分布构建,可根据本地随访结局持续校准 |
当前47个基础字段是第一版,后续建议优先补这些容易采集、也比较有用的字段:
| 扩展方向 | 新增字段示例 | 预期价值 |
|---|---|---|
| 人口学与体格 | 性别、腰围 | 补齐参考范围差异和中心性肥胖信息,可计算TyG-WC、腰高比等特征 |
| 生命体征与代谢 | 收缩压、舒张压、尿酸 | 用连续客观指标补充高血压病史、痛风病史等二值字段 |
| 肾功能与炎症 | 肌酐、eGFR、CRP/hs-CRP、淋巴细胞计数 | 增强心肾代谢风险、系统性炎症和NLR/SII等派生特征能力 |
| 生活习惯 | 饮酒量、吸烟史、运动频率 | 记录患者平时生活习惯,方便解释风险来源和给出随访建议 |
| 用药信息 | 他汀类、二甲双胍、GLP-1受体激动剂、抗血小板药 | 药物治疗可能影响MASLD进展和纤维化风险 |
| 肝脏硬度变化 | 历史LSM值、LSM变化率 | 动态变化比单次值更能预测进展 |
| 基因检测 | PNPLA3、TM6SF2、MBOAT7等基因变异 | 遗传因素是MASLD进展的重要决定因素[E21] |
| 肠道菌群 | 肠道菌群多样性、特定菌属丰度 | 新兴研究方向,与MASLD严重度相关 |
# model_matrix.py - 多模型训练和比较 # 所有模型使用同一数据切分, 同一评价指标, 公平比较 from sklearn.linear_model import LinearRegression, ElasticNet from sklearn.ensemble import RandomForestRegressor, HistGradientBoostingRegressor from sklearn.neural_network import MLPRegressor import lightgbm as lgb # XGBoost, CatBoost 在安装后可选启用 # import xgboost as xgb # import catboost as cb # 定义模型矩阵: 所有候选模型及其参数 MODEL_MATRIX = { # ===== 透明统计模型 ===== # 系数可解释, 用于验证复杂模型是否真正带来增益 "linear": LinearRegression(), "elastic_net": ElasticNet( alpha=0.1, # 正则化强度 l1_ratio=0.5, # L1/L2混合比例 max_iter=1000 # 最大迭代 ), # ===== 树模型 ===== # 处理非线性关系和变量交互 "random_forest": RandomForestRegressor( n_estimators=500, # 500棵树 max_depth=10, # 最大深度10 min_samples_leaf=5, # 叶子最少5个样本 random_state=42 ), "hist_gbm": HistGradientBoostingRegressor( max_iter=500, # 最大迭代500 learning_rate=0.05, # 学习率 max_depth=6 # 最大深度 ), "lightgbm": lgb.LGBMRegressor( n_estimators=1000, num_leaves=31, learning_rate=0.05, min_child_samples=20, random_state=42, verbose=-1 ), # ===== 可选模型 (需要额外安装) ===== # "xgboost": xgb.XGBRegressor(...), # "catboost": cb.CatBoostRegressor(...), } # 训练所有模型并记录性能 results = {} for name, model in MODEL_MATRIX.items(): # 训练 model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 评估 rmse = np.sqrt(mean_squared_error(y_test, y_pred)) r2 = r2_score(y_test, y_pred) results[name] = {'rmse': rmse, 'r2': r2} print(f"{name:15s} RMSE={rmse:.4f} R²={r2:.4f}") # 选择最优模型 best_model = min(results, key=lambda x: results[x]['rmse']) print(f"\n最优模型: {best_model}")
# LightGBM 核心代码 import lightgbm as lgb # 定义模型参数 params = { 'objective': 'regression', # 回归任务, 输出连续值 'metric': 'rmse', # 评价指标: 均方根误差 'num_leaves': 31, # 每棵树最多31个叶子 'learning_rate': 0.05, # 学习率: 每棵树的贡献权重 'feature_fraction': 0.8, # 每棵树随机使用80%特征 'bagging_fraction': 0.8, # 每棵树随机使用80%样本 'min_child_samples': 20, # 叶子最少20个样本 } # 训练模型 train_data = lgb.Dataset(X_train, label=y_train) valid_data = lgb.Dataset(X_val, label=y_val) model = lgb.train( params, train_data, num_boost_round=1000, # 最多1000棵树 valid_sets=[valid_data], callbacks=[lgb.early_stopping(50)] # 50轮不改善就停 ) # 预测 y_pred = model.predict(X_test) # 输出0-100连续分数
# XGBoost 核心代码 # import xgboost as xgb # params = { # 'objective': 'reg:squarederror', # 回归任务 # 'max_depth': 6, # 最大深度 # 'learning_rate': 0.05, # 学习率 # 'reg_alpha': 0.1, # L1正则化 # 'reg_lambda': 1.0, # L2正则化 # 'n_estimators': 1000, # 最大树数 # }
# Random Forest 核心代码 from sklearn.ensemble import RandomForestRegressor model = RandomForestRegressor( n_estimators=500, # 500棵树 max_depth=10, # 最大深度10 min_samples_leaf=5, # 叶子最少5个样本 max_features=0.3, # 每棵树随机使用30%特征 random_state=42 ) model.fit(X_train, y_train) y_pred = model.predict(X_test)
# Elastic Net 核心代码 from sklearn.linear_model import ElasticNet model = ElasticNet( alpha=0.1, # 正则化强度 l1_ratio=0.5, # L1和L2的混合比例 max_iter=1000 ) model.fit(X_train, y_train) # 查看每个特征的权重 for name, coef in zip(feature_names, model.coef_): if coef != 0: print(f"{name}: {coef:.4f}")
# CatBoost 核心代码 # import catboost as cb # model = cb.CatBoostRegressor( # iterations=1000, # 最大迭代次数 # learning_rate=0.05, # 学习率 # depth=6, # 树深度 # l2_leaf_reg=3, # L2正则化 # verbose=100 # 每100轮输出日志 # ) # model.fit(X_train, y_train, cat_features=cat_cols)
# HistGradientBoosting 核心代码 from sklearn.ensemble import HistGradientBoostingRegressor model = HistGradientBoostingRegressor( max_iter=500, # 最大迭代500 learning_rate=0.05, # 学习率 max_depth=6, # 最大深度 min_samples_leaf=20 # 叶子最少20个样本 ) model.fit(X_train, y_train) y_pred = model.predict(X_test)
# Logistic Regression 核心代码 from sklearn.linear_model import LogisticRegression model = LogisticRegression( C=1.0, # 正则化强度的倒数 max_iter=1000, random_state=42 ) model.fit(X_train, y_train) # 查看每个特征的权重系数 for name, coef in zip(feature_names, model.coef_[0]): print(f"{name}: {coef:.4f}")
# MLP 核心代码 from sklearn.neural_network import MLPRegressor model = MLPRegressor( hidden_layer_sizes=(128, 64), # 两个隐藏层: 128和64个神经元 activation='relu', # ReLU激活函数 max_iter=500, # 最大迭代500次 early_stopping=True, # 早停: 验证集不改善就停 random_state=42 ) model.fit(X_train_scaled, y_train) # 注意: 需要标准化输入 y_pred = model.predict(X_test_scaled)
# Stacking 核心代码 from sklearn.ensemble import StackingRegressor from sklearn.linear_model import Ridge estimators = [ ('lgbm', lgb.LGBMRegressor(n_estimators=500)), ('rf', RandomForestRegressor(n_estimators=500)), ('hist', HistGradientBoostingRegressor(n_estimators=500)), ] model = StackingRegressor( estimators=estimators, final_estimator=Ridge(alpha=1.0), # 元模型: 岭回归 cv=5 # 5折交叉验证 ) model.fit(X_train, y_train) y_pred = model.predict(X_test)
| 模型 | 架构类型 | 核心思想 | 可解释性 | 训练速度 |
|---|---|---|---|---|
| LightGBM | 梯度提升树 | 直方图加速+叶子优先生长 | TreeSHAP | 快 |
| XGBoost | 梯度提升树 | 正则化控制复杂度 | SHAP库 | 中 |
| CatBoost | 梯度提升树 | Ordered Boosting+对称树 | 内置SHAP | 中 |
| Random Forest | Bagging | 多棵树取平均 | 特征重要性 | 中 |
| Elastic Net | 线性模型 | L1+L2双重正则化 | 权重系数 | 快 |
| Logistic Regression | 线性模型 | Sigmoid映射概率 | 权重系数 | 快 |
| MLP | 神经网络 | 多层全连接学习非线性 | 较难解释 | 慢 |
| Stacking | 集成方法 | 多模型+元模型综合 | 较难解释 | 慢 |
# explain.py - 使用TreeSHAP解释每个特征的贡献 # 原理: TreeSHAP可以精确计算每个特征对预测值的贡献 # 正值 = 推高评分, 负值 = 降低评分 import shap def explain_patient(model, patient_row, feature_cols): """ 计算单个患者的特征贡献 参数: model: 训练好的LightGBM模型 patient_row: 单个患者的数据行 feature_cols: 特征列名列表 返回: contributions: 字典,每个特征的贡献值 """ # 使用pred_contrib=True参数获取TreeSHAP值 # 这是LightGBM内置的SHAP实现,速度很快 shap_values = model.predict( patient_row[feature_cols], pred_contrib=True # 启用TreeSHAP ) # shap_values的形状: (n_samples, n_features + 1) # 最后一列是bias项,需要排除 contributions = dict(zip(feature_cols, shap_values[0][:-1])) return contributions # 示例输出 # { # "AST": +0.35, # AST偏高,推高评分 # "platelet": +0.28, # 血小板偏低,推高评分 # "bmi": -0.12, # BMI正常,降低评分 # "HbA1c": +0.18, # 糖化偏高,推高评分 # "lsm_kpa": +0.42, # 肝硬度偏高,推高评分 # ... # }
# train.py - 防止标签信息泄漏到训练特征 # 原理: 某些字段直接影响标签生成,如果进入训练特征, # 模型会"偷看"标签,导致验证指标虚高 # 需要排除的泄漏字段集合 LEAKAGE_EXCLUDE_FROM_X = { 'pdff_percent', # 直接影响case判定 (PDFF>=5% → case) 'masld_icd_code', # 直接影响case判定 (ICD编码 → case) 'masld_icd_flag', # 直接影响case判定 (诊断标记 → case) 'cardiometabolic_flag', # 直接影响case判定 (代谢标记 → case) 'patient_id', # 标识列,不参与预测 'assessment_time', # 标识列,不参与预测 'masld_score', # 标签本身,不能作为特征 'fib4_label', # 标签本身,不能作为特征 } # 训练时只用安全特征 # 从所有列中删除泄漏字段,剩余的作为训练特征X X_train = train_df.drop( columns=LEAKAGE_EXCLUDE_FROM_X, errors='ignore' # 如果列不存在也不报错 ) # 标签: FIB-4分层后的0-3分数 y_train = train_df['fib4_label'] # 训练LightGBM回归模型 # objective='regression': 回归任务,预测连续值 # num_leaves=31: 控制树的复杂度 # learning_rate=0.05: 学习率,控制每棵树的贡献 # n_estimators=1000: 最大树数,配合early stopping model = lgb.LGBMRegressor( objective='regression', num_leaves=31, learning_rate=0.05, n_estimators=1000, random_state=42 ) model.fit(X_train, y_train)
# risk_assessment.py - MASLD状态判定逻辑 # 判定依据: 中国2024版指南 + EASL 2024指南 # 核心逻辑: 脂肪变证据 + 代谢异常证据 = MASLD成立 def _masld_status(row): """ 判定患者的MASLD状态 返回值: "成立" - 同时满足脂肪变和代谢异常 "不成立" - 有脂肪变但无代谢异常 "证据不足" - 关键字段缺失 "合并其他病因" - 有病毒性肝炎等其他病因 """ # 第1步: 排除其他病因 # 如果有病毒性肝炎、肿瘤史等,标记为合并其他病因 if _has_other_etiology(row): return "合并其他病因" # 第2步: 检查脂肪变证据 (满足任一即可) steatosis_evidence = ( row.get('pdff_percent', 0) >= 5 # MRI-PDFF >= 5% or row.get('cap_db_m', 0) >= 248 # FibroScan CAP >= 248 dB/m or '脂肪肝' in str(row.get('ultrasound_raw_text', '')) # 超声提示 or row.get('masld_icd_flag', False) # ICD编码阳性 ) # 第3步: 检查代谢异常证据 (满足任一即可) metabolic_evidence = _has_metabolic_evidence(row) # 检查项目: # - cardiometabolic_flag: 系统标记的代谢异常 # - diabetes_history: 糖尿病病史 # - hypertension_history: 高血压病史 # - gout_history: 痛风病史 # - bmi >= 23: 超重 (中国标准) # - HbA1c >= 5.7: 糖代谢异常 # - triglycerides >= 1.7: 甘油三酯升高 # - HDL < 1.0(男)/1.3(女): 高密度脂蛋白降低 # 第4步: 综合判定 if steatosis_evidence and metabolic_evidence: return "成立" # 脂肪变 + 代谢异常 = MASLD elif steatosis_evidence and not metabolic_evidence: return "不成立" # 有脂肪变但无代谢异常 else: return "证据不足" # 关键字段缺失
# risk_assessment.py - 脂肪变分级逻辑 # 按优先级使用三个数据源: PDFF > CAP > 超声文本 # PDFF是金标准,CAP是FibroScan输出,超声是文本匹配 def _steatosis_grade(row): """ 脂肪变分级: S0(无) / S1(轻度) / S2(中度) / S3(重度) 数据源优先级: 1. MRI-PDFF (金标准) 2. FibroScan CAP 3. 超声文本关键词 """ # 优先级1: PDFF (最准确) # PDFF = MRI质子密度脂肪分数,是脂肪变定量金标准 pdff = row.get('pdff_percent') if pdff is not None: if pdff < 5: return "S0" # < 5%: 无脂肪变 if pdff < 16: return "S1" # 5-16%: 轻度 if pdff < 22: return "S2" # 16-22%: 中度 return "S3" # >= 22%: 重度 # 优先级2: CAP (FibroScan输出) # CAP = 受控衰减参数,与肝脂肪变程度相关 cap = row.get('cap_db_m') if cap is not None: if cap < 248: return "S0" # < 248 dB/m: 无脂肪变 if cap < 268: return "S1" # 248-268: 轻度 if cap < 280: return "S2" # 268-280: 中度 return "S3" # >= 280: 重度 # 优先级3: 超声文本关键词匹配 text = str(row.get('ultrasound_raw_text', '')) if '重度脂肪' in text: return "S3" if '中度脂肪' in text: return "S2" if '轻度脂肪' in text: return "S1" return "未知" # 所有数据源都没有
# risk_assessment.py - 纤维化风险判定逻辑 # 按优先级使用三个数据源: 病理 > LSM > FIB-4 # 病理是金标准,LSM是FibroScan肝硬度,FIB-4是血清指标 def _fibrosis_risk(row): """ 纤维化风险: 低 / 中间 / 高 数据源优先级: 1. 肝活检病理文本 (金标准) 2. FibroScan LSM (肝硬度值) 3. FIB-4 (血清纤维化评分) """ # 优先级1: 病理文本 (最准确) path = str(row.get('pathology_raw_text', '')) if 'F4' in path or '肝硬化' in path: return "高" # F4 = 肝硬化 if 'F3' in path: return "高" # F3 = 严重纤维化 if 'F2' in path: return "中间" # F2 = 显著纤维化 # 优先级2: LSM (FibroScan肝硬度值) # 单位: kPa (千帕) lsm = row.get('lsm_kpa') if lsm is not None: if lsm >= 12: return "高" # >= 12 kPa: 显著纤维化 if lsm >= 8: return "中间" # 8-12 kPa: 轻度纤维化 return "低" # < 8 kPa: 无/轻微纤维化 # 优先级3: FIB-4 (血清纤维化评分) fib4 = row.get('fib4') if fib4 is not None: if fib4 > 2.67: return "高" # > 2.67: 高风险 if fib4 >= 1.30: return "中间" # 1.30-2.67: 中间风险 return "低" # < 1.30: 低风险 return "未知" # 所有数据源都没有
根据《代谢性脂肪肝项目数据输入与输出要求》,系统当前基础字段47个。为了让后续本地数据更好用,建议再补12项常见字段,主要补上性别、腰围、血压、饮酒、吸烟、运动、尿酸、肾功能和炎症相关信息。
| 分类 | 字段数 | 说明 |
|---|---|---|
| 基础信息 | 3 | 身高、体重、年龄 |
| 代谢共病与既往史 | 6 | 糖尿病、高血压、肝炎、肿瘤、痛风等 |
| 肝功能与肝损伤指标 | 10 | AST、ALT、白蛋白、胆红素等 |
| 血常规指标 | 4 | 血小板、白细胞、血红蛋白等 |
| 糖代谢指标 | 4 | 糖化血红蛋白、空腹血糖、胰岛素、C肽 |
| 血脂指标 | 4 | 总胆固醇、HDL、LDL、甘油三酯 |
| 肿瘤标志物 | 4 | AFP、CEA、CA199、CA125 |
| 铁蛋白 | 1 | 铁代谢指标 |
| 血清纤维化标志物 | 4 | Ⅲ型前胶原、Ⅳ型胶原、层粘连蛋白、透明质酸酶 |
| 影像学指标 | 5 | 超声、LSM、CAP、MRE、病理 |
| 其他 | 2 | NGS基因、细胞因子 |
| 建议补充项 | 12 | 性别、腰围、血压、饮酒、吸烟、运动、尿酸、肾功能和炎症相关字段 |
| 可用性 | 字段数 | 占比 |
|---|---|---|
| 常规可用 | 38 | 81% |
| 部分医院 | 9 | 19% |
下面这些是建议补充的字段,不改变当前47项基础字段的已实现状态;能拿到就尽量拿,拿不到也可以先空着,后面根据实际数据再决定是否进入模型。
| 类别 | 建议字段 | 英文名 | 类型 | 模型/工程价值 | 补充理由 |
|---|---|---|---|---|---|
| 基础信息 | 性别 | sex / gender | 男/女 | 让参考范围更准确 | 很多指标男女参考值不一样,比如腰围、HDL、铁蛋白、尿酸。加上性别后,系统判断会更细。 |
| 生活习惯 | 饮酒量 | alcohol_g_per_week / AUDIT_C | 数值/量表 | 判断饮酒影响 | 建议记录大概喝多少酒,而不是只写“喝/不喝”。这样更容易判断脂肪肝和饮酒有没有关系。 |
| 体格测量 | 腰围 | waist_cm | 数值 | 看腹型肥胖 | 有些人BMI不算特别高,但腰围明显偏大,代谢风险也会高。腰围能补上BMI看不到的信息。 |
| 生命体征 | 收缩压 | sbp | 数值 | 看血压水平 | 比只写“有没有高血压病史”更具体,可以看到当次血压到底高不高。 |
| 生命体征 | 舒张压 | dbp | 数值 | 看血压水平 | 和收缩压一起使用,能更完整地反映血压情况。 |
| 生活习惯 | 吸烟史 | smoking_status | 枚举 | 补充心血管风险 | 吸烟会影响心血管风险,也会影响后续随访建议。可以简单记录从不、已戒、目前吸烟。 |
| 生活习惯 | 运动频率 | exercise_frequency | 枚举/数值 | 补充生活方式信息 | 运动少的人,代谢风险通常更高。可以简单记录每周运动几次,不需要一开始就做复杂量表。 |
| 代谢指标 | 尿酸 | uric_acid | 数值 | 看高尿酸风险 | 尿酸和痛风、代谢问题关系很近。比只写“有没有痛风”更细。 |
| 肾功能 | 肌酐 | creatinine | 数值 | 看肾功能 | 肝脏代谢问题常常和心血管、肾功能风险一起出现。肌酐是很常见的肾功能指标。 |
| 肾功能 | eGFR | eGFR | 数值 | 看肾功能 | eGFR比单看肌酐更直观,能帮助判断肾功能有没有下降。 |
| 炎症指标 | CRP/hs-CRP | crp / hs_crp | 数值 | 看炎症背景 | 这个指标能提示身体有没有炎症状态。解释时要注意感冒、感染、外伤等情况也会让它升高。 |
| 血常规 | 淋巴细胞计数 | lymphocyte_count | 数值 | 补充炎症指标 | 和中性粒细胞、血小板一起,可以算一些简单的炎症相关指标。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 患者身高 | height_cm | 数值 | 与体重自动派生BMI。BMI是代谢异常判定的核心指标之一,也是FIB-4、NFS等评分的组成变量。代码中通过_derive_bmi()函数自动计算:BMI = weight_kg / (height_cm/100)²。 | 文献依据:EASL 2024指南明确指出肥胖与MASLD进展至高级纤维化相关,BMI≥25 kg/m²(WHO标准)或≥23 kg/m²(中国标准)是MASLD代谢异常的核心证据之一[E2]。中国2024版指南进一步细化:BMI≥28 kg/m²为肥胖,≥23 kg/m²为超重,均纳入代谢异常判定阈值[C1]。多项研究显示,BMI每增加5 kg/m²,MASLD患病风险增加约55%[E2]。 |
| 患者体重 | weight_kg | 数值 | 与身高自动派生BMI。BMI是MASLD诊断标准中代谢异常的核心判定指标。同时BMI也是NFS评分的组成变量。 | 文献依据:中国2024版指南将BMI≥23 kg/m²列为MASLD代谢异常判定标准之一[C1]。EASL 2024指南指出,中心性肥胖(腰围男性≥90cm、女性≥85cm)比BMI更能反映代谢风险,但在缺乏腰围数据时BMI是最实用的替代指标[E2]。体重管理是MASLD治疗的基石——指南推荐减重7-10%可显著改善脂肪变和纤维化[C1][E2]。 |
| 患者年龄 | age | 数值 | FIB-4公式核心变量:age × AST / (platelet × √ALT)。年龄越大,FIB-4值越高,纤维化风险评估越保守。同时作为独立训练特征参与模型学习。 | 文献依据:FIB-4公式来自AASLD指南推荐的纤维化初筛工具[E1]。Angulo等提出的NAFLD Fibrosis Score(NFS)将年龄纳入无创纤维化评分,年龄>50岁是纤维化的独立危险因素[E5]。AASLD指南特别指出:对于>65岁人群,FIB-4的截断值应从2.67调整为2.0,因为老年人群纤维化基线风险更高[E1]。Sanyal等的前瞻性研究显示,年龄是NAFLD患者纤维化进展的独立预测因子[E13]。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 糖尿病病史 | diabetes_history | 布尔 | 代谢异常证据。在规则引擎中,糖尿病是代谢异常判定的核心条件之一。在模型中作为二值特征参与训练。阳性时直接标记为代谢异常。 | 文献依据:中国2024版指南明确指出2型糖尿病是MASLD发生和进展的重要因素,T2DM患者MASLD患病率高达70%,且T2DM合并MASLD患者进展为肝纤维化和肝癌的风险显著升高[C1]。EASL 2024指南将糖尿病列为心脏代谢风险核心指标,建议所有T2DM患者常规筛查MASLD[E2]。Eslam等的MAFLD定义将代谢功能障碍(包括糖尿病)作为诊断的必要条件[E4]。多项研究显示,糖尿病是MASLD患者纤维化进展的最强独立预测因子之一[E13]。 |
| 高血压病史 | hypertension_history | 布尔 | 代谢异常证据 + 风险因素。高血压与MASLD患者心血管事件风险升高独立相关。在规则引擎中,高血压是代谢异常判定条件之一。 | 文献依据:EASL 2024指南将高血压列为心脏代谢风险的重要组成部分,指出高血压与MASLD患者心血管事件风险升高独立相关[E2]。中国2024版指南指出,高血压是MASLD的常见共病,约60-80%的MASLD患者合并高血压[C1]。高血压还与肝脏纤维化独立相关——一项纳入12,000例患者的荟萃分析显示,高血压患者发生显著纤维化的风险增加1.4倍[E2]。在风险评估中,高血压的存在提示需要更密切的随访。 |
| 病毒性肝炎病史 | viral_hepatitis_history | 布尔 | 病因排除。阳性时标记为"合并其他病因",提示需要排除病毒性肝炎后再评估MASLD。HBV/HCV合并脂肪肝时需分别评估。 | 文献依据:AASLD指南明确指出,评估脂肪性肝病时需排除病毒性肝炎(HBV、HCV)及其他慢性肝病病因(酒精性、自身免疫性等)[E1]。中国2024版指南强调,我国是HBV高流行区,HBV合并脂肪肝的患者需要区分两种病因各自的贡献[C1]。HCV基因3型具有直接致脂肪变的作用,与代谢性脂肪变的机制不同,需要鉴别诊断。排除其他病因后,才能准确判定是否为MASLD。 |
| 肝脏肿瘤病史 | liver_tumor_history | 布尔 | HCC风险评估 + 病因排除。阳性时直接进入肝癌高风险监测路径,触发3级肝癌风险。 | 文献依据:原发性肝癌诊疗指南(2024年版)明确指出,有肝癌病史的患者属于HCC高危人群,需要进入规范的监测路径[C5]。AASLD HCC指南建议,肝硬化患者每6个月进行一次AFP+超声检查[E23]。对于有肝癌病史的患者,监测频率应更高(每3个月)。在系统中,肝脏肿瘤病史阳性时,hcc_risk_level直接设为3级。 |
| 肝脏肿瘤家族史 | liver_tumor_family_history | 布尔 | HCC风险评估。一级亲属肝癌史是HCC独立危险因素,会提升肝癌风险评分。 | 文献依据:原发性肝癌诊疗指南指出,一级亲属(父母、兄弟姐妹、子女)有肝癌史是HCC的独立危险因素[C5]。家族史阳性的患者,HCC风险比一般人群高2-3倍。AASLD指南建议,有肝癌家族史的肝硬化患者应纳入更密切的监测路径[E23]。在系统中,家族史阳性时会提升hcc_risk_level的判定。 |
| 痛风病史 | gout_history | 布尔 | 代谢异常证据。高尿酸血症是代谢综合征的组成部分,与NAFLD存在独立关联。在规则引擎中,痛风是代谢异常判定条件之一。 | 文献依据:Yuan等的研究显示,高尿酸血症与NAFLD存在剂量-反应关系,尿酸每升高1 mg/dL,NAFLD患病风险增加约14%[E29]。中国2024版指南将高尿酸血症纳入代谢异常的评估范畴[C1]。痛风患者中NAFLD的患病率高达50-70%,显著高于一般人群。高尿酸还与肝脏纤维化独立相关,可能通过诱导氧化应激和炎症反应促进肝损伤[E29]。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| AST | AST | 数值 | FIB-4公式核心变量 + APRI公式变量 + 训练特征。AST升高提示肝细胞损伤。AST/ALT比值>1提示纤维化进展可能。 | 文献依据:AST是FIB-4公式的核心变量之一(FIB-4 = age × AST / (platelet × √ALT))。AASLD指南指出,肝酶异常人群需进一步评估MASLD及纤维化风险[E1]。FAST评分(FibroScan-AST score)将AST与LSM、CAP联合用于识别at-risk NASH,AUC达到0.86[E6]。AST/ALT比值>1在MASLD患者中提示纤维化进展和预后不良[E13]。AST升高还与心血管事件风险增加相关[E2]。 |
| ALT | ALT | 数值 | FIB-4公式核心变量 + 训练特征。FIB-4公式要求ALT>0,否则无法计算。ALT正常不能排除显著纤维化(约30-40%的显著纤维化患者ALT正常)。 | 文献依据:ALT是FIB-4公式的分母变量,FIB-4 = age × AST / (platelet × √ALT)。AASLD指南特别指出,ALT正常不能排除显著纤维化,约30-40%的F3-F4患者ALT在正常范围内[E1]。因此ALT正常时仍需结合其他指标评估。EASL指南建议,ALT持续正常的代谢综合征患者也应考虑肝脏超声检查[E2]。 |
| 白蛋白 | albumin | 数值 | NFS评分变量 + 训练特征。白蛋白由肝脏合成,是反映肝功能储备的重要指标。白蛋白<35 g/L提示肝功能储备下降。 | 文献依据:NAFLD Fibrosis Score(NFS)将白蛋白纳入评分,白蛋白<3.5 g/dL是纤维化的独立预测因子[E5]。白蛋白<35 g/L在临床上定义为低白蛋白血症,提示肝脏合成功能受损。在肝硬化患者中,低白蛋白与失代偿事件(腹水、肝性脑病)风险升高独立相关[E13]。白蛋白还与营养状态相关,低白蛋白可能反映蛋白质能量营养不良。 |
| 总蛋白 | total_protein | 数值 | 训练特征。总蛋白反映肝脏合成功能和免疫状态。总蛋白降低可能提示肝功能受损或营养不良。 | 文献依据:总蛋白是肝功能检查的常规项目,正常范围60-80 g/L。总蛋白降低可能反映:(1) 肝脏合成功能受损(慢性肝病);(2) 蛋白质能量营养不良(常见于晚期肝病);(3) 肾脏丢失(蛋白尿)。在MASLD患者中,总蛋白和白球比异常可能提示疾病进展。 |
| 球蛋白 | globulin | 数值 | 辅助特征。球蛋白包括α、β、γ三种,γ球蛋白升高可能反映免疫激活或慢性炎症。 | 文献依据:球蛋白是总蛋白减去白蛋白的差值。γ球蛋白升高在慢性肝病中常见,可能反映:(1) 肠道细菌易位引起的免疫激活;(2) 自身免疫反应。白球比(A/G)倒置(<1.0)是肝硬化的重要线索。在NAFLD/MASLD中,球蛋白升高与炎症活动度相关。 |
| 总胆红素 | bilirubin | 数值 | 训练特征。胆红素升高提示肝细胞损伤或胆汁排泄障碍。在肝硬化失代偿期,胆红素显著升高。 | 文献依据:胆红素是血红蛋白代谢产物,由肝脏摄取、结合、排泄。总胆红素正常范围3.4-17.1 μmol/L。胆红素升高提示:(1) 肝细胞损伤(肝炎、肝硬化);(2) 胆汁淤积(胆道梗阻);(3) 溶血。在Child-Pugh评分中,胆红素是评估肝硬化严重度的核心指标之一。MELD评分也包含胆红素。 |
| 直接胆红素 | direct_bilirubin | 数值 | 辅助特征。直接胆红素(结合胆红素)升高提示胆汁排泄障碍,有助于鉴别肝细胞性与梗阻性黄疸。 | 文献依据:直接胆红素是经肝脏葡萄糖醛酸化后的胆红素。直接胆红素/总胆红素比值>50%提示梗阻性黄疸或肝内胆汁淤积,<20%提示溶血性或肝细胞性黄疸。在MASLD患者中,直接胆红素轻度升高可能反映肝内胆汁淤积。 |
| 间接胆红素 | indirect_bilirubin | 数值 | 辅助特征。间接胆红素(非结合胆红素)升高提示溶血或肝脏摄取功能下降。 | 文献依据:间接胆红素是未结合的胆红素,需经肝脏代谢。间接胆红素升高常见于:(1) 溶血性贫血;(2) Gilbert综合征(良性遗传性高胆红素血症)。在MASLD患者中,间接胆红素轻度升高可能反映氧化应激增加。 |
| ALP | ALP | 数值 | 辅助特征。碱性磷酸酶升高提示胆汁淤积或骨骼疾病。在肝脏疾病中,ALP升高提示胆道梗阻。 | 文献依据:ALP主要来源于肝脏(胆管上皮)和骨骼。ALP升高>1.5倍正常上限提示胆汁淤积。在NAFLD患者中,ALP轻度升高可能反映:(1) 肝内胆汁淤积;(2) 代谢综合征相关的脂肪性肝炎。GGT/ALP比值有助于鉴别肝脏来源和骨骼来源的ALP升高。 |
| GGT | GGT | 数值 | GGT/PLT比值计算 + 训练特征。GGT升高提示肝胆损伤,GGT/PLT比值>0.25是纤维化的复合信号。 | 文献依据:GGT是肝胆损伤的敏感指标,也与氧化应激和代谢综合征相关。GGT/PLT比值(GGT÷血小板×100)结合了肝损伤(GGT)和门脉高压(血小板下降)两个维度的信号。比值>0.25提示显著纤维化可能。在NAFLD患者中,GGT升高与NASH和纤维化独立相关[E13]。GGT还与心血管事件风险升高相关[E2]。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 血小板计数 | platelet | 数值 | FIB-4公式核心变量 + APRI公式变量 + 训练特征。血小板<150×10⁹/L提示门脉高压可能,<100×10⁹/L高度提示肝硬化。 | 文献依据:血小板是FIB-4公式的核心变量之一(FIB-4 = age × AST / (platelet × √ALT))。AASLD指南明确指出血小板是纤维化评估的关键指标[E1]。血小板减少的机制:肝硬化导致门脉高压→脾功能亢进→血小板破坏增加。血小板<150×10⁹/L提示可能存在门脉高压,<100×10⁹/L高度提示肝硬化。在APRI评分中,血小板也是核心变量:APRI = (AST/ULN) / platelet × 100。多项研究显示,血小板是预测肝硬化失代偿的独立因子[E13]。 |
| 白细胞计数 | white_blood_cell | 数值 | 炎症背景特征。WBC升高可能反映代谢性炎症状态。代谢综合征患者常有轻度WBC升高。 | 文献依据:Duan等的Meta分析显示,多种炎症因子(包括WBC、CRP、IL-6、TNF-α)与NAFLD相关[E18]。NAFLD患者中WBC轻度升高(8-10×10⁹/L)常见,可能反映:(1) 肝脏炎症活动;(2) 代谢性炎症(脂肪组织巨噬细胞浸润)。WBC升高与NASH和纤维化独立相关[E18]。中性粒细胞/淋巴细胞比值(NLR)是更敏感的炎症标志物。 |
| 中性粒细胞分类 | neutrophil_percent | 数值 | 炎症背景特征。NLR(中性粒细胞/淋巴细胞比值)与NAFLD严重度相关,NLR升高提示炎症活动。 | 文献依据:中性粒细胞是先天免疫的主要效应细胞,其升高反映急性炎症状态。NLR(中性粒细胞÷淋巴细胞)是近年来备受关注的炎症标志物。多项研究显示,NAFLD患者NLR显著升高,且与脂肪变程度、NASH和纤维化分期正相关[E18]。NLR>3.0提示中度炎症活动,>5.0提示显著炎症。NLR还与心血管事件风险相关,是MASLD患者心血管风险的辅助评估指标。 |
| 血红蛋白 | hemoglobin | 数值 | 血常规辅助。贫血可能影响肝功能评估的准确性,也可能反映慢性病性贫血。 | 文献依据:血红蛋白是血常规的核心指标。在肝病患者中,贫血可能反映:(1) 慢性病性贫血(炎症介导的铁代谢异常);(2) 消化道出血(肝硬化门脉高压→食管胃底静脉曲张);(3) 营养不良(叶酸/B12缺乏)。在NAFLD/MASLD中,贫血与疾病严重度和不良预后相关。血红蛋白还影响FIB-4的解读——严重贫血可能导致血小板计数偏低,间接影响FIB-4值。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 糖化血红蛋白 | HbA1c | 数值 | 代谢异常证据。HbA1c≥5.7%提示糖代谢异常(糖尿病前期),≥6.5%诊断糖尿病。是MASLD代谢异常判定的核心指标之一。 | 文献依据:中国2024版指南明确将HbA1c≥5.7%列为MASLD代谢异常判定标准之一[C1]。HbA1c反映过去2-3个月的平均血糖水平,比空腹血糖更稳定。EASL 2024指南指出,糖代谢异常是MASLD诊断和疾病进展的重要因素[E2]。HbA1c≥6.5%诊断糖尿病,5.7-6.4%为糖尿病前期。研究显示,HbA1c每升高1%,MASLD患者纤维化进展风险增加约15%[E13]。HbA1c还是预测MASLD患者心血管事件的独立因子[E2]。 |
| 空腹葡萄糖 | fasting_glucose | 数值 | HOMA-IR计算 + TyG计算 + 代谢证据。空腹血糖≥5.6 mmol/L是代谢异常证据,≥7.0 mmol/L诊断糖尿病。 | 文献依据:EASL 2024指南将空腹血糖≥5.6 mmol/L列为代谢异常证据[E2]。空腹血糖是HOMA-IR和TyG指数的计算变量之一。HOMA-IR = 空腹血糖(mmol/L) × 空腹胰岛素(μU/mL) / 22.5。TyG = ln(空腹血糖 × 甘油三酯 / 2)。研究显示,空腹血糖升高与NAFLD患者肝纤维化独立相关,即使在校正糖尿病后仍有显著关联[E4]。空腹血糖还与肝脏脂肪含量正相关。 |
| 空腹胰岛素 | fasting_insulin | 数值 | HOMA-IR计算核心变量。HOMA-IR是评估胰岛素抵抗的金标准替代指标。HOMA-IR≥2.5提示胰岛素抵抗。 | 文献依据:国际MAFLD共识将胰岛素抵抗定义为MASLD的核心驱动因素[E4]。HOMA-IR(Homeostasis Model Assessment of Insulin Resistance)是评估胰岛素抵抗最广泛使用的替代指标。HOMA-IR≥2.5提示胰岛素抵抗,≥4.0提示明显胰岛素抵抗。胰岛素抵抗通过多种机制促进肝脏脂肪沉积:(1) 增加脂肪组织脂解→游离脂肪酸流入肝脏;(2) 增加肝脏de novo脂肪合成;(3) 抑制肝脏脂肪酸氧化。注意:空腹胰岛素不是所有医院常规检查项目,部分医院可能无法提供。 |
| 空腹C肽 | fasting_c_peptide | 数值 | 辅助特征。C肽与胰岛素等摩尔分泌,但半衰期更长,更稳定地反映胰岛β细胞功能。 | 文献依据:C肽是胰岛素原裂解的产物,与胰岛素等摩尔分泌,但C肽不被肝脏首过清除,半衰期更长(约30分钟 vs 胰岛素的5分钟),因此更稳定地反映胰岛β细胞功能。在胰岛素抵抗评估中,C肽/胰岛素比值可辅助判断胰岛素清除率。C肽升高提示高胰岛素血症(胰岛素抵抗的代偿反应)。注意:空腹C肽不是所有医院常规检查项目,主要在内分泌专科开展。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 总胆固醇 | total_cholesterol | 数值 | TC/HDL比值计算 + 训练特征。TC/HDL比值>5.0提示心血管代谢风险显著升高。总胆固醇升高是代谢综合征的组成部分。 | 文献依据:中国2024版指南将血脂异常列为MASLD相关心脏代谢危险因素[C1]。TC/HDL比值是评估心血管风险的实用指标,比值>5.0提示心血管代谢风险显著升高。MASLD患者中约40-60%合并血脂异常。EASL指南指出,血脂异常不仅是MASLD的危险因素,也是心血管事件的独立危险因素[E2]。MASLD患者的心血管事件风险比一般人群高1.5-2倍,是MASLD患者的主要死亡原因之一。 |
| HDL | HDL | 数值 | TC/HDL比值计算 + 代谢证据。HDL-C<1.0 mmol/L(男)/1.3 mmol/L(女)是代谢异常证据。HDL降低是代谢综合征的诊断标准之一。 | 文献依据:EASL 2024指南将HDL-C降低列为代谢异常证据之一[E2]。HDL-C<1.0 mmol/L(男)或1.3 mmol/L(女)是代谢综合征的诊断标准。HDL具有抗炎、抗氧化、促进胆固醇逆转运等保护作用。HDL降低与NAFLD独立相关,且与NASH和纤维化严重度正相关[E2]。研究显示,HDL-C每升高0.1 mmol/L,NAFLD风险降低约8%[E4]。 |
| LDL | LDL | 数值 | 心血管代谢风险特征。LDL升高是动脉粥样硬化的核心危险因素。MASLD患者心血管事件风险显著升高。 | 文献依据:LDL(低密度脂蛋白胆固醇)是传统心血管危险因素。MASLD患者的心血管事件风险比一般人群高1.5-2倍[E2]。MASLD患者中LDL升高的比例约30-50%。LDL还与肝脏脂肪含量独立相关——可能通过影响肝脏脂质代谢促进脂肪变。在风险评估中,LDL升高提示需要更积极的心血管风险管理。 |
| 甘油三酯 | triglycerides | 数值 | TyG计算 + 代谢证据。TG≥1.7 mmol/L是代谢异常证据。甘油三酯是肝脏脂肪合成的直接底物。 | 文献依据:EASL 2024指南将TG≥1.7 mmol/L列为代谢异常证据[E2]。甘油三酯是肝脏脂肪合成的直接底物,TG升高直接反映肝脏脂肪输出增加。TyG指数=ln(TG×FBG/2),是评估胰岛素抵抗的替代指标,与HOMA-IR高度相关。研究显示,TG升高与NAFLD患者NASH和纤维化独立相关[E4]。TG≥2.3 mmol/L的患者,NASH风险增加约2倍[C1]。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| AFP | AFP | 数值 | HCC风险评估核心变量。AFP≥20 ng/mL触发3级肝癌风险,7-20 ng/mL为警戒值。AFP是肝癌筛查的核心血清标志物。 | 文献依据:原发性肝癌诊疗指南(2024年版)明确指出,AFP≥20 ng/mL是HCC的独立危险因素,应触发高风险监测路径[C5]。AASLD HCC指南推荐AFP联合腹部超声用于HCC监测[E23]。AFP的敏感度约60-70%,特异度约80-90%。需要注意的是:(1) 约30-40%的HCC患者AFP正常;(2) AFP升高也可见于活动性肝炎、妊娠、生殖细胞肿瘤。因此AFP需结合影像学综合判断。AFP动态变化比单次值更有意义——AFP持续升高比单次轻度升高更有临床意义[C5]。 |
| CEA | CEA | 数值 | 鉴别信息。癌胚抗原是非特异性肿瘤标志物,在多种恶性肿瘤中可升高,不直接参与MASLD分层。 | 文献依据:CEA(癌胚抗原)是广谱肿瘤标志物,在结直肠癌、胃癌、肺癌等多种恶性肿瘤中可升高。在肝病患者中,CEA轻度升高可能反映:(1) 肝脏清除功能下降;(2) 合并其他肿瘤。CEA不参与MASLD的核心风险分层,但作为鉴别信息保留,帮助识别可能合并的其他肿瘤。 |
| CA19-9 | CA19_9 | 数值 | 鉴别信息。糖类抗原19-9是胆管癌和胰腺癌的标志物,在胆汁淤积时也可升高。 | 文献依据:CA19-9是胆管癌和胰腺癌的常用标志物。在肝病患者中,CA19-9升高可能反映:(1) 胆道梗阻(假阳性);(2) 合并胆管癌。MASLD患者如CA19-9显著升高(>100 U/mL),需排除胆道病变。CA19-9不参与MASLD核心分层,作为鉴别信息保留。 |
| CA125 | CA125 | 数值 | 鉴别信息。糖类抗原125是卵巢癌标志物,在腹水时也可升高。 | 文献依据:CA125是卵巢上皮性肿瘤的标志物。在肝病患者中,CA125升高可能反映:(1) 腹水(肝硬化失代偿);(2) 合并妇科肿瘤。MASLD患者如CA125显著升高,需评估是否存在腹水。CA125不参与MASLD核心分层,作为鉴别信息保留。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 铁蛋白 | ferritin | 数值 | 辅助风险特征。铁蛋白同时受炎症和铁代谢影响,作为复合信号使用。铁蛋白升高不单独触发风险判定,但与其他指标组合时提供额外信息。 | 文献依据:Kowdley等的研究显示,血清铁蛋白>1.5×ULN(正常上限的1.5倍)是晚期纤维化(F3-F4)的独立预测因子,OR=1.66[E19]。张闻平等的研究显示,NAFLD患者血清铁蛋白水平显著升高,且与肝组织炎症活动度正相关[C7]。铁蛋白的特殊性在于它是"复合信号":(1) 铁过载时升高;(2) 炎症时升高(急性时相反应蛋白);(3) 肝细胞损伤时释放。因此铁蛋白升高不一定代表铁过载,也可能只是炎症反应。在系统中,铁蛋白作为辅助特征使用,不单独触发风险判定,但与LSM、FIB-4等组合时提供额外信息。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 血清Ⅲ型前胶原 | type_iii_procollagen | 数值 | 纤维化辅助特征。PIIINP(Ⅲ型前胶原氨基端肽)是ELF面板的核心成分之一,反映胶原合成活跃度。 | 文献依据:ELF(Enhanced Liver Fibrosis)测试将PIIINP、透明质酸(HA)、TIMP-1三项指标组合,用于评估肝纤维化。Younossi等的研究显示,ELF测试对显著纤维化(F≥2)的AUC达到0.84[E8]。PIIINP反映Ⅲ型胶原的合成活跃度,是肝纤维化早期的敏感指标。在肝纤维化进展过程中,Ⅲ型胶原先于Ⅰ型胶原增加,因此PIIINP在早期纤维化中比其他标志物更敏感。注意:血清Ⅲ型前胶原不是所有医院常规检查项目,主要在肝病专科开展。 |
| 血清Ⅳ型胶原 | type_iv_collagen | 数值 | 纤维化辅助特征。Ⅳ型胶原是基底膜的主要成分,其升高反映基底膜重塑和肝窦毛细血管化。 | 文献依据:Mak和Mei的研究系统阐述了Ⅳ型胶原作为纤维化标志物的价值[E32]。Ⅳ型胶原是肝窦基底膜的主要成分。正常情况下肝窦内皮下没有基底膜,但在肝纤维化过程中,肝窦内皮下出现基底膜(肝窦毛细血管化),导致Ⅳ型胶原升高。Ⅳ型胶原是肝纤维化早期的敏感指标,甚至在门管区纤维化之前就可升高。梁湘辉等的研究显示,Ⅳ型胶原联合透明质酸和层粘连蛋白检测可提高肝纤维化的诊断价值[C8]。注意:血清Ⅳ型胶原不是所有医院常规检查项目。 |
| 层粘连蛋白 | laminin | 数值 | 纤维化辅助特征。层粘连蛋白是细胞外基质的非胶原糖蛋白,反映基底膜和细胞外基质重塑。 | 文献依据:Mak和Mei的研究指出,层粘连蛋白是细胞外基质重塑的重要标志物[E32]。层粘连蛋白与Ⅳ型胶原共同构成基底膜的骨架结构。在肝纤维化过程中,层粘连蛋白沉积增加,与肝窦毛细血管化和门管区纤维化相关。梁湘辉等的研究显示,层粘连蛋白联合Ⅳ型胶原和透明质酸可提高肝纤维化的诊断准确率[C8]。注意:层粘连蛋白不是所有医院常规检查项目。 |
| 透明质酸酶 | hyaluronidase | 数值 | 纤维化辅助特征。需要注意:临床常用的纤维化标志物是透明质酸(HA),而非透明质酸酶。HA是ELF面板的核心成分。 | 文献依据:透明质酸(HA)是ELF面板的核心成分之一,反映肝窦内皮细胞功能[E8]。HA由间质细胞合成,正常情况下由肝窦内皮细胞摄取和降解。肝纤维化时,肝窦内皮细胞功能下降→HA清除减少→血清HA升高。HA是肝纤维化最敏感的血清标志物之一。注意:本项目字段名为"透明质酸酶"(hyaluronidase),但临床实际检测的通常是"透明质酸"(HA, hyaluronic acid),两者是不同的物质。建议在数据录入时核对实际检测项目。梁湘辉等的研究验证了HA在肝纤维化诊断中的价值[C8]。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| 肝胆脾胰彩超 | ultrasound_raw_text | 文本 | 脂肪变证据(关键词匹配)。超声对中重度脂肪肝诊断准确性较好(敏感度>80%),是脂肪变的常用初筛工具。 | 文献依据:中国2024版指南指出,影像学脂肪变证据可作为MASLD诊断入口[C1]。Hernaez等的Meta分析显示,超声对中重度脂肪肝的诊断敏感度>80%,特异度>90%,但对轻度脂肪肝(S1)的敏感度较低(约50-60%)[E34]。超声的优势是无创、便宜、易获取,适合大规模筛查。在系统中,通过NLP关键词匹配提取超声报告中的脂肪变信息:"重度脂肪"→S3,"中度脂肪"→S2,"轻度脂肪"→S1。 |
| FibroScan LSM | lsm_kpa | 数值 | 纤维化风险判定(优先级最高)。LSM≥12 kPa提示显著纤维化(F3-F4),≥20 kPa高度提示肝硬化。是无创纤维化评估的核心指标。 | 文献依据:中华医学会瞬时弹性成像专家共识明确指出,LSM可用于无创纤维化风险评估[C3]。LSM的纤维化阈值:F≥2(显著纤维化):LSM≥8.0 kPa;F≥3(严重纤维化):LSM≥10.0 kPa;F=4(肝硬化):LSM≥12.5 kPa(M探头)或≥14.0 kPa(XL探头)。AASLD指南推荐LSM用于MASLD患者的纤维化分层[E1]。LSM的优势是无创、快速、可重复,已在临床广泛使用。注意:LSM受多种因素影响(炎症、胆汁淤积、进食、操作者经验),需结合临床综合判断。 |
| FibroScan CAP | cap_db_m | 数值 | 脂肪变分级判定。CAP≥280 dB/m提示重度脂肪变(S3)。CAP与肝脂肪变程度正相关。 | 文献依据:Petroff等的大型研究验证了CAP在脂肪变评估中的价值[E11]。CAP的脂肪变分级阈值:S0(无脂肪变):<248 dB/m;S1(轻度):248-268 dB/m;S2(中度):268-280 dB/m;S3(重度):≥280 dB/m。CAP的优势是与LSM同时测量(FibroScan一机两用),无需额外检查。注意:CAP的准确性受BMI影响(BMI>30时准确性下降),且对轻度脂肪变的区分能力有限。 |
| MRE AUROC | mre_auroc | 数值 | 质量审查。AUROC是方法评价指标(描述MRE诊断性能),不应作为患者层面输入。建议改为填写MRE肝硬度值(kPa)。 | 文献依据:Selvaraj等的研究比较了MRE和FibroScan在NAFLD纤维化评估中的准确性[E9]。MRE(磁共振弹性成像)是目前最准确的无创纤维化评估方法,AUC可达0.90以上。Singh等的研究进一步验证了MRE在NAFLD纤维化分期中的价值[E10]。但AUROC是描述测试诊断性能的统计指标,不应作为患者层面的输入值。患者层面应填写MRE肝硬度值(kPa),而非AUROC。 |
| 肝活检病理 | pathology_raw_text | 文本 | 纤维化分级(金标准)。病理结果是肝纤维化评估的金标准,F3-F4提示显著纤维化。是模型训练的高质量标签来源。 | 文献依据:Sanyal等的前瞻性研究(NEJM 2021)显示,纤维化阶段与长期结局密切相关——F0-F2年死亡率0.32/100人年,F3为0.89,F4为1.76[E13]。Hagström等的研究进一步证实,纤维化阶段是NAFLD患者死亡率的最强预测因子,比NASH本身更重要[E17]。肝活检是肝纤维化评估的金标准,但因为有创性,不能用于所有患者。在系统中,病理结果用于:(1) 作为模型训练的高质量标签;(2) 有病理结果时,直接用于纤维化分级(优先级最高)。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| MRI-PDFF | pdff_percent | 数值 | MASLD case判定(脂肪变定量金标准)。PDFF≥5%判为脂肪变,是MASLD诊断的核心依据之一。 | 文献依据:中国2024版指南明确指出,MRI-PDFF≥5%是脂肪变的定量标准,可作为MASLD诊断入口[C1]。PDFF(质子密度脂肪分数)是目前最准确的脂肪变定量方法,与病理脂肪变分级高度相关。PDFF的分级阈值:S0(无脂肪变):<5%;S1(轻度):5-16%;S2(中度):16-22%;S3(重度):≥22%。PDFF的优势是无创、定量、可重复,是脂肪变评估的金标准。在系统中,PDFF≥5%是判定MASLD case的核心条件之一。 |
| MASLD诊断编码 | masld_icd_code | 文本 | MASLD case判定。ICD-10编码K75.8(脂肪肝)/K76.0(脂肪变性)辅助判断既往诊断证据。 | 文献依据:ICD-10编码是国际通用的疾病分类编码系统。K75.8(其他特指的炎性肝病)和K76.0(肝脏脂肪变性)是脂肪肝相关的常用编码。在大规模电子健康记录(EHR)研究中,ICD编码常被用于识别NAFLD/MASLD患者。ICD编码的优势是可追溯、可标准化,但可能存在编码不准确的问题。在系统中,ICD编码阳性时,即使PDFF<5%,仍按MASLD case处理——因为脂肪变可能随时间变化,ICD诊断反映了某个时间点的状态。 |
| 是否有MASLD诊断 | masld_icd_flag | 布尔 | MASLD case判定。已有的临床诊断标记,在病历系统中标注。 | 文献依据:临床诊断标记是根据综合评估做出的诊断判断。当masld_icd_flag=true时,说明已经根据临床表现、影像学和实验室检查做出了MASLD诊断。在系统中,这个字段与ICD编码和PDFF共同用于判定MASLD case。临床诊断标记的价值在于:它综合了临床判断,可能包含系统未捕获的信息。 |
| 是否满足心代谢标准 | cardiometabolic_flag | 布尔 | MASLD case判定的必须条件。根据中国2024版指南,MASLD诊断必须同时满足脂肪变+心脏代谢危险因素,两者缺一不可。 | 文献依据:中国2024版指南明确指出,MASLD诊断必须同时满足两个条件:(1) 存在肝脏脂肪变证据(PDFF≥5%、CAP≥248、超声提示脂肪肝、ICD编码阳性);(2) 合并至少一项心脏代谢危险因素(糖尿病、高血压、BMI≥23、HbA1c≥5.7%、TG≥1.7、HDL<1.0/1.3、痛风、腰围超标等)[C1]。EASL 2024指南也强调,MASLD的核心特征是代谢功能障碍驱动的脂肪变[E2]。在系统中,cardiometabolic_flag=false时,即使有脂肪变证据,也不判为MASLD(可能是酒精性脂肪肝或其他原因)。 |
| 字段名 | 英文名 | 类型 | 模型中的作用 | 文献依据 |
|---|---|---|---|---|
| NGS基因情况 | ngs_genetics | 文本 | 遗传易感性评估(辅助)。记录相关的肝病易感基因位点多态性,评估患者从遗传学层面的发病与纤维化进展风险。 | 文献依据:EASL 2024指南和多项中国人群队列研究指出,PNPLA3基因的rs738409位点(G等位基因)以及TM6SF2、MBOAT7等基因的多态性与MASLD的易感性、病情严重程度和HCC发生风险强相关,且存在明显的风险等位基因叠加效应[E21][E22]。在系统中,NGS作为长期预后与分子机制分型的辅助探索特征。 |
| 十二项细胞因子 | cytokines_12 | 数值 | 炎症状态评估(辅助)。记录促炎与抑炎细胞因子的水平(如IL-6、TNF-α、IL-32等),反映患者系统性炎症背景与细胞因子紊乱状态。 | 文献依据:朱书霞等研究指出,MASLD患者血清促炎细胞因子(如IL-32、IL-6和TNF-α)随病情恶化呈升高趋势[C6]。Duan等Meta分析证实,CRP、IL-1β、IL-6、TNF-α等多种循环炎症因子与脂肪性肝炎(MASH)活动度及纤维化进展密切相关[E18]。在模型中,这一指标有助于丰富炎症病理维度,辅助区分单纯性脂肪肝与MASH。 |
根据《代谢性脂肪肝项目数据输入与输出要求》,系统需要输出三部分内容:
| 输出维度 | 内容 | 示例 |
|---|---|---|
| 诊断 | 代谢性脂肪肝诊断成立与否 | 代谢性脂肪肝 成立 |
| 分级 | 代谢性脂肪肝临床病情分级 | 中重度 |
| 预后评估 | 肝硬化风险、肝癌风险 | 肝硬化风险 2级,肝癌风险 2级 |
| 方案 | 输出内容 | 优点 | 缺点 |
|---|---|---|---|
| 方案A:纯等级 | 诊断+分级+风险等级 | 简单直接,符合需求文档 | 信息量少,没法看到具体数值 |
| 方案B:等级+评分 | 诊断+分级+风险等级+0-100评分 | 既有等级又有数值,信息量大 | 评分阈值需要校准 |
| 方案C:等级+逐字段评分 | 诊断+分级+风险等级+每个字段的贡献分 | 能看到每个指标贡献了多少 | 输出较长 |
| 方案D:等级+概率 | 诊断+分级+风险等级+每个等级的概率 | 体现不确定性,信息最丰富 | 输出较复杂 |
{
// ===== 患者信息 =====
"patient_id": "P0001",
"assessment_time": "2026-06-21T10:30:00",
// ===== 诊断结论 (需求文档要求) =====
"diagnosis": "代谢性脂肪肝",
"diagnosis_status": "成立",
// ===== 病情分级 (需求文档要求) =====
"severity_grade": "中重度",
// ===== 预后评估 (需求文档要求) =====
"cirrhosis_risk": "2级",
"hcc_risk": "2级",
// ===== 扩展: 逐字段评分 (内部参考) =====
"field_scores": {
"age": {"value": 52, "score": 5},
"bmi": {"value": 26.5, "score": 3},
"fib4": {"value": 1.82, "score": 12},
"lsm_kpa": {"value": 9.2, "score": 10},
"HbA1c": {"value": 6.2, "score": 6}
// ... 每个字段都有评分
},
"total_score": 58
}
每个字段根据其值落在哪个参考范围,给一个固定的分值。优点是简单透明,缺点是没有考虑字段之间的组合效应。
# 方案一: 基于参考范围的简单评分 # 每个字段独立评分, 最后加总 FIELD_SCORING_V1 = { # ===== 基础信息 ===== "age": [(0,40,0), (40,50,3), (50,60,6), (60,100,10)], "bmi": [(0,23,0), (23,28,4), (28,35,8), (35,100,12)], # ===== 肝功能 ===== "AST": [(0,40,0), (40,80,4), (80,120,8), (120,999,12)], "ALT": [(0,40,0), (40,80,3), (80,120,6), (120,999,10)], "GGT": [(0,50,0), (50,100,4), (100,200,8), (200,999,12)], "albumin": [(35,55,0), (30,35,6), (25,30,10), (0,25,15)], # ===== 纤维化指标 (权重较高) ===== "fib4": [(0,1.3,0), (1.3,2.0,12), (2.0,2.67,20), (2.67,10,30)], "lsm_kpa": [(0,8,0), (8,10,10), (10,12,18), (12,100,25)], "APRI": [(0,0.5,0), (0.5,1.0,6), (1.0,1.5,10), (1.5,10,15)], # ===== 代谢指标 ===== "HbA1c": [(0,5.7,0), (5.7,6.5,6), (6.5,8,10), (8,15,15)], "triglycerides": [(0,1.7,0), (1.7,2.3,4), (2.3,5.6,8), (5.6,999,12)], "HDL": [(1.3,3,0), (1.0,1.3,4), (0.5,1.0,8), (0,0.5,12)], } def score_v1(row): total = 0 for field, ranges in FIELD_SCORING_V1.items(): val = row.get(field, 0) for low, high, s in ranges: if low <= val < high: total += s break return min(total, 100)
直接使用临床指南中定义的阈值(如AASLD、EASL指南),每个阈值对应一个分值。优点是有明确的文献依据,缺点是可能忽略一些边缘情况。
# 方案二: 基于临床指南阈值的评分 # 使用AASLD/EASL指南中的阈值 FIELD_SCORING_V2 = { # FIB-4: AASLD指南推荐的阈值 "fib4": [ (0, 1.3, 0, "低风险"), # AASLD: <1.3 低风险 (1.3, 2.0, 10, "中低风险"), # 1.3-2.0 需要进一步评估 (2.0, 2.67, 18, "中高风险"), # 2.0-2.67 结合VCTE (2.67, 10, 25, "高风险") # >2.67 高风险 ], # LSM: 瞬时弹性成像专家共识阈值 "lsm_kpa": [ (0, 8, 0, "无/轻微纤维化"), (8, 10, 8, "显著纤维化可能"), (10, 12, 15, "显著纤维化"), (12, 100, 22, "肝硬化可能") ], # HbA1c: 中国2024指南阈值 "HbA1c": [ (0, 5.7, 0, "正常"), (5.7, 6.5, 5, "糖尿病前期"), (6.5, 8, 8, "糖尿病"), (8, 15, 12, "控制差") ], }
让机器学习模型直接输出0-100的连续分数,而不是0-3的分类。优点是充分利用模型的非线性能力,缺点是需要校准。
# 方案三: 模型直接输出连续分数 # LightGBM回归模型, 输出0-100连续值 import lightgbm as lgb # 训练时: 标签改为0-100的连续分数 # 不再是0/1/2/3的分类标签 model = lgb.LGBMRegressor( objective='regression', # 回归任务 num_leaves=31, learning_rate=0.05, ) # 训练标签: 0-100连续分数 # 可以用加权公式计算: # score = fib4_score * 0.3 + lsm_score * 0.25 + ... y_train = compute_weighted_score(train_df) model.fit(X_train, y_train) # 预测: 直接输出0-100分数 y_pred = model.predict(X_test) # 例如: 58.3 # 然后根据分数映射到等级 def score_to_grade(score): if score < 30: return "轻度" elif score < 60: return "中重度" else: return "重度"
| 方案 | 原理 | 优点 | 缺点 | 建议 |
|---|---|---|---|---|
| 方案一 | 每个字段独立评分 | 简单透明,容易理解 | 没有考虑字段组合效应 | 适合初步版本 |
| 方案二 | 使用临床指南阈值 | 有文献依据 | 阈值可能不适合本地人群 | 适合有明确指南的指标 |
| 方案三 | 模型直接输出分数 | 充分利用非线性关系 | 需要校准,可解释性稍差 | 适合数据量足够后 |
关于如何分级,我们初步规划了以下几套可供对比的方案,具体选择需结合后续临床运营与系统要求讨论:
精简直观,仅输出三个大维度等级,极易于医生和患者阅读:
| 维度 | 分级 | 判定依据 |
|---|---|---|
| 脂肪变分级 | 轻度 / 中重度 / 重度 | 根据 MRI-PDFF 或 FibroScan CAP 值 |
| 肝硬化风险 | 1级 / 2级 / 3级 | 结合 LSM、FIB-4 以及病理结果 |
| 肝癌风险 | 1级 / 2级 / 3级 | 结合 AFP、肝硬化状态和临床病史 |
更精细的学术判定体系,便于开展多中心科研与精准随访:
| 维度 | 分级 | 判定依据 |
|---|---|---|
| 脂肪变分级 | S0 / S1 / S2 / S3 | 基于 MRI-PDFF 梯度或 CAP 分箱 |
| 纤维化风险 | 低 / 中低 / 中高 / 高 | 联合 FIB-4 复合临床阈值与 VCTE LSM 值 |
| 肝硬化风险 | 1级 / 2级 / 3级 | 结合 LSM 和肝功能储备(白蛋白、胆红素) |
| 肝癌风险 | 1级 / 2级 / 3级 | 基于 AFP 定量上升速率、硬化阶段与宿主危险因素 |
不设固定的风险阶段分箱,系统直接输出 0-100 连续数值。优点是信息量最大,能精确体现病情在随访期间的动态位移;缺点是缺乏直观的诊断标签,要求医生需自主根据业务分界点判定严重性。
评分不是拍脑袋打的,每个分段都有对应的指标阈值。但这个权重分配是初版,等真实数据到了可能需要调整。
# risk_assessment.py - 0-100评分计算 # 注意: 这个权重分配是初版, 等真实数据到了需要校准 def compute_risk_score(row): """ 计算0-100的风险评分 每个指标贡献0-30分(根据权重), 加总得到总分 """ score = 0 # ===== FIB-4 (权重30%, 最高30分) ===== fib4 = row.get('fib4', 0) if fib4 < 1.3: score += 0 # 低风险, 不加分 elif fib4 < 2.0: score += 15 # 中低风险 elif fib4 < 2.67: score += 22 # 中高风险 else: score += 30 # 高风险, 满分 # ===== LSM (权重25%, 最高25分) ===== lsm = row.get('lsm_kpa', 0) if lsm < 8: score += 0 elif lsm < 10: score += 12 elif lsm < 12: score += 18 else: score += 25 # ===== 血小板 (权重15%, 最高15分) ===== platelet = row.get('platelet', 400) if platelet >= 200: score += 0 elif platelet >= 150: score += 8 elif platelet >= 100: score += 12 else: score += 15 # ===== 代谢指标 (权重15%, 最高15分) ===== metabolic_count = 0 if row.get('diabetes_history'): metabolic_count += 1 if row.get('hypertension_history'): metabolic_count += 1 if row.get('HbA1c', 0) >= 5.7: metabolic_count += 1 if row.get('triglycerides', 0) >= 1.7: metabolic_count += 1 if row.get('bmi', 0) >= 28: metabolic_count += 1 if metabolic_count == 0: score += 0 elif metabolic_count <= 2: score += 8 elif metabolic_count <= 4: score += 12 else: score += 15 # ===== 影像/病理 (权重15%, 最高15分) ===== steatosis = row.get('steatosis_grade', '未知') fibrosis = row.get('fibrosis_risk', '未知') if 'F4' in str(row.get('pathology_raw_text', '')): score += 15 # 病理确认肝硬化 elif fibrosis == '高': score += 12 elif fibrosis == '中间': score += 8 elif steatosis == 'S3': score += 6 elif steatosis == 'S2': score += 4 return min(score, 100) # 最高100分 # 评分 → 风险等级映射 def score_to_level(score): if score < 20: return "R1" # 低风险 elif score < 40: return "R2" # 中低风险 elif score < 70: return "R3" # 中高风险 else: return "R4" # 高风险
| 方式 | 适用场景 | 配置要求 | 优缺点 |
|---|---|---|---|
| 本地电脑运行 | 开发调试、个人使用 | Python环境即可 | 最简单,但只能本机用 |
| 局域网部署 | 科室内部多人使用 | 一台电脑做服务器 | 局域网内都能访问,不花钱 |
| 云端部署 | 需要公网访问 | 云服务器 | 随时随地访问,但需要费用 |
| 配置项 | 最低配置 | 推荐配置 | 说明 |
|---|---|---|---|
| CPU | 4核 | 8核 | 模型推理主要靠CPU |
| 内存 | 8GB | 16GB | 模型加载需要2-4GB |
| 磁盘 | 50GB | 100GB SSD | 系统+模型+数据 |
| GPU | 不需要 | 不需要 | 全部是CPU运算 |
# 安装依赖 pip install fastapi uvicorn lightgbm pandas scikit-learn # 启动服务 uvicorn main:app --host 0.0.0.0 --port 8000 # 访问 # 本机: http://localhost:8000 # 局域网: http://服务器IP:8000
# 1. 数据备份 # 每天自动把数据文件夹复制一份 # Windows: 用任务计划程序 # 程序: xcopy # 参数: C:\masld\data C:ackup\masld_%date% /s /e /y # Mac/Linux: 用crontab # 每天凌晨2点备份数据目录 0 2 * * * tar -czf /backup/masld_$(date +\%Y\%m\%d).tar.gz /opt/masld/data/
| 方案 | 费用 | 适用场景 | 优缺点 |
|---|---|---|---|
| 本地电脑 | 0元 | 开发调试 | 最简单,但只能本机用 |
| 科室闲置电脑 | 0元 | 科室内部使用 | 不花钱,但需要一台闲置电脑 |
| 阿里云ECS | 约3000-8000元/年 | 需要公网访问 | 4核8G约3000元/年,8核16G约6000元/年 |
| 华为云ECS | 约3000-8000元/年 | 需要公网访问 | 价格与阿里云相当 |
| 本地服务器 | 约10000-20000元(一次性) | 正式部署 | 一次性投入,长期使用 |
| 配置 | 阿里云(包年) | 华为云(包年) | 腾讯云(包年) |
|---|---|---|---|
| 2核4G | 约1500-2000元 | 约1500-2000元 | 约1500-2000元 |
| 4核8G | 约3000-4000元 | 约3000-4000元 | 约3000-4000元 |
| 8核16G | 约6000-8000元 | 约6000-8000元 | 约6000-8000元 |
| 16核32G | 约12000-15000元 | 约12000-15000元 | 约12000-15000元 |
* 价格仅供参考,实际价格以官网为准,新用户通常有首年折扣
| 配置 | 品牌 | 参考价格 |
|---|---|---|
| 4核8G | 联想/戴尔 塔式服务器 | 约5000-8000元 |
| 8核16G | 华为/戴尔 塔式服务器 | 约10000-15000元 |
| 16核32G | 华为2288H/戴尔T350 | 约20000-30000元 |
# 1. 数据备份 # 每天自动把数据文件夹复制一份 # Windows: 用任务计划程序 # 程序: xcopy # 参数: C:\masld\data C:\backup\masld_%date% /s /e /y # Mac/Linux: 用crontab # 每天凌晨2点备份数据目录 0 2 * * * tar -czf /backup/masld_$(date +\%Y\%m\%d).tar.gz /opt/masld/data/
包含中国最新的 MASLD/MAFLD 防治指南、肝硬化与肝纤维化诊断共识,以及针对中国人群脂肪肝相关的标志物与基因位点研究:
包含国际顶尖医学协会(AASLD, EASL)关于 MASLD/MAFLD 的诊断、风险分层与筛查指南,以及临床高分 non-invasive 评分的经典研究: