聲明:
機器學習系列主要記錄自己學習機器學習算法過程中的一些參考和總結,其中有部分內容是借鑒參考書籍和參考博客的。
目錄:
- 什么是關聯規則
- 關聯規則中的必須知道的概念
- 關聯規則的實現過程
- 關聯規則的核心點——如何生成頻繁項集(Apriori算法)
- 關聯規則的核心點——如何生成頻繁項集(FP-Growth算法)
- 實際使用過程中需要注意的地方
- 關聯規則總結與課后作業
- 參考文獻
一、什么是關聯規則
所謂數據挖掘就是以某種方式分析源數據,從中發現一些潛在的有用的信息,即數據挖掘又可以稱作知識發現。而機器學習算法則是這種“某種方式”,關聯規則作為十大經典機器學習算法之一,因此搞懂關聯規則(雖然目前使用的不多)自然有着很重要的意義。顧名思義,關聯規則就是發現數據背后存在的某種規則或者聯系。
舉個簡單的例子(尿布和啤酒太經典):通過調研超市顧客購買的東西,可以發現30%的顧客會同時購買床單和枕套,而在購買床單的顧客中有80%的人購買了枕套,這就存在一種隱含的關系:床單→枕套,也就是說購買床單的顧客會有很大可能購買枕套,因此商場可以將床單和枕套放在同一個購物區,方便顧客購買。
一般,關聯規則可以應用的場景有:
-
- 優化貨架商品擺放或者優化郵寄商品的目錄
- 交叉銷售或者捆綁銷售
- 搜索詞推薦或者識別異常
二、概念
- 項目:交易數據庫中的一個字段,對超市的交易來說一般是指一次交易中的一個物品,如:牛奶
- 事務:某個客戶在一次交易中,發生的所有項目的集合:如{牛奶,面包,啤酒}
- 項集:包含若干個項目的集合(一次事務中的),一般會大於0個
- 支持度:項集{X,Y}在總項集中出現的概率(見下面的例子)
- 頻繁項集:某個項集的支持度大於設定閾值(人為設定或者根據數據分布和經驗來設定),即稱這個項集為頻繁項集。
- 置信度:在先決條件X發生的條件下,由關聯規則{X->Y }推出Y的概率(見下面的例子)
- 提升度:表示含有X的條件下同時含有Y的概率,與無論含不含X含有Y的概率之比。
支持度和提升度示例:
假如有一條規則:牛肉—>雞肉,那么同時購買牛肉和雞肉的顧客比例是3/7,而購買牛肉的顧客當中也購買了雞肉的顧客比例是3/4。這兩個比例參數是很重要的衡量指標,它們在關聯規則中稱作支持度(support)和置信度(confidence)。對於規則:牛肉—>雞肉,它的支持度為3/7,表示在所有顧客當中有3/7同時購買牛肉和雞肉,其反應了同時購買牛肉和雞肉的顧客在所有顧客當中的覆蓋范圍;它的置信度為3/4,表示在買了牛肉的顧客當中有3/4的人買了雞肉,其反應了可預測的程度,即顧客買了牛肉的話有多大可能性買雞肉。其實可以從統計學和集合的角度去看這個問題, 假如看作是概率問題,則可以把“顧客買了牛肉之后又多大可能性買雞肉”看作是條件概率事件,而從集合的角度去看,可以看下面這幅圖:
上面這副圖可以很好地描述這個問題,S表示所有的顧客,而A表示買了牛肉的顧客,B表示買了雞肉的顧客,C表示既買了牛肉又買了雞肉的顧客。那么C.count/S.count=3/7,C.count/A.count=3/4。
提升度示例:
1000名顧客,購買年貨,A組有500人購買茶葉,有450人購買咖啡;B組有0人購買茶葉,有450人購買咖啡。
購買茶葉 | 購買咖啡 | |
A組(500人) | 500 | 450 |
B組(500人) | 0 | 450 |
茶葉->咖啡的支持度=450/1000=45%
茶葉->咖啡的置信度=450/500=90%
茶葉->咖啡的提升度=90%/90%=1
說明:
(1)由於lift(茶葉X->咖啡Y)=1,所以說明X與Y相互獨立,即是否有X對於Y的出現沒有影響。雖然支持度和置信度都高,但它們之間沒有必然的關聯關系。
(2)滿足最小支持度和最小置信度的關聯關系叫做強關聯關系
-
- 如果lift>1,叫做有效的強關聯關系,
- 如果lift<=1,叫做無效的強關聯關系
- 特別的如果lift(X->Y)=1,則稱X與Y相互獨立
三、實現過程
從以上的分析可以得知,關聯規則是從事務集合中挖掘出這樣的關聯規則{X->Y}:它的支持度和置信度要大於最小閾值(minSup,minConf),當然這個最小閾值是由用戶指定的,可以根據數據分布和經驗;同時他的提升度最好是大於1的(具體值根據實際情況設定,例如:3、5均可),即是有效強關聯規則。
使用關聯規則的過程主要包含以下三個步驟:
(1)數據篩選,首先對數據進行清洗,清洗掉那些公共的項目,比如:熱門詞,通用詞(此步依據具體項目而定)
(2)根據支持度(support),從事務集合中找出頻繁項集(使用算法:Apriori算法,FP-Growth算法)
(3)根據置信度(confidence),從頻繁項集中找出強關聯規則(置信度閾值需要根據實驗或者經驗而定)
(4)根據提升度(lift),從強關聯規則中篩選出有效的強關聯規則(提升度的設定需要經過多次試驗確定)
四、如何生成頻繁項集-Apriori算法[1]
關聯規則中,比較關鍵的兩個點是:(1)三種閾值的設定(2)如何找出頻繁項集。
本節主要討論如何解決尋找頻繁項集的問題,目前主要有兩種算法:(1)Apriori算法(2)FP-Growth算法,下面分別介紹一下這兩種算法。
(1)算法原理
它主要利用了向下封閉屬性:如果一個項集是頻繁項目集,那么它的非空子集必定是頻繁項目集。它先生成1-頻繁項目集,再利用1-頻繁項目集生成2-頻繁項目集。。。然后根據2-頻繁項目集生成3-頻繁項目集。。。依次類推,直至生成所有的頻繁項目集,然后從頻繁項目集中找出符合條件的關聯規則。
(2)生成頻繁項集過程
它的原理是根據k-頻繁項目集生成(k+1)-頻繁項目集。因此首先要做的是找出1-頻繁項目集,這個很容易得到,只要循環掃描一次事務集合統計出項目集合中每個元素的支持度,然后根據設定的支持度閾值進行篩選,即可得到1-頻繁項目集。下面證明一下為何可以通過k-頻繁項目集生成(k+1)-頻繁項目集:(下面證明如何從K-頻繁項集生成k+1頻繁項集)
假設某個項目集S={s1,s2...,sn}是頻繁項目集,那么它的(n-1)非空子集{s1,s2,...sn-1},{s1,s2,...sn-2,sn}...{s2,s3,...sn}必定都是頻繁項目集,通過觀察,任何一個含有n個元素的集合A={a1,a2,...an},它的(n-1)非空子集必行包含兩項{a1,a2,...an-2,an-1}和 {a1,a2,...an-2,an},對比這兩個子集可以發現,它們的前(n-2)項是相同的,它們的並集就是集合A。對於2-頻繁項目集,它的所有1非空子集也必定是頻繁項目集,那么根據上面的性質,對於2-頻繁項目集中的任一個,在1-頻繁項目集中必定存在2個集合的並集與它相同。因此在所有的1-頻繁項目集中找出只有最后一項不同的集合,將其合並,即可得到所有的包含2個元素的項目集,得到的這些包含2個元素的項目集不一定都是頻繁項目集,所以需要進行剪枝。剪枝的辦法是看它的所有1非空子集是否在1-頻繁項目集中,如果存在1非空子集不在1-頻繁項目集中,則將該2項目集剔除。經過該步驟之后,剩下的則全是頻繁項目集,即2-頻繁項目集。依次類推,可以生成3-頻繁項目集。。直至生成所有的頻繁項目集。
(3)生成強關聯規則
得到頻繁項目集之后,則需要從頻繁項目集中找出符合條件的關聯規則。最簡單的辦法是:遍歷所有的頻繁項目集,然后從每個項目集中依次取1、2、...k個元素作為后件,該項目集中的其他元素作為前件,計算該規則的置信度進行篩選即可。這樣的窮舉效率顯然很低。假如對於一個頻繁項目集f,可以生成下面這樣的關聯規則:(f-β)—>β,那么這條規則的置信度=f.count/(f-β).count
(下面證明如何生成強關聯規則,即先生成小后件的,再根據小后件依次生成大后件,因為假設該規則是強關聯規則,則(f-βsub)—>βsub也是強關聯規則)
根據這個置信度計算公式可知,對於一個頻繁項目集f.count是不變的,而假設該規則是強關聯規則,則(f-βsub)—>βsub也是強關聯規則,其中βsub是β的子集,因為(f-βsub).count肯定小於(f-β).count。即給定一個頻繁項目集f,如果一條強關聯規則的后件為β,那么以β的非空子集為后件的關聯規則都是強關聯規則。所以可以先生成所有的1-后件(后件只有一項)強關聯規則,然后再生成2-后件強關聯規則,依次類推,直至生成所有的強關聯規則。
(4)舉例說明
下面舉例說明Apiori算法的具體流程:
假如有項目集合I={1,2,3,4,5},有事務集T:
1,2,3 1,2,4 1,3,4 1,2,3,5 1,3,5 2,4,5 1,2,3,4
設定minsup=3/7,misconf=5/7。
首先:生成頻繁項目集:
1-頻繁項目集:{1},{2},{3},{4},{5}
2-頻繁項目集:
根據1-頻繁項目集生成所有的包含2個元素的項目集:任意取兩個只有最后一個元素不同的1-頻繁項目集,求其並集,由於每個1-頻繁項目集元素只有一個,所以生成的項目集如下:
{1,2},{1,3},{1,4},{1,5}
{2,3},{2,4},{2,5}
{3,4},{3,5}
{4,5}
計算它們的支持度,發現只有{1,2},{1,3},{1,4},{2,3},{2,4},{2,5}的支持度滿足要求,因此求得2-頻繁項目集:
{1,2},{1,3},{1,4},{2,3},{2,4}
3-頻繁項目集:
因為{1,2},{1,3},{1,4}除了最后一個元素以外都相同,所以求{1,2},{1,3}的並集得到{1,2,3}, {1,2}和{1,4}的並集得到{1,2,4},{1,3}和{1,4}的並集得到{1,3,4}。但是由於{1,3,4}的子集{3,4}不在2-頻繁項目集中,所以需要把{1,3,4}剔除掉。然后再來計算{1,2,3}和{1,2,4}的支持度,發現{1,2,3}的支持度為3/7 ,{1,2,4}的支持度為2/7,所以需要把{1,2,4}剔除。同理可以對{2,3},{2,4}求並集得到{2,3,4} ,但是{2,3,4}的支持度不滿足要求,所以需要剔除掉。
因此得到3-頻繁項目集:{1,2,3}。
到此頻繁項目集生成過程結束。注意生成頻繁項目集的時候,頻繁項目集中的元素個數最大值為事務集中事務中含有的最大元素個數,即若事務集中事務包含的最大元素個數為k,那么最多能生成k-頻繁項目集,這個原因很簡單,因為事務集合中的所有事務都不包含(k+1)個元素,所以不可能存在(k+1)-頻繁項目集。在生成過程中,若得到的頻繁項目集個數小於2,生成過程也可以結束了。
現在需要生成強關聯規則:
這里只說明3-頻繁項目集生成關聯規則的過程:對於集合{1,2,3}
1-后件的關聯規則:
(1,2)—>3, 置信度=3/4
(1,3)—>2, 置信度=3/5(置信度不滿足要求,所以剔除掉)
(2,3)—>1 置信度=3/3
因此得到1后件的集合{1},{3}
2-后件的關聯規則(根據1-后件集合)
2—>1,3 置信度=3/5不滿足要求,所以對於3-頻繁項目集生成的強關聯規則為:(1,2)—>3和(2,3)—>1。
至此,Apriori算法完成
(當然實際項目中還需要去驗證生成的強關聯規則是否滿足提升度要求,即是否是有效強關聯規則)。
五、如何生成頻繁項集-FP-Growth算法[4]
Apriori算法是關聯規則的基本算法,很多用於發現關聯規則的算法都是基於Apriori算法,但Apriori算法需要多次訪問數據庫,具有嚴重的性能問題。FP-Growth算法只需要兩次掃描數據庫,相比於Apriori減少了I/O操作,克服了Apriori算法需要多次掃描數據庫的問題。本文采用如下的樣例數據
A;B;E; B;D; B;C; A;B;D A;C; B;C; A;C; A;B;C;E; A;B;C;
(1)FP-Growth生成FP-Tree
FP-Growth算法將數據庫中的頻繁項集壓縮到一顆頻繁模式樹中,同時保持了頻繁項集之間的關聯關系。通過對該頻繁模式樹挖掘,得到頻繁項集。其過程如下:
- 第一次掃描數據庫,產生頻繁1項集,並對產生的頻繁項集按照頻數降序排列,並剪枝支持數低於閥值的元素。處理后得到L集合,
- 第二次掃描數據庫,對數據庫的每個交易事務中的項按照L集合中項出現的順序排序,生成FP-Tree(圖5.1)。
圖5.1 FT-Tree
圖5.2 生成fp-tree的步驟
(2)從FP-Tree挖掘頻繁項集
從FP-Tree重可以挖掘出頻繁項集,其過程如下:
圖5.3 頻繁項集挖掘過程
從頻繁1項集鏈表中按照逆序開始,鏈表可以追溯到每個具有相同項的節點。
- 從鏈表中找到項“E”,追溯出FP-Tree中有兩個帶“E”的節點,由這兩個節點分別向上(parent)追溯,形成兩條模式:<E,C,A,B;1>,<E,A,B;1>.
- 由這兩條模式得到項“E”的條件模式<A,B;2>.
- 根據條件模式,得到項“E”的頻繁項集(不包含頻繁1項集):<E,A;2>,<E,B;2>,<E,A,B;2>
- 然后一次得到項“D”,“C”,“A”。
(3)找出強關聯規則
同第四節
(4)找出有效的強關聯規則
同第四節
至此,FP-Growth算法生成頻繁項集已經結束。
六、注意點
(1)三個閾值點需要經過對此實驗或者經驗才能找到合適的閾值
(2)關聯規則與word2vec在哪些場景有着共性和不同需要驗證(需要研究word2vec實現原理后再下結論)
(3)數據集需要某些處理后,也許效果會有提升(同事的經驗)
七、總結
第一次,“摘抄”整理別人的博客來放在自己的博客,算是一個小小的開始的,其實很多東西只有自己去真正的學習,思考,整理才有收獲。
機器學習算法與模型是一個很有意思的東西,很多東西不去看自己完全想象不到還能這么玩,然而看了就是看了,跟用了還是有很大差別,希望以后能夠在工作中將自己看的一些東西用上去,多整理,這樣效果會比較好。
雖然我是一個從網絡方向轉過來的“出家”人,但是這都不是事。我覺得看的多了,整理的多了,其實學起來還是有套路可以遵循的。
八、參考文獻
[1]http://www.cnblogs.com/dolphin0520/archive/2012/10/29/2733356.html
[2]http://blog.sina.com.cn/s/blog_4d8d6303010009kb.html
[3]http://www.360doc.com/content/15/0611/19/25802092_477451393.shtml
[4]http://westerly-lzh.github.io/cn/2015/08/DM002-FP-Tree/
[5]http://www.bjt.name/2013/09/association-rules
[6]http://blog.csdn.net/rav009/article/details/8985322
[7]http://blog.csdn.net/rav009/article/details/8979249