Python數(shù)據(jù)挖掘017-中醫(yī)證型關聯(lián)規(guī)則

項目目標:根據(jù)乳腺癌患者的病理信息,挖掘患者的癥狀與中醫(yī)證型之間的關聯(lián)關系,特別是各中醫(yī)證素與乳腺癌TNM分期之間的關系。

原始數(shù)據(jù)是根據(jù)問卷調查得到,基本挖掘流程為:

image.png

1. 數(shù)據(jù)預處理

屬性歸約:收集到的數(shù)據(jù)集案由73個屬性,但為了更有效的挖掘,此處僅僅選擇6種證型得分,TNM分期的屬性值構成數(shù)據(jù)集。如下:


image.png

1.1 數(shù)據(jù)變換

主要采用屬性構造和數(shù)據(jù)離散化兩種方法來處理。首先通過屬性構造,獲得證型系數(shù),然后通過聚類算法對數(shù)據(jù)進行離散化處理,形成建模數(shù)據(jù)。

本案例提供的數(shù)據(jù)集是已經(jīng)經(jīng)過屬性構造得到了證型系數(shù),故而只需要離散化處理即可。

由于Apriori關聯(lián)規(guī)則算法無法處理連續(xù)型數(shù)值變量,為了將原始數(shù)據(jù)格式轉換為適合建模的格式,需要對數(shù)據(jù)進行離散化處理。此處采用聚類算法對各證型系數(shù)進行離散化處理,將每個屬性聚成4類。
比如:


image.png
from sklearn.cluster import KMeans #導入K均值聚類算法
k=4
result = pd.DataFrame()
for col in list('ABCDEF'):
    print('正在進行{}列的聚類'.format(col))
    kmodel=KMeans(n_clusters = k, n_jobs = 4) 
    kmodel.fit(data[col].values.reshape(-1,1)) #訓練模型
    r1=pd.DataFrame(kmodel.cluster_centers_,columns=[col]) # 聚類中心
    r2=pd.Series(kmodel.labels_).value_counts() # 分類統(tǒng)計
    r2=pd.DataFrame(r2,columns=[col+'n']) # 記錄各個類別的數(shù)目
    r=pd.concat([r1,r2],axis=1).sort_values(col)
    # 匹配聚類中心和類別數(shù)目
    r.index=[1,2,3,4]
    r[col]=r[col].rolling(2).mean()
    #rolling mean()用來計算相鄰2列的均值,以此作為邊界點。
    r[col][1]=0.0
    # 這兩句代碼將原來的聚類中心改為邊界點。
    result=result.append(r.T)

得到的result結果為:


image.png
for col in 'ABCDEF':
    bins=np.append(result.loc[col,:].values,1000)
    data[col+'_cls']=pd.cut(data[col],bins=bins,labels=[col+str(i) for i in range(k)],include_lowest=True)
image.png

2. 關聯(lián)規(guī)則挖掘

image.png

關聯(lián)規(guī)則挖掘的一個難點是設置合理的最小支持度,最小置信度,目前并沒有統(tǒng)一的標準,大部分都是根據(jù)業(yè)務經(jīng)驗設置初始值,經(jīng)過多次調整,獲取與業(yè)務相符的關聯(lián)規(guī)則結果。

此處根據(jù)多次調整,結果實際業(yè)務分析,選取的輸入?yún)?shù)為:最小支持度6%,最小置信度75%。

首先要對上面的數(shù)據(jù)進行one-hot編碼,可以用pd.get_dummies來完成

data2=pd.get_dummies(data)
print(data2.shape)
print(data2.head(10))
image.png

然后使用關聯(lián)規(guī)則挖掘,代碼為:

#自定義連接函數(shù),用于實現(xiàn)L_{k-1}到C_k的連接
def connect_string(x, ms):
    x = list(map(lambda i:sorted(i.split(ms)), x))
    l = len(x[0])
    r = []
    for i in range(len(x)):
        for j in range(i,len(x)):
            if x[i][:l-1] == x[j][:l-1] and x[i][l-1] != x[j][l-1]:
                r.append(x[i][:l-1]+sorted([x[j][l-1],x[i][l-1]]))
    return r

#尋找關聯(lián)規(guī)則的函數(shù)
def find_rule(d, support, confidence, ms = u'--'):
    result = pd.DataFrame(index=['support', 'confidence']) #定義輸出結果
  
    support_series = 1.0*d.sum()/len(d) #支持度序列
    column = list(support_series[support_series > support].index) #初步根據(jù)支持度篩選
    k = 0
  
    while len(column) > 1:
        k = k+1
        print(u'\n正在進行第%s次搜索...' %k)
        column = connect_string(column, ms)
        print(u'數(shù)目:%s...' %len(column))
        sf = lambda i: d[i].prod(axis=1, numeric_only = True) #新一批支持度的計算函數(shù)

        #創(chuàng)建連接數(shù)據(jù),這一步耗時、耗內存最嚴重。當數(shù)據(jù)集較大時,可以考慮并行運算優(yōu)化。
        d_2 = pd.DataFrame(list(map(sf,column)), index = [ms.join(i) for i in column]).T

        support_series_2 = 1.0*d_2[[ms.join(i) for i in column]].sum()/len(d) #計算連接后的支持度
        column = list(support_series_2[support_series_2 > support].index) #新一輪支持度篩選
        support_series = support_series.append(support_series_2)
        column2 = []

        for i in column: #遍歷可能的推理,如{A,B,C}究竟是A+B-->C還是B+C-->A還是C+A-->B?
            i = i.split(ms)
            for j in range(len(i)):
                column2.append(i[:j]+i[j+1:]+i[j:j+1])

        cofidence_series = pd.Series(index=[ms.join(i) for i in column2]) #定義置信度序列

        for i in column2: #計算置信度序列
            cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))]/support_series[ms.join(i[:len(i)-1])]

        for i in cofidence_series[cofidence_series > confidence].index: #置信度篩選
            result[i] = 0.0
            result[i]['confidence'] = cofidence_series[i]
            result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]

    result = result.T.sort_values(['confidence','support'], ascending = False) #結果整理,輸出
    print(u'\n結果為:')
    print(result)

    return result
support = 0.06 #最小支持度
confidence = 0.75 #最小置信度
ms = '---' #連接符,默認'--',用來區(qū)分不同元素,如A--B。需要保證原始表格中不含有該字符
find_rule(data2, support, confidence, ms)
image.png

上面的關聯(lián)規(guī)則表示的含義是:A2和F3可以推導出H4證型。且C2和F3也可以推導出H4證型。

需要注意的是:并非所有關聯(lián)規(guī)則都有意義,所以需要根據(jù)實際情況來篩選最終的規(guī)則。

參考資料:

《Python數(shù)據(jù)分析和挖掘實戰(zhàn)》張良均等

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • 單選題 1. 某超市研究銷售紀錄數(shù)據(jù)后發(fā)現(xiàn),買啤酒的人很大概率也會購買尿布,這種屬于數(shù)據(jù)挖掘的哪類問題?(A) A...
    山的那邊是什么_閱讀 33,597評論 2 59
  • 第三章 數(shù)據(jù)庫系統(tǒng) 3.1 數(shù)據(jù)庫管理系統(tǒng)的類型 通常有多個分類標準。如按數(shù)據(jù)模型分類、按用戶數(shù)分類、按數(shù)據(jù)庫分布...
    步積閱讀 2,737評論 0 7
  • 如今,共享經(jīng)濟盛行,從車子到房子,共享經(jīng)濟的浪潮正撲面而來,就像1999年的電子商務一樣。而共享經(jīng)濟是什么呢?湯姆...
    眾步閱讀 213評論 0 0
  • 日本游記——美食篇 他們告訴我說去到日本你不去嘗嘗那里地道的拉面,壽司,牛肉,三文魚,酒屋還有螃蟹就別說你有去日本...
    安利女神諶寶連閱讀 271評論 0 2
  • 很偶然的機會,在網(wǎng)上看到了長投網(wǎng)的“21天理財小白訓練營”的一個廣告。仔細看看課程設置,有關于常見投資品的介紹,有...
    Adamguang閱讀 197評論 1 0