基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘
首先癌癥有不同的發(fā)展期
不同發(fā)展期的癌癥有不同的癥型
這些癥型都處于不同的嚴重程度。
因此收集病人樣本930條,最終挖掘目標是:
找出這些嚴重程度不同的癥型和癌癥發(fā)展階段(我們知道癌癥有初期,中期,晚期等)之間的關(guān)系(也就是找到癥狀與疾病之間的關(guān)聯(lián)規(guī)則)
數(shù)據(jù)來自書籍《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》的第8章
書籍《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》中使用了Apriori算法來得到結(jié)果,敝文嘗試使用另外一種關(guān)聯(lián)規(guī)則挖掘算法:FP-Growth 來獲得最終的挖掘結(jié)果。
敝文的前半部分代碼來自《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》,
后半部分代碼通過把挖掘算法Apriori修改為FP-Growth而得,
最終實驗結(jié)果表明:FP-Growth可以獲得與Apriori一樣的挖掘效果,并且提升了挖掘速度。
挖掘總流程:
一(對應(yīng)代碼1)、
每人的6種癥型(癥狀名字的代號是A~F,分別對應(yīng)下面data.xls中的各種癥型)都處于不同的嚴重程度,
每種癥型按照嚴重程度高低用具體數(shù)字賦值,然后根據(jù)癥型的嚴重程度不度,聚類為四個區(qū)間,并根據(jù)某病人的某種癥狀的嚴重程度對應(yīng)的數(shù)值,歸類到四個區(qū)間中的某一個區(qū)間(下面表格中的區(qū)間由后面代碼中的Kmeans聚類后得到)。各個癥型區(qū)間表格如下:
表格用法舉例:
例如一個人的肝氣郁結(jié)癥型比較嚴重,我們可以給他A3或者A4,如果比較輕,我們給他A1或者A2
同樣的,癥型之間我們認為地位是等同的,一個癥型就是一個6維矢量中的其中一維,6個癥型構(gòu)成了一個6維矢量,其實也就是數(shù)據(jù)挖掘算法眼中的集合。
由于每個病人都有六種癥狀的不同區(qū)間(例如A1,A2,A3,A4),因此每個病人都可以由一個6維矢量(矢量中的每一維代表一種癥型)來表示,例如(A1,B3,C2,D2,E2,F4)
這些表格中的各個區(qū)間的邊界數(shù)值都是怎么來的呢?由代碼1運行時,通過Kmeans聚類而得
代碼1:
# -*- coding: utf-8 -*- ''' 聚類離散化,最后的result的格式為:1 2 3 4 A 0 0.178698 0.257724 0.351843 An 240 356.000000 281.000000 53.000000 即(0, 0.178698]有240個,(0.178698, 0.257724]有356個,依此類推。 ''' from __future__ import print_function import pandas as pd from sklearn.cluster import KMeans # 導入K均值聚類算法datafile = '../data/data.xls' #待聚類的數(shù)據(jù)文件 processedfile = '../tmp/data_processed.xls' # 數(shù)據(jù)處理后文件 typelabel = {u'肝氣郁結(jié)證型系數(shù)': 'A', u'熱毒蘊結(jié)證型系數(shù)': 'B', u'沖任失調(diào)證型系數(shù)': 'C', u'氣血兩虛證型系數(shù)': 'D', u'脾胃虛弱證型系數(shù)': 'E', u'肝腎陰虛證型系數(shù)': 'F'} k = 4 # 需要進行的聚類類別數(shù)# 讀取數(shù)據(jù)并進行聚類分析 data = pd.read_excel(datafile) # 讀取數(shù)據(jù) keys = list(typelabel.keys()) result = pd.DataFrame()if __name__ == '__main__': # 判斷是否主窗口運行,如果是將代碼保存為.py后運行,則需要這句,如果直接復制到命令窗口運行,則不需要這句。for i in range(len(keys)):#每輪循環(huán)處理一個癥狀的聚類和數(shù)量統(tǒng)計print("i=", i)# 調(diào)用k-means算法,進行聚類離散化print(u'正在進行“%s”的聚類...' % keys[i])kmodel = KMeans(n_clusters=k, n_jobs=4) # n_jobs是并行數(shù),一般等于CPU數(shù)較好kmodel.fit(data[[keys[i]]].as_matrix()) # 訓練模型r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]]) # 聚類中心print("r1=",r1)print("label=", typelabel[keys[i]])###r2 = pd.Series(kmodel.labels_).value_counts() # 分類統(tǒng)計print("r2=",r2)print("-------------------------------------")r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'number']) # 轉(zhuǎn)為DataFrame,記錄各個類別的數(shù)目print("r2=", r2)#這一段用來統(tǒng)計聚類中各個類別的數(shù)量,并且寫入一列中,并改改名字####r=pd.concat([r1, r2], axis=1)print("排序前r=",r)r=r.sort_values(typelabel[keys[i]])print("排序后r=",r)r.index = [1, 2, 3, 4]#index指的是列標簽,typelabel[keys[i]]指的是行標簽####print("----------------------------------------------------")print("計算均值前的表格r=",r)r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]], 2) # rolling_mean()用來計算相鄰2列的均值,以此作為邊界點。r[typelabel[keys[i]]][1] = 0.0 # 這兩句代碼將原來的聚類中心改為邊界點.這里的用法類似于C語言中的r[i][j]print("計算均值后的表格r=",r)result = result.append(r.T)#旋轉(zhuǎn)print("----------------------------------------------------")####print("result=",result)result = result.sort_index() # 以Index排序,即以A,B,C,D,E,F順序排,A代表癥狀的名稱,BCDE各自代表該癥狀的嚴重程度result.to_excel(processedfile)
運行代碼1后得到聚類處理后的文件為data_processed.xls(各種癥型的數(shù)據(jù)統(tǒng)計),得到上面的表格9~14,同時也得到統(tǒng)計結(jié)果:
輸出的結(jié)果是:
| ? | 1 | 2 | 3 | 4 |
| A | 0 | 0.178697589 | 0.2577240643 | 0.3518431814 |
| Anumber | 240 | 356 | 281 | 53 |
| B | 0 | 0.1507662277 | 0.2966313131 | 0.4897045019 |
| Bnumber | 325 | 396 | 180 | 29 |
| C | 0 | 0.2021487293 | 0.2890611377 | 0.4235365546 |
| Cnumber | 297 | 394 | 204 | 35 |
| D | 0 | 0.1765046363 | 0.2571199525 | 0.3661899988 |
| Dnumber | 309 | 371 | 211 | 39 |
| E | 0 | 0.1526978022 | 0.2575413223 | 0.3748694473 |
| Enumber | 273 | 319 | 242 | 96 |
| F | 0 | 0.1791433755 | 0.2613863944 | 0.354642668 |
| Fnumber | 200 | 237 | 265 | 228 |
結(jié)合輸入文件data.xls
由于得到了每種癥狀的各種嚴重程度的量化區(qū)間, 所以把data.xls中的各個參數(shù)(例如A癥狀)轉(zhuǎn)化為A1~A4
轉(zhuǎn)化辦法如下:
data.xls中,對每行的首單元進行按行排序,由于data.xls中第一列的各項數(shù)據(jù)處于data_processed.xls的四個區(qū)間中,
分別改為A1~A4,從而得到下一份代碼需要的文件data.txt文件( 可從百度網(wǎng)盤下載: https://pan.baidu.com/s/1miZgHMo ),
舉個例子說明data.txt中的的每行數(shù)據(jù)是什么意思:
例如,data.xls第一行的數(shù)據(jù)是:
0.175,0.682,0.171,0.535,0.419,0.447
由于Kmeans得到了“癥型對應(yīng)的數(shù)值的聚類中心”,得到的結(jié)果其實就是上文中的表8-9,8-10,8-11,8-12,8-13,8-14,
根據(jù)癥型的數(shù)值查表,得到由于0.175在區(qū)間(0,0.179]中,靠近聚類中心0.179,所以0.175替換為A2,同樣地:
0.682查表8-10,歸類為B1
0.171查表8-11,歸類為C3
0.535查表8-12,歸類為D3
0.419查表8-13,歸類為E1
0.447查表8-14,歸類為F1
以此類推,把6維向量(0.175,0.682,0.171,0.535,0.419,0.447)轉(zhuǎn)化成(A2,B1,C3,D3,E1,F1,H1)
用代碼批量轉(zhuǎn)化即可,轉(zhuǎn)化結(jié)果為data.txt,可從百度網(wǎng)盤下載:
https://pan.baidu.com/s/1miZgHMo
二(對應(yīng)代碼2)、這里使用FP-Growth算法來進行挖掘,找出不同嚴重程度的癥狀和mammary cancer
發(fā)展時期之間的聯(lián)系,也就是說,找出哪些癥狀(例如A3和B5)極有可能導致乳腺癌之間的某個特定的發(fā)展階段(例如H5),例如,腎臟發(fā)炎和肝硬化有較大概率導致乳腺癌(這里只是舉個例子,不一定符合真實情況)挖掘結(jié)束。
代碼2:
#-*- encoding:utf-8 -*- import sys reload(sys) import pyfpgrowth sys.setdefaultencoding('utf-8')path='./data.txt' def read_data(path):data_lists=[]f = open(path) # 返回一個文件對象 line = f.readline() # 調(diào)用文件的 readline()方法for line in open(path):# print type(line) print line # 后面跟 ',' 將忽略換行符 # print(line, end = '') # 在 Python 3中使用 lists_cell=line.replace('\n','').split(",")#去掉回車鍵,以逗號作為分隔符 data_lists.append(lists_cell)line = f.readline() f.close()return data_liststransactions=read_data(path) # print "transactions=",transactions print len(transactions) print type(transactions)patterns = pyfpgrowth.find_frequent_patterns(transactions, 56)#2 這個位置的參數(shù)代表支持度,也就是說出現(xiàn)數(shù)量56次以上 rules = pyfpgrowth.generate_association_rules(patterns, 0.87)#0.7 這個位置的參數(shù)代表置信度print "FPGrowth關(guān)聯(lián)規(guī)則挖掘結(jié)果:" for k,v in rules.items(): print kprint vprint"-"*20代碼運行結(jié)果:
FPGrowth關(guān)聯(lián)規(guī)則挖掘結(jié)果:
('A3', 'F4')
(('H4',), 0.8795180722891566)
--------------------
('C3', 'F4')
(('H4',), 0.875)
--------------------
[Finished in 0.1s]
與書上P192結(jié)果進行比較,可以發(fā)現(xiàn),雖然書上用的是Apriori,此處使用的是FPGrowth,挖掘得到的關(guān)聯(lián)規(guī)則是一致的:
最后解釋下實驗結(jié)果:
順便解釋下基本概念:
下面的support指的是,‘并’的關(guān)系
Support(A=>B)=P(AUB)
置信度指的是:條件概率
Confidence(A=>B)=P(B|A)
那么FpGrowth的挖掘結(jié)果可以解釋為:
當肝氣郁結(jié)癥型系數(shù)位于A3區(qū)間,并且 肝腎陰虛癥型系數(shù)位于F4區(qū)間,在這兩個前提的條件下,處于mammary cancer H4階段的概率為0.8795180722891566
在總樣本中,這種情況發(fā)生的概率是0.078495,代碼中有個數(shù)字是56,設(shè)置辦法是:930*0.078495=56
總結(jié)
以上是生活随笔為你收集整理的基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随机森林针对中文文本分类
- 下一篇: python链式赋值与C++赋值的结果比