中医证型关联规则挖掘

来源:互联网 发布:模拟器登不上淘宝 编辑:程序博客网 时间:2024/04/29 11:06

1.目的
借助患者病理信息,挖掘患者的症状与中医证型之间的关联关系,对治疗提供依据,挖掘潜在证素
2.挖掘方法与过程
采用关联规则算法,挖掘各中医证素与乳腺癌分期之间的关系
步骤:

  1. 问卷采集数据,形成原始数据
  2. 数据预处理(数据清洗、属性规约、数据交换)
  3. 对数据采用关联规则算法,训练得到关系模型
  4. 结果分析,应用实际

3.数据预处理
(1)数据清洗:对数据进行有效性检查,整理成为原始数据
(2)属性规约:将数据的73个属性取其重要属性,最终的属性为:
6种证型得分、分期的属性值
(3)数据变换:
1)属性构造:采用证型系数代替具体单证型的证素得分,
证型系数=该证型得分/该证型总分
2)数据离散化:由于Apriori关联规则无法处理连续型数值变量,需要将原始数据离散化,将每个属性聚成4类。

'''聚类离散化'''from __future__ import print_function#导入系统输出函数import pandas as pd #数据分析包from sklearn.cluster import KMeans#K均值聚类算法#1.初始化操作datafile = "E:/MachineLearning-data/Medicine_03/data.xls"#原始数据processedfile = "E:/MachineLearning-data/Medicine_03/processed.xls"#离散化数据#对产生的数据类进行命名typelabel = {u"肝气郁结证型系数":'A',u"热毒蕴结证型系数":"B",u"冲任失调证型系数":"C",             u"气血两虚证型系数":"D",u"脾胃虚弱证型系数":"E","肝肾阴虚证型系数":"F"}k = 4 #聚类类别数#2.读取数据data = pd.read_excel(datafile)#读取Excel表格数据keys = list(typelabel.keys())#将类别标签作为键名称result = pd.DataFrame()#数据框#3.数据聚类#判断该模块是否为主模块if __name__ == "__main__":    #i取值0-4    for i in range(len(keys)):        print(u'正在进行"%s"的聚类'%keys[i])#6个类别        #调用KMeans进行聚类,聚类数为4,并行数等于CPU数:4        kmodel = KMeans(n_clusters=k,n_jobs=4)        kmodel.fit(data[[keys[i]]].as_matrix())#将数据进行矩阵化后训练数据        #聚类中心        r1 = pd.DataFrame(kmodel.cluster_centers_,columns=[typelabel[keys[i]]])        #分类统计        r2 = pd.Series(kmodel.labels_).value_counts()        #转化为Dataframe,记录各个类别数目        r2 = pd.DataFrame(r2,columns=[typelabel[keys[i]]+'\n'])        #匹配聚类中心和类别数目        #此处排序为sort_values()方法,而不是sort()方法        r = pd.concat([r1,r2],axis=1).sort_values(typelabel[keys[i]])        r.index = [1,2,3,4]        #计算相邻两列的距离,以此作为边界点        r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]],2)        #聚类中心改为边界点        r[typelabel[keys[i]]][1] = 0.0        result = result.append(r.T)    #以index排序,即以A、B..排序    result = result.sort_index()#按index排序使用sort_index()方法    result.to_excel(processedfile)

这里写图片描述

4.模型构建
关联规则算法主要用于寻找数据集中项之间的关系,基于样本的统计规律,进行关联规则挖掘

'''采用apriori关联规则算法进行分析'''from __future__ import print_functionfrom apriori import * #导入自定义的Apriori函数import pandas as pdimport time#导入时间库用来计时inputfile = "E:/MachineLearning-data/Medicine_03/apriori.txt"data = pd.read_csv(inputfile,header=None,dtype=object)start = time.clock()#计时开始print(u'\n转化原始数据至0-1矩阵--------')#转化0-1矩阵的过渡函数,将标签数据转为1ct = lambda x:pd.Series(1,index=x[pd.notnull(x)])#用map方式执行b = map(ct,data.as_matrix())#实现矩阵转化,除1以外,全为0data = pd.DataFrame(list(b)).fillna(0)end = time.clock()#计时结束print(u'\n转换完毕,用时:%0.2f秒'%(end-start))del b #删除中间变量b,节省内存support = 0.06 #最小支持度confidence = 0.75 #最小置信度ms = '----' #连接符start = time.clock()print(u'\n开始搜索关联规则---')find_rule(data,support,confidence,ms)end = time.clock()print(u'\n搜索结束,用时%0.2f秒'%(end-start))
转化原始数据至0-1矩阵--------转换完毕,用时:1.01秒开始搜索关联规则---正在进行第1次搜索...数目:276...正在进行第2次搜索...数目:947...正在进行第3次搜索...数目:41...结果为:                       support  confidenceA3----F4----H4        0.078495    0.879518C3----F4----H4        0.075269    0.875000B2----F4----H4        0.062366    0.794521C2----E3----D2        0.092473    0.754386D2----F3----H4----A2  0.062366    0.753247搜索结束,用时4.79
错误1data argument can't be an iterator解决方法:b是一个map数据类型,无法完成迭代操作,将其转换为list,即代码:pd.DataFrame(list(b)).fillna(0)

5.模型分析及应用
根据运行结果,我们得出了5个关联规则,然而并非所有的关联规则都有意义,我们只在乎以H为规则结果的规则(即说明在哪些情况下容易产生疾病和疾病所处分期)
A3—-F4—-H4 :支持度为7.85%,置信度为:87.95%
表示在肝气郁结证型系数为第三阶段,肝肾阴虚证型系数为第四阶段,此时分期H4期的可能性为87.95%,而这种情况发生的可能性为7.85%
C3—-F4—-H4 :支持度为7.52%,置信度为:87.5%
B2—-F4—-H4 :支持度为6.23%,置信度为:79.45%

原创粉丝点击