1. 项目背景与研究价值
慢性胃炎作为消化系统常见疾病,中医治疗强调辨证施治与个体化用药。传统中医临床经验主要依靠师徒传承和个人积累,这种模式存在知识传递效率低、难以规模化等局限。随着医疗信息化发展,电子病历系统积累了海量临床数据,为系统性挖掘中药配伍规律提供了可能。
本研究创新性地将数据挖掘技术与中医临床实践相结合,通过分析两家三甲医院近8年的慢性胃炎住院病历数据(共计2214例),运用频数分析、聚类算法、关联规则挖掘等方法揭示中药配伍的内在规律。同时构建了基于Resblock模块优化的BP神经网络模型,实现从临床症状到中药处方的智能预测。
提示:本项目所有分析均基于脱敏后的结构化病历数据,不涉及患者隐私信息。数据处理环节已通过人工复核和标准化流程确保质量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备与预处理
2.1 数据来源与特征
研究采用双中心数据设计,分别来自:
- 医院A:2016-2024年数据,共1582例,用于规律挖掘
- 医院B:2013-2021年数据,共632例,用于模型训练
数据集包含364个临床特征(症状、体征、舌脉等)和469种中药,构成一个高维稀疏矩阵。原始数据以Excel格式存储,包含以下关键字段:
- 患者基本信息(年龄、性别等)
- 中医四诊信息
- 实验室检查结果
- 中药处方(药物组成、剂量)
- 疗效评价
2.2 数据清洗流程
数据清洗是确保分析质量的关键环节,我们采用多阶段处理策略:
python复制import pandas as pd
import re
from tqdm import tqdm
def clean_herb_name(text):
"""标准化中药名称"""
# 去除剂量信息(如"黄芪10g"→"黄芪")
text = re.sub(r'\d+\.?\d*[gml]?', '', str(text))
# 统一异体字(如"栝楼根"→"瓜蒌根")
herb_map = {'栝楼':'瓜蒌', '元胡':'延胡索'}
for k, v in herb_map.items():
text = text.replace(k, v)
return text.strip()
# 读取原始数据
raw_data = pd.read_excel('clinical_records.xlsx')
# 中药名称标准化
tqdm.pandas(desc="Cleaning herb names")
raw_data['herb_cleaned'] = raw_data['中药名称'].progress_apply(clean_herb_name)
# 保存处理结果
raw_data.to_excel('cleaned_data.xlsx', index=False)
关键处理步骤:
- 剂量信息分离:将"黄芪10g"拆分为"黄芪"和剂量"10"
- 别名统一:建立别名映射表,规范中药名称
- 缺失值处理:对重要特征采用多重插补法
- 异常值检测:基于3σ原则识别异常剂量
注意:实际项目中我们发现约12%的处方存在书写不规范问题,如"二陈汤加减"这类组方描述,需要人工复核或使用NLP技术进一步处理。
3. 频数分析与核心用药发现
3.1 高频药物统计
对7375个用药实例进行分析,得到以下核心发现:
| 排名 | 中药 | 频次 | 频率(%) | 平均剂量(g) | 主要功效 |
|---|---|---|---|---|---|
| 1 | 甘草 | 341 | 71.49 | 7.8 | 补脾益气 |
| 2 | 陈皮 | 280 | 58.70 | 9.2 | 理气健脾 |
| 3 | 半夏 | 272 | 57.02 | 8.5 | 燥湿化痰 |
| 4 | 白芍 | 237 | 49.69 | 12.0 | 养血柔肝 |
| 5 | 柴胡 | 236 | 49.48 | 10.5 | 疏肝解郁 |
频数分布呈现典型的长尾特征(见图1),前20味药覆盖了约85%的用药实例,符合"核心药物+辅助药物"的中医组方特点。

3.2 功效类别分析
将高频药物按功效分类,发现以下规律:
- 理气药(陈皮、柴胡等)占比最高(32.6%)
- 健脾药(白术、党参等)次之(28.4%)
- 清热药(黄连、黄芩等)占19.7%
- 活血药(丹参、当归等)相对较少(12.3%)
这一分布与慢性胃炎"脾虚气滞为本,湿热瘀血为标"的病机特点高度吻合。
4. 聚类分析与方剂规律挖掘
4.1 K-means聚类实现
采用肘部法则确定最佳簇数,当k=9时出现明显拐点:
python复制from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(herb_matrix)
# 肘部法则
wcss = []
for i in range(1, 21):
kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
kmeans.fit(X_scaled)
wcss.append(kmeans.inertia_)
plt.plot(range(1,21), wcss, marker='o')
plt.xlabel('簇数')
plt.ylabel('WCSS')
plt.title('肘部法则确定最佳簇数')
plt.show()

4.2 聚类结果解读
9个簇的临床解释性评分及代表药物:
| 簇号 | 轮廓系数 | 可解释性 | 核心药物 | 对应证型 |
|---|---|---|---|---|
| 0 | 0.149 | 5 | 延胡索、砂仁、党参 | 脾气虚兼气滞 |
| 1 | 0.132 | 5 | 黄芩、干姜、桂枝 | 寒热错杂 |
| 2 | 0.098 | 2 | 黄连、枳实、厚朴 | 湿热中阻 |
| ... | ... | ... | ... | ... |
实操心得:聚类结果需结合中医理论解读。我们发现簇2可解释性低,经核查是该簇包含多种证型的过渡状态药物,后续可通过增加临床症状特征改善聚类效果。
5. 关联规则挖掘
5.1 Apriori算法实现
设置最小支持度0.1,最小置信度0.8,挖掘中药配伍规律:
python复制from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
# 创建药物共现矩阵
herb_cooccurrence = pd.crosstab(index=df['处方ID'], columns=df['中药名称'])
# 挖掘频繁项集
frequent_itemsets = apriori(herb_cooccurrence, min_support=0.1, use_colnames=True)
# 生成关联规则
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.8)
# 筛选提升度>1的有效规则
significant_rules = rules[rules['lift'] > 1].sort_values('confidence', ascending=False)
5.2 关键规则分析
支持度TOP5规则:
| 前项 | 后项 | 支持度(%) | 置信度(%) | 提升度 |
|---|---|---|---|---|
| 党参 | 甘草 | 29.56 | 89.21 | 1.25 |
| 茯苓,陈皮 | 半夏 | 25.37 | 88.43 | 1.55 |
| 白术,甘草 | 陈皮 | 23.18 | 86.72 | 1.48 |
这些规则揭示了临床常用药对,如"茯苓-陈皮-半夏"组合源自经典方剂二陈汤,适用于痰湿型胃炎。
6. Resblock优化BP神经网络
6.1 模型架构设计
python复制import torch
import torch.nn as nn
class ResBlock(nn.Module):
def __init__(self, in_channels):
super().__init__()
self.linear1 = nn.Linear(in_channels, in_channels*2)
self.linear2 = nn.Linear(in_channels*2, in_channels)
self.lrelu = nn.LeakyReLU(0.1)
def forward(self, x):
residual = x
out = self.linear1(x)
out = self.lrelu(out)
out = self.linear2(out)
out += residual
return self.lrelu(out)
class HerbPredictor(nn.Module):
def __init__(self, input_dim, output_dim):
super().__init__()
self.resblock1 = ResBlock(input_dim)
self.resblock2 = ResBlock(input_dim)
self.fc = nn.Linear(input_dim, output_dim)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.resblock1(x)
x = self.resblock2(x)
return self.sigmoid(self.fc(x))
模型特点:
- 双Resblock结构缓解梯度消失
- LeakyReLU激活函数避免神经元死亡
- Sigmoid输出层适配多标签分类
6.2 训练与评估
采用二折交叉验证,关键指标:
| 指标 | 均值 | 标准差 |
|---|---|---|
| 准确率 | 0.714 | 0.012 |
| 宏平均F1 | 0.435 | 0.017 |
| 黄芩F1 | 0.534 | 0.011 |
| 白芍召回率 | 0.080 | 0.009 |
避坑指南:低频药物预测效果差的问题,我们采用以下解决方案:
- 样本加权:根据频次倒数调整损失函数权重
- 数据增强:基于关联规则生成合成样本
- 分层抽样:确保每折包含各类药物
7. 临床应用建议
基于研究结果,我们开发了临床辅助决策模块的工作流程:
- 症状输入:医师录入患者主要症状(如"胃痛、嗳气")
- 证型推断:模型输出可能的证型分布(如"肝气犯胃 65%")
- 药物推荐:
- 核心药物:根据频数分析推荐高频药物
- 配伍建议:基于关联规则推荐常用药对
- 个性调整:结合聚类结果提供不同证型的特色用药
实际应用中发现,该系统可缩短年轻医师的处方决策时间约40%,同时使处方配伍合理性提升28%(基于专家评审结果)。
8. 局限性与改进方向
当前研究的不足之处:
- 数据局限性:样本来自两家医院,可能存在地域偏倚
- 特征工程:未充分挖掘症状时序关系和轻重程度
- 模型解释性:神经网络决策过程仍为"黑箱"
后续优化计划:
- 建立多中心协作网络,扩大数据来源
- 引入图神经网络捕捉药物相互作用
- 开发SHAP等可解释性工具辅助临床理解
所有代码和数据处理流程已开源,研究者可基于实际需求调整参数。特别提醒,临床应用前需在当地数据上进行验证性训练,以适配不同地区的用药习惯差异。
