天天看點

關聯分析:Apriori算法

作者:一清的讀書圈

本小節要介紹一個常用于挖掘不同資料之間關聯關系的經典算法——Apriori算法,并利用該算法進行病症關聯規則分析。

1 關聯分析的基本概念和Apriori算法

關聯分析是資料挖掘中一種簡單而實用的技術,它通過深入分析資料集,尋找事物間的關聯性,挖掘頻繁出現的組合,并描述組合内對象同時出現的模式和規律。例如,對超市購物的資料進行關聯分析,通過發現顧客所購買的不同商品之間的關系,分析顧客的購買習慣,設計商品的組合擺放位置,制定相應的營銷政策,進而制造需求,提高銷售額,創造額外收入。和上一章介紹的協同過濾算法一樣,關聯分析技術也可以應用于智能推薦系統,當我們挖掘出頻繁出現的組合和強關聯規則之後,就可以通過強關聯規則為顧客推薦商品。該技術不僅在商品推薦領域應用廣泛,在醫療、保險、電信和證券等領域也同樣大有可為。

1.1 關聯分析的基本概念

我們先通過一組簡單的交易資料示範關聯分析的基本概念。下表為一組購物籃資料,其中第1列為使用者資訊,第2列為使用者所購買的商品資訊,我們的目的就是通過該表來挖掘不同商品間的關聯關系。

關聯分析:Apriori算法

在開始分析前,先來了解關聯分析的一些基本概念,包括事務庫、事務、項和項集。

·事務庫:上表中的購物籃資料就是一個事務庫,該事務庫記錄的是使用者行為的資料。

·事務:事務庫中的每一條記錄稱為一筆事務。在上表的購物籃事務庫中,一筆事務就是一次購物行為。例如,第1行資料“使用者1購買商品A,B,C”即為一筆事務。

·項和項集:在購物籃事務庫中,每樣商品為一個項,項的集合稱為項集。例如, “A,B” “A,C” “B,C” “A,B,C”都是項集,即不同商品的組合。

了解了上述基本概念後,下面來學習關聯分析中的核心概念,包括關聯規則、支援度、頻繁項集、置信度和強關聯規則,之後的所有分析都是基于這些概念展開的。

·關聯規則:關聯規則是形如A→B的表達式,A稱為前件,B稱為後件,即一個使用者如果購買了商品A,則也會購買商品B。這裡的A和B不是指單一的商品,而是指項集,例如,{A,B} →{C}的含義就是一個使用者如果購買了商品A和商品B,則也會購買商品C。

·支援度(support):項集的支援度定義為包含該項集的事務在所有事務中所占的比例。例如,項集{A,B}在購物籃事務庫中共出現3次(第1、2、4條資料),而整個事務庫一共有5筆事務(即5條資料),是以它的支援度為3÷5=60%。

·頻繁項集:支援度大于等于人為設定的門檻值(該門檻值稱為最小支援度)的項集為頻繁項集。例如,假設将最小支援度設為50%,因為上面得到項集{A,B}的支援度為60%,是以它是頻繁項集,也就是說,該項集在所有事務中出現得較為頻繁。

·置信度(confidence):置信度的含義是項集Y在包含項集X的事務中出現的頻繁程度。在購物籃事務庫中,關聯規則X→Y的置信度為在購買項集X的基礎上購買項集Y的機率P(Y|X),計算公式如下。

關聯分析:Apriori算法

以上述的購物籃事務庫為例,關聯規則{A,B} →{C}的置信度計算公式如下。

關聯分析:Apriori算法

項集{A,B,C}在所有5筆事務中共出現2次(第1、4筆事務),是以P({A,B,C} )=2/5;項集{A,B}在所有5筆事務中共出現3次(第1、2、4筆事務),是以P({A,B} )=3/5。代入上述公式可得:

關聯分析:Apriori算法

其實熟悉公式後會發現,因為分母都是一樣的,是以可以直接用2/3獲得0.67這個結果。這個結果說明購買了商品A和商品B的人中有67%的人也購買了商品C,該機率還是較高的,是以,商場可以向購買了商品A和商品B的人推薦商品C,如可以将這3種商品放得較近。

·強關聯規則:在實際應用中,通常是先尋找滿足最小支援度的頻繁項集,然後在頻繁項集中尋找滿足最小置信度的關聯規則,這樣的關聯規則稱為強關聯規則,即我們需要的關聯規則,具體的計算步驟将在下一小節進行詳細講解。

1.2 Apriori算法的數學示範

本小節将講解經典的關聯規則挖掘算法——Apriori算法的基本思路,并針對購物籃事務庫進行具體演算。

1.基本思路

關聯分析的最終目标是要找出強關聯規則,以針對目标客戶推薦商品。Apriori算法是最著名的關聯規則的挖掘算法之一,其核心是一種遞推算法。Apriori算法的步驟如下。

步驟1:設定最小支援度和最小置信度;

步驟2:根據最小支援度找出所有的頻繁項集;

步驟3:根據最小置信度發現強關聯規則。

2.案例示範

下面使用上一小節中的購物籃事務庫示範Apriori算法的計算步驟。為友善大家閱讀,将資料重複羅列一次,見下表。

關聯分析:Apriori算法

步驟1:設定最小支援度和最小置信度

首先設定最小支援度為2/5,即40%;最小置信度為4/5,即80%。

步驟2:根據最小支援度找出所有的頻繁項集

這一步驟是關聯分析中較為重要的一個環節,我們需要找到所有的頻繁項集,因為強關聯規則都是從頻繁項集中産生的。

舉例來說,項集{A,B,C,D}隻出現了1次,支援度為1/5,小于最小支援度2/5,該項集就不是頻繁項集,這就意味着很難從該項集中挖掘出類似{A,B,C} →{D}的強關聯規則,即類似“購買了商品A、B、C的使用者也會購買商品D”這樣的規則。而項集{B,C}出現了4次,支援度為4/5,大于最小支援度2/5,該項集就屬于頻繁項集,即商品B和商品C經常同時出現,是以很有可能挖掘出{B}→{C}這樣的強關聯規則(當然還需要經過步驟3的最小置信度檢驗),即購買了商品B的使用者也會購買商品C,這樣就可以向購買了商品B的使用者推薦商品C。

那麼該如何快速找到所有的頻繁項集呢?最簡單的方法就是列出所有項集,然後計算它們的支援度,如果大于等于最小支援度則認定為頻繁項集。但是列出所有項集意味着要列出所有的排列組合,如果資料量較大,則會造成巨大的計算量。

Apriori算法采用了一個精巧的思路來加快運算速度:先計算長度為1的項集,然後挖掘其中的頻繁項集;再将長度為1的頻繁項集進行排列組合,從中挖掘長度為2的頻繁項集,依此類推。其核心邏輯是一個疊代判斷的思想:如果連長度為n-1的項集都不是頻繁項集,那麼就不用考慮長度為n的項集了,也就是說,如果在疊代的過程中發現{A,B,C}不是頻繁項集,那麼{A,B,C,D}必然不是頻繁項集,也就不用去考慮它了。

下面講解具體的數學演算過程。首先計算長度為1的候選項集,掃描購物籃事務庫,統計每種商品出現的次數,結果見下表。

關聯分析:Apriori算法

因為每種商品的支援度均大于等于最小支援度2/5,是以無須删減,直接保留候選項集作為長度為1的頻繁項集。

将長度為1的頻繁項集進行兩兩組合,形成長度為2的候選項集,掃描購物籃事務庫,統計各個候選項集出現的次數,結果見下表。

關聯分析:Apriori算法

因為項集{A,D}的支援度為1/5,小于最小支援度,是以從候選項集中删減掉該項集,得到長度為2的所有頻繁項集,結果見下表。

關聯分析:Apriori算法

将長度為2的頻繁項集進行兩兩組合,形成長度為3的候選項集,掃描購物籃事務庫,統計各個候選項集出現的次數,結果見下表。

關聯分析:Apriori算法

因為項集{A,B,D}和項集{A,C,D}的支援度為1/5,小于最小支援度,是以從候選項集中删減掉這2個項集,得到長度為3的所有頻繁項集,結果見下表。

關聯分析:Apriori算法

将長度為3的頻繁項集進行兩兩組合,形成長度為4的候選項集,掃描購物籃事務庫,統計候選項集出現的次數,結果見下表。

關聯分析:Apriori算法

因為項集{A,B,C,D}的支援度為1/5,小于最小支援度,是以從候選項集中删減掉這個項集,此時長度為4的頻繁項集集合為空,至此便生成了所有的頻繁項集。

因為關聯規則要在至少2個資料之間才可能存在,是以我們需要選擇長度大于1的頻繁項集,見下表。

關聯分析:Apriori算法

步驟3:根據最小置信度發現強關聯規則

找到所有長度大于1的頻繁項集後,強關聯規則就很有可能就從這些頻繁項集中産生,此時最後一個步驟就是從各個頻繁項集中推導出所有可能的關聯規則,再利用最小置信度來檢驗這些關聯規則是否為強關聯規則。

舉例來說,頻繁項集{A,B,C}的非空子集有{A}、{B}、{C}、{A,B} 、{A,C} 、{B,C} ,由此可以推導出6條關聯規則。根據1.1小節講解的公式對這些關聯規則分别計算置信度并與最小置信度進行比較,見下表。

關聯分析:Apriori算法

注意置信度計算中分子都為2,是項集{A,B,C}在所有事務中出現的次數,分母則是非空子集在所有事務中出現的次數,如規則1中的分母3,即{A,B}在所有事務中出現的次數。

從上表可知,隻有規則2滿足最小置信度要求,是以得到一條強關聯規則{A,C} →{B}。對每個長度大于1的頻繁項集進行類似操作,可推導出所有強關聯規則,見下表。

關聯分析:Apriori算法

至此,我們便得到了9條強關聯規則。以第1條強關聯規則{A,C} →{B}為例,我們便可以向購買了商品A和商品C的使用者推薦商品B,其餘依此類推。

1.3 Apriori算法的代碼實作

上一小節通過數學推導獲得了所有的強關聯規則,在Python中則可以利用apyori庫和mlxtend庫快速推導強關聯規則。apyori庫是一個經典的庫,它使用起來較為簡單,不過有時會漏掉一些強關聯規則;mlxtend庫的使用稍顯麻煩,但是它能捕捉到所有的強關聯規則。

1.通過apyori庫實作Apriori算法

先來安裝apyori庫。在Windows指令行視窗中輸入并執行“pip install apyori”指令,或者在Jupyter Notebook中輸入并運作“!pip install apyori”代碼,即可開始安裝。

安裝完apyori庫後,先來建立1.1小節中的購物籃事務庫,代碼如下,每個子清單的内容就是一條購物記錄。

關聯分析:Apriori算法

有了資料之後就可以調用apyori庫中的apriori()函數來進行關聯關系分析了,代碼如下。

關聯分析:Apriori算法

第1行代碼引入apyori庫中的apriori ()函數;第2行代碼用apriori ()函數進行關聯分析,其中min_support參數為最小支援度,這裡設定為0.4,即之前設定的40%,min_confidence參數為最小置信度,這裡設定為0.8,即之前設定的80%,将擷取到的關聯規則賦給變量rules;第3行代碼用list ()函數将獲得的關聯規則rules轉為清單,友善之後調用。

此時的results如下圖所示,其中每一個元素就是分析各個頻繁項集的支援度和置信度。

關聯分析:Apriori算法

通過如下代碼提取results中的關聯規則,并通過字元串拼接來更好地呈現關聯規則。

最終擷取的結果如下所示。可以看到,apyori庫擷取到了15.1.2小節中數學推導得到的大部分強關聯規則,不過卻漏掉了{D}→{B,C}這條強關聯規則。盡管如此,apyori庫由于使用方法簡單,在實戰中還是有不少的應用空間。

關聯分析:Apriori算法

2.通過mlxtend庫實作Apriori算法

先來安裝mlxtend庫。在Windows指令行視窗中輸入并執行“pip install mlxtend”指令,或者在Jupyter Notebook中輸入并運作“!pip install mlxtend”代碼,即可開始安裝。mlxtend庫的檔案較大,初次安裝時可能會失敗,可以多嘗試幾次,或者從國内的鏡像伺服器安裝,例如,從清華大學的鏡像伺服器安裝mlxtend庫的指令為“pip install mlxtend-ihttps://pypi.tuna.tsinghua.edu.cn/simple”。

使用mlxtend庫中的函數,我們可以快速、完整地挖掘出資料中的強關聯規則。同樣先構造之前的購物籃事務庫,代碼如下。

關聯分析:Apriori算法

因為mlxtend庫中的apriori()函數可接受的資料類型為由布爾值(又稱bool型資料,内容為True或Flase)或0/1值構成的DataFrame,是以需要先使用mlxtend庫中的TransactionEncoder ()函數對資料進行預處理,代碼如下。

關聯分析:Apriori算法

第1行代碼從mlxtend庫的preprocessing子產品中引入TransactionEncoder ()函數;第2行代碼将TransactionEncoder ()函數賦給變量TE;第3行代碼用fit_transform ()函數将原始資料轉換為布爾值。

利用pandas庫将轉換後的布爾值以DataFrame格式存儲,代碼如下。

關聯分析:Apriori算法

此時df的内容見下表,其中True表示購買過該商品,False表示未購買過該商品。

關聯分析:Apriori算法

将資料處理為mlxtend庫可接受的特定格式後,我們從mlxtend庫的frequent_patterns子產品中引入apriori ()函數來挖掘購物籃事務庫中的頻繁項集,代碼如下。

關聯分析:Apriori算法

第1行代碼從mlxtend庫的frequent_patterns子產品中引入apriori ()函數;第2行代碼将處理好的資料傳入apriori ()函數,設定min_support參數為0.4,代表最小支援度為0.4,設定use_colnames參數為True,代表使用變量df的列名作為傳回的頻繁項集中項的名稱,最後将挖掘出的頻繁項集賦給變量items,此時items為所有符合最小支援度要求的頻繁項集,其内容見下表。

關聯分析:Apriori算法

通過如下代碼可以檢視長度大于等于2的頻繁項集,其中主要利用的是pandas庫中的apply ()函數,其作用于itemsets列上并擷取該列每一個項集的長度,即元素個數,然後判斷該長度是否大于等于2并進行篩選。

關聯分析:Apriori算法

選擇變量items中長度大于等于2的頻繁項集進行展示,結果見下表。

關聯分析:Apriori算法

根據最小置信度在頻繁項集中挖掘強關聯規則,代碼如下。

關聯分析:Apriori算法

第1行代碼從mlxtend庫的frequent_patterns子產品中引入association_rules ()函數;第2行代碼将得到的頻繁項集資料傳入association_rules ()函數,設定min_threshold參數為0.8,代表将最小置信度設定為0.8,最後将挖掘出的強關聯規則賦給變量rules,其結果如下圖所示。

關聯分析:Apriori算法

以第1條關聯規則{A}→{B}為例講解各列的含義。antecedents列代表關聯規則中的前件,如關聯規則{A}→{B}中的{A};consequents列代表關聯規則中的後件,如關聯規則{A}→{B}中的{B};antecedent support列代表前件的支援度,例如,A共出現3次(共5筆事務),是以關聯前件支援度為3/5=0.6;consequent support列代表後件的支援度,例如,B共出現5次,是以關聯後件支援度為5/5=1;support列代表該關聯規則的支援度,例如,{A,B}共出現3次,是以關聯規則的支援度為3/5=0.6;confidence列代表該關聯規則的置信度,除了用15.1.1小節中的公式計算外,還可以用“關聯規則支援度/前件支援度”來計算,如下所示,代入數值為(3/5)÷(3/5)=1。

關聯分析:Apriori算法

補充知識點:lift(提升度)、leverage(杠杆率)、conviction(确信度)

輸出結果中的lift、leverage、conviction這3列都是用來衡量關聯度強弱的。

lift列代表該關聯規則的提升度,其計算公式為“關聯規則支援度/(前件支援度×後件支援度)” ,如下所示,代入數值為0.6÷(0.6×1)=1。該值越大,表明X和Y的關聯度越強。

關聯分析:Apriori算法

leverage列代表關聯規則的杠杆率,其計算公式為“關聯規則支援度-前件支援度×後件支援度”,如下所示,代入數值為0.6-0.6×1=0。該值越大,表明X和Y的關聯度越強。

關聯分析:Apriori算法

conviction列代表關聯規則的确信度,其計算公式為“(1-後件支援度)/(1-關聯規則置信度)” ,如下所示,代入數值為(1-1)/(1-1)=∞。該值越大,表明X和Y的關聯度越強。

關聯分析:Apriori算法

通過如下代碼提取results中的關聯規則,并通過字元串拼接來更好地呈現關聯規則。

關聯分析:Apriori算法

第1行代碼通過for循環周遊DataFrame的每一行,并提取所需資訊,其中i表示每一行的序号,j表示每一行的内容,是以,j['列名']表示該行對應列名的内容。第4行和第5行代碼從存儲前後件的集合中逐一提取前後件,并以','作為分隔符連接配接前後件中的各個元素。運作結果如下。

關聯分析:Apriori算法

這與1.2小節通過數學推導得到的結果是完全一緻的,9條強關聯規則都捕捉到了。

總體來說,通過apyori庫和mlxtend庫都能友善地進行關聯規則分析,在實際應用中,兩者的差别并不大。如果追求簡便性,推薦使用apyori庫;如果想獲得更嚴謹的結果,則推薦使用mlxtend庫。

繼續閱讀