機器學習筆記——關聯規則

聲明:html

  機器學習系列主要記錄本身學習機器學習算法過程當中的一些參考和總結,其中有部份內容是借鑑參考書籍和參考博客的。git

目錄:github

  1. 什麼是關聯規則
  2. 關聯規則中的必須知道的概念
  3. 關聯規則的實現過程
  4. 關聯規則的核心點——如何生成頻繁項集(Apriori算法)
  5. 關聯規則的核心點——如何生成頻繁項集(FP-Growth算法)
  6. 實際使用過程當中須要注意的地方
  7. 關聯規則總結與課後做業
  8. 參考文獻

1、什麼是關聯規則算法

  所謂數據挖掘就是以某種方式分析源數據,從中發現一些潛在的有用的信息,即數據挖掘又能夠稱做知識發現。而機器學習算法則是這種「某種方式」,關聯規則做爲十大經典機器學習算法之一,所以搞懂關聯規則(雖然目前使用的很少)天然有着很重要的意義。顧名思義,關聯規則就是發現數據背後存在的某種規則或者聯繫。數據庫

  舉個簡單的例子(尿布和啤酒太經典):經過調研超市顧客購買的東西,能夠發現30%的顧客會同時購買牀單和枕套,而在購買牀單的顧客中有80%的人購買了枕套,這就存在一種隱含的關係:牀單→枕套,也就是說購買牀單的顧客會有很大可能購買枕套,所以商場能夠將牀單和枕套放在同一個購物區,方便顧客購買。網絡

  通常,關聯規則能夠應用的場景有:機器學習

    • 優化貨架商品擺放或者優化郵寄商品的目錄
    • 交叉銷售或者捆綁銷售
    • 搜索詞推薦或者識別異常

 

2、概念ide

  • 項目:交易數據庫中的一個字段,對超市的交易來講通常是指一次交易中的一個物品,如:牛奶
  • 事務:某個客戶在一次交易中,發生的全部項目的集合:如{牛奶,麪包,啤酒}
  • 項集:包含若干個項目的集合(一次事務中的),通常會大於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相互獨立

 

3、實現過程

  從以上的分析能夠得知,關聯規則是從事務集合中挖掘出這樣的關聯規則{X->Y}:它的支持度和置信度要大於最小閾值(minSup,minConf),固然這個最小閾值是由用戶指定的,能夠根據數據分佈和經驗;同時他的提高度最好是大於1的(具體值根據實際狀況設定,例如:三、5都可),便是有效強關聯規則。

  使用關聯規則的過程主要包含如下三個步驟:

  (1)數據篩選,首先對數據進行清洗,清洗掉那些公共的項目,好比:熱門詞,通用詞(此步依據具體項目而定)

  (2)根據支持度(support),從事務集合中找出頻繁項集(使用算法:Apriori算法,FP-Growth算法) 

  (3)根據置信度(confidence),從頻繁項集中找出強關聯規則(置信度閾值須要根據實驗或者經驗而定)

  (4)根據提高度(lift),從強關聯規則中篩選出有效的強關聯規則(提高度的設定須要通過屢次試驗肯定) 

 

4、如何生成頻繁項集-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)生成強關聯規則

  獲得頻繁項目集以後,則須要從頻繁項目集中找出符合條件的關聯規則。最簡單的辦法是:遍歷全部的頻繁項目集,而後從每一個項目集中依次取一、二、...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算法完成

  (固然實際項目中還須要去驗證生成的強關聯規則是否知足提高度要求,便是否是有效強關聯規則)。

 

5、如何生成頻繁項集-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. 第一次掃描數據庫,產生頻繁1項集,並對產生的頻繁項集按照頻數降序排列,並剪枝支持數低於閥值的元素。處理後獲得L集合,
  2. 第二次掃描數據庫,對數據庫的每一個交易事務中的項按照L集合中項出現的順序排序,生成FP-Tree(圖5.1)。

 

image圖5.1 FT-Tree

image

圖5.2  生成fp-tree的步驟

 

(2)從FP-Tree挖掘頻繁項集

 

  從FP-Tree重能夠挖掘出頻繁項集,其過程以下:

 

image

 圖5.3  頻繁項集挖掘過程

  從頻繁1項集鏈表中按照逆序開始,鏈表能夠追溯到每一個具備相同項的節點。

  1. 從鏈表中找到項「E」,追溯出FP-Tree中有兩個帶「E」的節點,由這兩個節點分別向上(parent)追溯,造成兩條模式:<E,C,A,B;1>,<E,A,B;1>.
  2. 由這兩條模式獲得項「E」的條件模式<A,B;2>.
  3. 根據條件模式,獲得項「E」的頻繁項集(不包含頻繁1項集):<E,A;2>,<E,B;2>,<E,A,B;2>
  4. 而後一次獲得項「D」,「C」,「A」。

(3)找出強關聯規則

  同第四節

(4)找出有效的強關聯規則

  同第四節

 

  至此,FP-Growth算法生成頻繁項集已經結束。

 

 

6、注意點

  (1)三個閾值點須要通過對此實驗或者經驗才能找到合適的閾值

  (2)關聯規則與word2vec在哪些場景有着共性和不一樣須要驗證(須要研究word2vec實現原理後再下結論)

  (3)數據集須要某些處理後,也許效果會有提高(同事的經驗)

 

7、總結

  第一次,「摘抄」整理別人的博客來放在本身的博客,算是一個小小的開始的,其實不少東西只有本身去真正的學習,思考,整理纔有收穫。

  機器學習算法與模型是一個頗有意思的東西,不少東西不去看本身徹底想象不到還能這麼玩,然而看了就是看了,跟用了仍是有很大差異,但願之後可以在工做中將本身看的一些東西用上去,多整理,這樣效果會比較好。

  雖然我是一個從網絡方向轉過來的「出家」人,可是這都不是事。我以爲看的多了,整理的多了,其實學起來仍是有套路能夠遵循的。

 

8、參考文獻

[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

相關文章
相關標籤/搜索