關聯規則挖掘

關聯規則挖掘可以讓我們從數據集中發現項與項(item 與 item)之間的關係,它在我們的生活中有很多應用場景,“購物籃分析”就是一個常見的場景,這個場景可以從消費者交易記錄中發掘商品與商品之間的關聯關係,進而通過商品捆綁銷售或者相關推薦的方式帶來更多的銷售量。所以說,關聯規則挖掘是個非常有用的技術。

搞懂關聯規則中的幾個概念

我舉一個超市購物的例子,下面是幾名客戶購買的商品列表:
在這裏插入圖片描述

支持度

支持度是個百分比,它指的是某個商品組合出現的次數與總次數之間的比例。
在這個例子中,我們能看到“牛奶”出現了 4 次,那麼這 5 筆訂單中“牛奶”的支持度就是 4/5=0.8。

同樣“牛奶 + 麪包”出現了 3 次,那麼這 5 筆訂單中“牛奶 + 麪包”的支持度就是 3/5=0.6

置信度

它指的就是當你購買了商品 A,會有多大的概率購買商品 B
置信度(牛奶→啤酒)=2/4=0.5,代表如果你購買了牛奶,有多大的概率會購買啤酒?

置信度(啤酒→牛奶)=2/3=0.67,代表如果你購買了啤酒,有多大的概率會購買牛奶?

置信度是個條件概念,就是說在 A 發生的情況下,B 發生的概率是多少。

提升度

我們在做商品推薦的時候,重點考慮的是提升度,因爲提升度代表的是“商品 A 的出現,對商品 B 的出現概率提升的”程度。

提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)

這個公式是用來衡量 A 出現的情況下,是否會對 B 出現的概率有所提升。

所以提升度有三種可能:
提升度 (A→B)>1:代表有提升;
提升度 (A→B)=1:代表有沒有提升,也沒有下降;
提升度 (A→B)<1:代表有下降。

Apriori 的工作原理

美[əpriˈɔri]

首先我們把上面案例中的商品用 ID 來代表,牛奶、麪包、尿布、可樂、啤酒、雞蛋的商品 ID 分別設置爲 1-6,上面的數據表可以變爲:
在這裏插入圖片描述
Apriori 算法其實就是查找頻繁項集 (frequent itemset) 的過程,所以首先我們需要定義什麼是頻繁項集。
頻繁項集就是支持度大於等於最小支持度 (Min Support) 閾值的項集,所以小於最小值支持度的項目就是非頻繁項集,而大於等於最小支持度的的項集就是頻繁項集。

項集這個概念,英文叫做 itemset,它可以是單個的商品,也可以是商品的組合。

我們再來看下這個例子,假設我隨機指定最小支持度是 50%,也就是 0.5。

我們來看下 Apriori 算法是如何運算的:
首先,我們先計算單個商品的支持度,也就是得到 K=1 項的支持度:
在這裏插入圖片描述
因爲最小支持度是 0.5,所以你能看到商品 4、6 是不符合最小支持度的,不屬於頻繁項集,於是經過篩選商品的頻繁項集就變成:
在這裏插入圖片描述
在這個基礎上,我們將商品兩兩組合,得到 k=2 項的支持度:
在這裏插入圖片描述
我們再篩掉小於最小值支持度的商品組合,可以得到:
在這裏插入圖片描述
我們再將商品進行 K=3 項的商品組合,可以得到:
在這裏插入圖片描述
再篩掉小於最小值支持度的商品組合,可以得到:
在這裏插入圖片描述
通過上面這個過程,我們可以得到 K=3 項的頻繁項集{1,2,3},也就是{牛奶、麪包、尿布}的組合。

Apriori 算法的遞歸流程:
1、K=1,計算 K 項集的支持度;
2、篩選掉小於最小支持度的項集;
3、如果項集爲空,則對應 K-1 項集的結果爲最終結果。
否則 K=K+1,重複 1-3 步。

Apriori 的改進算法:FP-Growth 算法

Apriori 在計算的過程中有以下幾個缺點:
1、可能產生大量的候選集。因爲採用排列組合的方式,把可能的項集都組合出來了;
2、每次計算都需要重新掃描數據集,來計算每個項集的支持度。

所以 Apriori 算法會浪費很多計算空間和計算時間,爲此人們提出了 FP-Growth 算法:

1、創建了一棵 FP 樹來存儲頻繁項集。在創建前對不滿足最小支持度的項進行刪除,減少了存儲空間。
2、整個生成過程只遍歷數據集 2 次,大大減少了計算量。

所以在實際工作中,我們常用 FP-Growth 來做頻繁項集的挖掘,下面我給你簡述下 FP-Growth 的原理。

創建項頭表(item header table)

創建項頭表的作用是爲 FP 構建及頻繁項集挖掘提供索引

這一步的流程是先掃描一遍數據集,對於滿足最小支持度的單個項(K=1 項集)按照支持度從高到低進行排序,這個過程中刪除了不滿足最小支持度的項。(第一步遍歷數據集就刪除了不滿足最小支持度的項,降低了時間複雜度;同時降序排列可以公用祖先節點–null點)

項頭表包括了項目、支持度,以及該項在 FP 樹中的鏈表。初始的時候鏈表爲空。
在這裏插入圖片描述

構造 FP 樹

FP 樹的根節點記爲 NULL 節點。
整個流程是需要再次掃描數據集,對於每一條數據,按照支持度從高到低的順序進行創建節點(也就是第一步中項頭表中的排序結果),如果有共用的祖先,則對應的公用祖先節點計數加1,如果不存在就進行創建。直到所有的數據都出現在FP樹中。

同時在創建的過程中,需要更新項頭表的鏈表。
在這裏插入圖片描述

構建子樹
1.假設已經完成創建項頭表的工作,省略count+1
2.掃描數據集,按照項頭表排列好的結果,一次創建節點
3.因爲尿布出現在所有訂單中,沒有例外情況,所以這隻有一個子節點
4.因爲牛奶出現在尿布中的所有訂單裏,所以只有一個子節點
5.由表中數據可得,在出現牛奶的訂單中,麪包出現的情況,分爲兩種,
1)出現3次麪包,出現在有牛奶的訂單中
2)出現一次麪包,出現在沒有牛奶的訂單中
故,生成兩個子節點
6.後續內容屬於迭代內容,自行體會

通過 條件模式基挖掘頻繁項集

我們就得到了一個存儲頻繁項集的 FP 樹,以及一個項頭表。我們可以通過項頭表來挖掘出每個頻繁項集。
具體的操作會用到一個概念,叫“條件模式基”,它指的是以要挖掘的節點爲葉子節點,自底向上求出 FP 子樹,然後將 FP 子樹的祖先節點設置爲葉子節點之和。

我以“啤酒”的節點爲例,從 FP 樹中可以得到一棵 FP 子樹,將祖先節點的支持度記爲葉子節點之和,得到:

在這裏插入圖片描述

你能看出來,相比於原來的 FP 樹,尿布和牛奶的頻繁項集數減少了。這是因爲我們求得的是以“啤酒”爲節點的 FP 子樹,也就是說,在頻繁項集中一定要含有“啤酒”這個項。
你可以再看下原始的數據,其中訂單 1{牛奶、麪包、尿布}和訂單 5{牛奶、麪包、尿布、可樂}並不存在“啤酒”這個項,所以針對訂單 1,尿布→牛奶→麪包這個項集就會從 FP 樹中去掉,針對訂5 也包括了尿布→牛奶→麪包這個項集也會從 FP 樹中去掉,所以你能看到以“啤酒”爲節點的 FP 子樹,尿布、牛奶、麪包項集上的計數比原來少了 2。

條件模式基不包括“啤酒”節點,而且祖先節點如果小於最小支持度就會被剪枝,所以“啤酒”的條件模式基爲空。
同理,我們可以求得“麪包”的條件模式基爲:

所以可以求得麪包的頻繁項集爲{尿布,麪包},{尿布,牛奶,麪包}。同樣,我們還可以求得牛奶,尿布的頻繁項集,這裏就不再計算展示。

FP-Growth 算法總結:

1、構建項頭表,從高到底排序(以便有共同祖節點)
2、對數據集按照項頭表順序進行排序,然後從高到低遞歸繪製層次圖
3、按照項頭表,依據第2步結果,從低到高,重新按照節點原則構建層次圖,得到條件模式基。

總結

1、關聯規則算法是最常用的算法,通常用於“購物籃分析”,做捆綁推薦。
2、Apriori 算法在實際工作中需要對數據集掃描多次,會消耗大量的計算時間
3、針對Apriori 算法時間複雜度高, FP-Growth 算法被提出來,通過 FP 樹減少了頻繁項集的存儲以及計算時間。
4、原始模型往往是最接近人模擬的過程,但時間複雜度或空間複雜度高;於是人們就會提出新的方法,比如新型的數據結構,可以提高模型的計算速度。
5、FP Tree算法改進了Apriori算法的I/O瓶頸,巧妙的利用了樹結構,這讓我們想起了BIRCH聚類,BIRCH聚類也是巧妙的利用了樹結構來提高算法運行速度。利用內存數據結構以空間換時間是常用的提高算法運行時間瓶頸的辦法。
6、置信度和提升度是對頻繁項集的一種驗證,在篩選最優組合的時候,一般會設置最小支持度,最小置信度,這樣頻繁項集和關聯關係都要滿足這個條件。提升度 (A→B)= 置信度 (A→B)/ 支持度 (B),所以提升度是對滿足前兩者條件的另一種驗證方式,這樣避免一種情況:置信度(A->B)很高,是因爲本身支持度(B)很高,實際上和A的出現關係不大。
在這裏插入圖片描述

參考文獻:
數據分析實戰45講
https://www.cnblogs.com/zhengxingpeng/p/6679280.html(FP Tree不好理解,參考這篇文章,自己動手畫畫圖就理解了)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章