1. 项目背景
恶性肿瘤俗称癌症,当前已成为危害我国居民生命健康的主要杀手。应用中医药治疗恶性肿瘤已成为公认的综合治疗方法之一,且中医药治疗乳腺癌有着广泛的适应证和独特的优势。从整体出发,调整机体气血、阴阳、脏腑功能的平衡,根据不同的临床证候进行辨证论治。确定“先证而治”的方向:即后续证侯尚未出现之前,需要截断恶化病情的哪些后续证侯。发现中医症状间的关联关系和诸多症状间的规律性,并且依据规则分析病因、预测病情发展以及为未来临床诊治提供有效借鉴。这样,在治疗患者的过程中,医生可以有效地减少西医治疗的毒副作用,为后续治疗打下基础。并且还能够帮助乳腺癌患者在手术后恢复体质,改善生存质量,有利于提高患者的生存机率。
2. 挖掘目标
2.1 目标
本实验我们对三阴乳腺癌患者的病理信息进行数据挖掘。需要实现以下目标:
- 借助三阴乳腺癌患者的病理信息,挖掘患者的症状与中医证型之间的关联关系。
- 对截断治疗提供依据,挖掘潜性证素。
由于患者在围手术期、围化疗期、围放疗期和内分泌治疗期等各个病程阶段,基本都会出现特定的临床症状,故而可以运用中医截断疗法进行治疗,在辨病的基础上围绕各个病程的特殊证候先证而治。截断扭转的主要观点是强调早期治疗,力图快速控制病情,截断病情邪变深入,扭转阻止疾病恶化。
目前,患者的临床病理信息大部分都记录在纸张上,包含了患者的基本信息、具体患病信息等,很少会将患者的患病信息存放于系统中,因此在对数据进行分析时会面临数据缺乏的情况。针对这种状况,我们采用问卷调查的方式收集数据;运用数据挖掘技术对收集的数据进行数据探索与预处理,形成建模数据;采用关联规则算法,挖掘各中医证素与乳腺癌TNM分期之间的关系。探索不同分期阶段的三阴乳腺癌患者的中医证素分布规律,以及采用截断病变发展、先期干预的治疗思路,指导三阴乳腺癌的中医临床治疗。
在本实验中,我们接触了一种新的数据获取方式——问卷调查法。本次数据挖掘建模的总体流程如下:
- 以问卷调查的方法收集数据,并将问卷信息整理成原始数据
- 对原始数据集进行数据预处理,包括数据清洗、属性规约、数据变换
- 利用步骤2形成的建模数据,采用关联规则算法,调整模型输入参数,获取各中医证素 与乳腺癌TNM分期之间的关系。
- 结合实际业务,对模型结果进行分析,且将模型结果应用到实际业务中,最后输出关联规则结果。
2.2 数据获取
本实验采用调查问卷的形式对数据进行收集。以本实验为例简单介绍如何使用问卷调查的形式来收集数据。 数据获取的具体过程如下:
- 拟定调查问卷表并形成原始指标表。
- 定义纳入标准与排除标准。
- 将收集回来的问卷表整理成原始数据。
在制定问卷表时,首先根据中华中医药学会制定的相关指南与标注,从乳腺癌6种分型的症状中提取相应证素拟定调查问卷,并制定三阴乳腺癌中医证素诊断量表。从调查问卷中提炼信息形成原始属性表。然后依据标准定义表,将有效的问卷表整理成原始数据。 问卷调查需要满足的两个条件:
- 问卷信息采集者均要求有中医诊断学基础,能准确识别病人的舌苔脉象,用通俗的语言解释医学术语,并确保患者信息填写准确。
- 问卷调查对象必须是三阴乳腺癌患者。
3. 数据预处理
3.1 数据清洗
由于本实验采用调查问卷的形式收集数据,应对收集到的调查问卷进行有效性筛选,收集者根据从医知识、日常知识等方面来对数据进行筛选。 并将有效问卷整理成原始数据,共930条记录。
3.2 属性规约
为了更有效地对其进行挖掘,将冗余属性与挖掘任务不相关属性剔除。因此选取其中6种证型得分、TNM分期的属性值构成数据集。
3.3 数据变换
数据变换采用属性构造和数据离散化两种方法对数据进行处理。首先通过属性构造,获得证型系数,然后通过聚类算法对数据进行离散化处理,形成建模数据。
3.3.1 属性构造
为了更好地反映出中医证素分布的特征,采用证型系数代替具体单证型的证素得分,证型相关系数计算公式为:证型系数=该证型得分/该证型总分。
3.3.2 数据离散化
由于Apriori关联规则算法无法处理连续型数值变量,为了将原始数据格式转换为适合建模的格式,需要对数据进行离散化。本章采用聚类算法对各个证型系数进行离散化处理,将每个属性聚成4类。
import pandas as pd
from sklearn.cluster import KMeans
data = pd.read_excel('./chapter8/demo/data/data.xls')
k = 4
typelabel ={
'肝气郁结证型系数':'A', '热毒蕴结证型系数':'B', '冲任失调证型系数':'C', '气血两虚证型系数':'D', '脾胃虚弱证型系数':'E', '肝肾阴虚证型系数':'F'}
keys = list(typelabel.keys())
result = pd.DataFrame()
for i in range(len(keys)):
print("正在进行{}的聚类" .format(keys[i]))
kmodel = KMeans(n_clusters= k)
kmodel.fit(data[[keys[i]]])
r1 = pd.DataFrame(kmodel.cluster_centers_, columns = [typelabel[keys[i]]])
r2 = pd.Series(kmodel.labels_).value_counts()
r2 = pd.DataFrame(r2, columns = [typelabel[keys[i]] + 'n'])
r = pd.concat([r1, r2], axis = 1).sort_values(typelabel[keys[i]