一、背后的故事
沃爾瑪為了能夠準確了解顧客在其門店的購買習慣,對其顧客的購物行為進行購物籃分析,想知道顧客經常一起購買的商品有哪些。它集中了其各門店的詳細 原始交易數據,利用數據挖掘方法對這些數據進行分析和挖掘,并且有了一個意外的發現:跟尿布一起購買最多的商品竟是啤酒!經過大量實際調查和分析,揭示了 一個隱藏在”尿布與啤酒”背后的美國人的一種行為模式:在美國,一些年輕的父親下班后經常要到超市去買嬰兒尿布,而他們中有30%~40%的人同時也為自 己買一些啤酒。產生這一現象的原因是:美國的太太們常叮囑她們的丈夫下班后為小孩買尿布,而丈夫們在買尿布后又隨手帶回了他們喜歡的啤酒。
二、關聯規則算法簡介
關聯規則,也叫購物籃分析,是為了研究購物籃中商品之間的關系,可產生A->B這樣的蘊涵式(或者說是規則),其中A和B分別稱為關聯規則的 先導和后繼。衡量該規則的強弱,有支持度、置信度和提升度這三種指標,詳見相關概念說明。上訴故事中的規則就是尿布->啤酒。
在商業銷售應用上,可進行交叉銷售(cross sell),正如故事中所訴,在發現了啤酒與尿布的內在聯系后,沃爾瑪將尿布和啤酒擺在一起出售,結果使尿布和啤酒的銷量雙雙增加了。關聯規則亦可應用于 醫療,找出可能的治療組合;在銀行業方面,可對顧客進行分析,可以推薦感興趣的服務等。
三、相關概念說明
這一部分我們將通過一個具體的數據來對算法中涉及的基本概念進行說明。
假設我們有這樣一張交易清單,其中A、B、C為商品代號。
交易號商品清單
0001A B C
0002A B
0003C
0004B C
0005A C
現將其轉換為如下形式的交易二維表,1表示有,0表示無。
交易號ABC
0001111
0002110
0003001
0004011
0005101
項集(Item):同時出現的項的集合,k項集即包含k個元素的項集;在本例中,{A}是1項集,{A C}是2項集;
支持度(Support):定 義為 supp(X) = occur(X) / count(D) = P(X),其中D是交易數據庫,即事件X出現的概率;在本例中,supp(A)=3/5
置信度(Confidence): 定義為 conf(X->Y) = supp(X ∪ Y) / supp(X) = P(Y|X),即在事件X出現的情況下事件Y出現的概率;在本例中,conf(A->B)=2/3
提升度(Lift):lift(X->Y) = lift(Y->X) = conf(X->Y)/supp(Y) = conf(Y->X)/supp(X) = P(XY)/(P(X)P(Y)),即在事件X出現的情況下事情Y出現的概率,相較于整體情況下事件Y出現的概率,提升了多少倍,可通俗理解為提升度反映 了“物品X的出現”對物品Y的出現概率發生了多大的變化;在本例中,lift(A->B)=(2/3)/(3/5)=10/9
候選集(Candidate itemset):通過向下合并得出的項集,定義為C[k];在本例中,1項集{A} 、{B},向下合并,產生項集{A B},此時稱為候選集;
頻繁集(Frequent itemset):支持度大于等于特定的最小支持度(Minimum Support/minsup,自定義)的項集,表示為L[k];在本例中,設最小支持度閾值為0.3,候選集{A B}的支持度為0.4,大于閾值0.3,所以候選集{A B}是頻繁集;
NOTE : 置信度是對關聯規則的準確度的衡量,支持度是對關聯規則重要性的衡量。支持度說明了這條規則在所有交易中有多大的代表性,顯然支持度越大,關聯規則越重 要。有些關聯規則置信度雖然很高,但支持度卻很低,說明該關聯規則實用的機會很小,因此也不重要。若提升度lift(X->Y)=1,根據公式,可 得P(XY)=(P(X)P(Y)),也可以根據conf(X->Y)=supp(Y),即P(Y|X)=P(Y),換句話說X是否出現,對Y出現 的概率沒有影響,即說明X與Y相互獨立;若lift(X->Y)>1,說明X的出現提高了Y的出現概率,有促進作用,該規則有效,若 lift(X->Y)<1,則該規則無效。
四、Apriori算法
關聯規則中常用的算法是Apriori算法,主要分為兩步:
a)根據給定的最小支持度閾值,找出所有滿足條件的項集,即頻繁項集;
b)根據給定的最小置信度閾值,在所有頻繁集中找出符合條件的關聯規則,即強規則;
該算法的關鍵在于第一步。從效率考慮,Apriori算法基于“頻繁項集的非空子集也是頻繁項集”這一重要性質,從頻繁K-1項集中去生成頻繁k項集的候 選集。怎么理解這句話呢?首先,若k項集是頻繁的,根據頻繁項集的定義,該k項集的支持度,也就是出現的概率大于一定的閾值,它的子集出現的概率肯定會大 于等于它出現的概率,也就一定會大于我們指定的閾值;我們也可以換個角度理解這個性質,如果某個k-1項集不是頻繁的,那再加上一項組成k項集,則該k項 集出現的概率肯定會小于等于之前的k-1項集,所以我們可以說“如果某項集的非空子集不是頻繁項集,那么它也一定不是頻繁項集”,這兩個性質互為逆否命 題,是等價的。根據這個逆否命題,我們知道如果k-1項集不是頻繁的,那基于這個非頻繁的k-1項集生成的k項集也一定不是頻繁的,所以我們要基于頻繁的 k-1項集去生成k項集作為頻繁k項集的候選集,然后再進一步判斷該候選集是否是頻繁的。
現在我們進一步將a)步展開,詳細步驟如下:
a1)掃描交易數據庫D,生產候選1項集,計算各個1項集的支持度,基于最小支持度閾值,得到頻繁1項集的集合;
a2)從k=2開始循環,由頻繁k-1項集生成頻繁k項集:
a2.1)連接步:由2個只有一項不同的頻繁k-1項集連接后預先生成候選k項集;
a2.2)剪枝步:舍棄掉子集不是頻繁項集的候選集,即該候選集的某個子集不在頻繁k-1項集中;
a2.3)掃描交易數據庫D,計算候選k項集的支持度,基于最小支持度閾值,得到頻繁k項集;
a3)若當前的頻繁k項集只有一個,則循環結束,否則回到a2)步;
五、Apriori算法的缺點
Apriori算法采用了逐層搜索的迭代的方法,算法簡單明了,沒有復雜的理論推導,也易于實現。但其有一些難以克服的缺點:
對數據庫的掃描次數過多;
Apriori算法會產生大量的中間項集;
采用唯一支持度;