《Python数据分析与挖掘实战》第8章——Apriori关联规则
生活随笔
收集整理的這篇文章主要介紹了
《Python数据分析与挖掘实战》第8章——Apriori关联规则
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文是基于《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》的實(shí)戰(zhàn)部分的第八章的數(shù)據(jù)——《中醫(yī)證型關(guān)聯(lián)規(guī)則挖掘》做的分析。
旨在補(bǔ)充原文中的細(xì)節(jié)代碼,并給出文中涉及到的內(nèi)容的完整代碼。
主要有:1)將原始數(shù)據(jù)按照聚類結(jié)果進(jìn)行標(biāo)記類別
1 背景與目標(biāo)分析
? ? 此項(xiàng)目旨在根據(jù)相關(guān)數(shù)據(jù)建模,獲取中醫(yī)證素與乳腺癌TNM分期之間的關(guān)系。
2 數(shù)據(jù)預(yù)處理
2.1 數(shù)據(jù)變換
2.1.1 數(shù)據(jù)離散化
datafile = 'data.xls' resultfile = 'data_processed.xlsx'typelabel = {u'肝氣郁結(jié)證型系數(shù)':'A',u'熱毒蘊(yùn)結(jié)證型系數(shù)':'B',u'沖任失調(diào)證型系數(shù)':'C',u'氣血兩虛證型系數(shù)':'D',u'脾胃虛弱證型系數(shù)':'E',u'肝腎陰虛證型系數(shù)':'F'}k = 4 #需要進(jìn)行的聚類類別數(shù)#讀取文件進(jìn)行聚類分析 data = pd.read_excel(datafile) keys = list(typelabel.keys()) result = DataFrame()for i in range(len(keys)):#調(diào)用k-means算法 進(jìn)行聚類print(u'正在進(jìn)行%s的聚類' % keys[i])kmodel = KMeans(n_clusters = k, n_jobs = 4) # n_job是線程數(shù),根據(jù)自己電腦本身來調(diào)節(jié)kmodel.fit(data[[keys[i]]].as_matrix())# 訓(xùn)練模型 # kmodel.fit(data[[keys[i]]]) # 不轉(zhuǎn)成矩陣形式結(jié)果一樣 #KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300, # n_clusters=4, n_init=10, n_jobs=4, precompute_distances='auto', # random_state=None, tol=0.0001, verbose=0)r1 = DataFrame(kmodel.cluster_centers_, columns = [typelabel[keys[i]]]) # 聚類中心r2 = Series(kmodel.labels_).value_counts() #分類統(tǒng)計(jì)r2 = DataFrame(r2,columns = [typelabel[keys[i]]+'n'])# 轉(zhuǎn)成DataFrame格式,記錄各個(gè)類別的數(shù)目r = pd.concat([r1,r2], axis=1).sort_values(typelabel[keys[i]])r.index = range(1,5)r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]],2) # rolling_mean用來計(jì)算相鄰兩列的均值,以此作為邊界點(diǎn)r[typelabel[keys[i]]][1] = 0.0 # 將原來的聚類中心改成邊界點(diǎn)result = result.append(r.T) result = result.sort_index() # 以index排序,以ABCDEF排序 result.to_excel(resultfile)print (result)2.1.2?劃分原始數(shù)據(jù)中的類別
# 將分類后數(shù)據(jù)進(jìn)行處理(*****) data_cut = DataFrame(columns = data.columns[:6]) types = ['A','B','C','D','E','F'] num = ['1','2','3','4'] for i in range(len(data_cut.columns)):value = list(data.iloc[:,i])bins = list(result[(2*i):(2*i+1)].values[0])bins.append(1)names = [str(x)+str(y) for x in types for y in num]group_names = names[4*i:4*(i+1)]cats = pd.cut(value,bins,labels=group_names,right=False)data_cut.iloc[:,i] = cats data_cut.to_excel('apriori.xlsx') data_cut.head() # 注意!本文中作者最后建模的時(shí)候并沒有使用這份數(shù)據(jù)進(jìn)行建模,當(dāng)輸入這份數(shù)據(jù)時(shí),結(jié)果為空!3 模型建立
inputfile ='apriori.txt' #輸入事務(wù)集文件 # '''apriori.txt中文件格式如下 # A1,B2,C1,D3,E2,F1,H2 # A2,B2,C1,D2,E2,F1,H3 # A3,B4,C2,D3,E4,F1,H4 # A3,B1,C2,D1,E1,F1,H1 # ''' data2 = pd.read_csv(inputfile, header=None, dtype=object)# 此文件是作者建模時(shí)的數(shù)據(jù),運(yùn)行后正常。 # data2 = pd.read_excel('apriori.xlsx', header=0) # !!!此文件是在預(yù)處理時(shí)進(jìn)行離散化后得到的,輸出結(jié)果有誤!為空!start = time.clock() # 計(jì)時(shí)開始 print(u'\n轉(zhuǎn)換原始數(shù)據(jù)至0-1矩陣')ct = lambda x: Series(1, index = x[pd.notnull(x)]) # 將標(biāo)簽數(shù)據(jù)轉(zhuǎn)換成1,是轉(zhuǎn)換0-1矩陣的過渡函數(shù) b = map(ct, data2.as_matrix())# 用map方式執(zhí)行 data3 = DataFrame(b).fillna(0) end = time.clock() #計(jì)時(shí)開始print (u'轉(zhuǎn)換完畢,用時(shí)%s秒' % (end-start)) del b #刪除中間變量b 節(jié)省內(nèi)存support = 0.06 #最小支持度 confidence = 0.75 #最小置信度 ms = '---'# 用來區(qū)分不同元素,需要保證原始表格中無該字符start = time.clock() #計(jì)時(shí)開始 print(u'\n開始搜索關(guān)聯(lián)規(guī)則...') find_rule(data3, support, confidence, ms) end = time.clock() print (u'\n搜索完成,用時(shí):%.2f秒' % (end-start))模型改進(jìn):
由于書中作者給出的代碼并沒有運(yùn)用到剪枝策略,因此采用了這篇文章的代碼,將該代碼中l(wèi)oad_data_set()函數(shù)中的內(nèi)容改成如圖:
其運(yùn)行的結(jié)果如下:
備注:本章節(jié)完整代碼詳見點(diǎn)擊打開鏈接
總結(jié)
以上是生活随笔為你收集整理的《Python数据分析与挖掘实战》第8章——Apriori关联规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么用clementine做关联规则分析
- 下一篇: 计算机模拟comsol,基于COMSOL