挖掘目标
1、借助三阴乳腺癌患者的病理信息,挖掘患者的症状与中医证型之间的关联关系(关联规则算法)
2、对截断治疗提供依据,挖掘潜性证素
数据预处理
1、属性规约
本案例收集的数据共73个属性,我们只选择6中证型得分、TNM分期的属性值构造数据集
2、数据变换
1)属性构造
为了更好的反映出中医证素分布的性质,使用证型系数来代替证型得分数据。
证型系数 = 该证型得分/该证型总分
2)数据离散化
由于Apriori算法无法处理连续型数值变量,需将数据离散化。
离散化首先会想到使用pandas的cut函数,但这种切分方式是不合适,应该使用聚类的方式
比如将肝气郁结证型数据离散化:
将数据聚类,可以得到4个簇,对簇中心进行排序,然后使用pandas的rolling_mean函数计算相邻两个数的均值,作为不同簇的界。
代码如下:
datafile = '../data/data.xls' #待聚类的数据文件
processedfile = '../tmp/data_processed.xls' #数据处理后文件
typelabel ={u'肝气郁结证型系数':'A', u'热毒蕴结证型系数':'B', u'冲任失调证型系数':'C', u'气血两虚证型系数':'D', u'脾胃虚弱证型系数':'E', u'肝肾阴虚证型系数':'F'}
k = 4 #需要进行的聚类类别数
#读取数据并进行聚类分析
data = pd.read_excel(datafile) #读取数据
keys = list(typelabel.keys())
result = pd.DataFrame()
if __name__ == '__main__': #判断是否主窗口运行,如果是将代码保存为.py后运行,则需要这句,如果直接复制到命令窗口运行,则不需要这句。
for i in range(len(keys)):
#调用k-means算法,进行聚类离散化
print(u'正在进行“%s”的聚类...' % keys[i])
kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data[[keys[i]]].as_matrix()) #训练模型
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']) #转为DataFrame,记录各个类别的数目
r = pd.concat([r1, r2], axis = 1).sort(typelabel[keys[i]]) #匹配聚类中心和类别数目
r.index = [1, 2, 3, 4]
r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]], 2) #rolling_mean()用来计算相邻2列的均值,以此作为边界点。
r[typelabel[keys[i]]][1] = 0.0 #这两句代码将原来的聚类中心改为边界点。
result = result.append(r.T)
result = result.sort() #以Index排序,即以A,B,C,D,E,F顺序排
result.to_excel(processedfile)
模型构建
使用关联算法进行患者症状与中医证型之间的关系。