1. 程式人生 > >Apriori 演算法-如何進行關聯規則挖掘

Apriori 演算法-如何進行關聯規則挖掘

> **公號:碼農充電站pro** > **主頁:** 在資料分析領域有一個經典的故事,叫做“尿布與啤酒”。 據說,在美國西部的一家連鎖超市發現,很多男人會在週四購買尿布和啤酒。這樣超市就可以將尿布與啤酒放在一起賣,便可以增加銷售量。 “尿布與啤酒”這個案例就屬於資料分析中的**關聯分析**,也就是分析資料集中的內在隱含關係。 關聯分析可以被用於發掘商品與商品之間的內在關聯關係,進而通過商品捆綁銷售或者相互推薦,來增加商品銷量。 > **關聯分析**除了可以用於零售行業外,還可以用於**網站流量分析**和**醫藥行業**等。 **Apriori 演算法**是一種發掘事物內在關聯關係的演算法,它可以加快關聯分析的速度,從而讓我們更有效的進行關聯分析。 ### 1,關聯分析 **關聯分析**用於發掘大規模資料集中的內在關係。 關聯分析一般要分析資料集中的**頻繁項集**(frequent item sets)和**關聯規則**(association rules): - 頻繁項集:是資料集中**頻繁項**的集合,集合中可以有**一項或多項**物品。 - 關聯規則:暗示了兩種物品之間可能存在很強的內在關係。 假設,我們收集了一家商店的交易清單: | 交易編號 | 購物清單 | |:--|:--| | 1 | 牛奶,麵包 | | 2 | 牛奶,麵包,火腿 | | 3 | 麵包,火腿,可樂 | | 4 | 火腿,可樂,方便麵 | | 5 | 麵包,火腿,可樂,方便麵 | 頻繁項集是一些經常出現在一起的物品集合。比如:`{牛奶,麵包}`,`{火腿,方便麵,可樂}`都是頻繁項集的例子。 >
項集中的物品,一般不考慮**順序**關係。 關聯規則意味著有人買了一種物品,還會買另一種物品。比如`方便麵->火腿`,就是一種關聯規則,表示如果買了方便麵,還會買火腿。 ### 2,三個重要概念 關聯分析中有三個重要的概念,分別是: - 支援度 - 可信度 **/** 置信度 - 提升度 ***支援度*** 要進行關聯分析,首先要尋找**頻繁項**,也就是頻繁出現的物品集。那麼怎樣才叫頻繁呢?我們可以用**支援度**來衡量頻繁。 **支援度**是針對**項集**來說的,一個項集的支援度就是該項集的記錄佔總記錄的比例。通常可以定義一個**最小支援度**,從而只保留滿足最小支援度的項集。 一個項集`{A}` 的支援度的定義如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201205082735964.png) 比如,在上面表格中的5 項記錄中,`{牛奶}` 出現在了兩條記錄中,所以`{牛奶}` 的支援度為 `2/5`;而`{麵包,火腿}` 出現在了三條記錄中,所以`{麵包,火腿}`的支援度為`3/5`。 ***可信度*** **可信度**又叫**置信度**,它是針對**關聯規則**來說的,比如`{火腿}->
{可樂}`。 一個關聯規則`{A}->{B}` 表示,如果購買了**物品A**,會有多大的概率購買**物品B**?它的可信度的定義如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201204231948437.png) 所以,在上面的表格中,`{火腿,可樂}` 的支援度是 `3/5`,`{火腿}` 的支援度是 `4/5`,所以`{可樂}->{火腿}` 的可信度為 `3/5` 除以 `4/5`,等於 `0.75`。這意味著,如果購買了火腿,有 `75%` 的可能性會購買可樂。 ***提升度*** 提升度也是針對關聯規則來說的,它表示的是“如果購買物品A,會對購買物品B 的概率**提升**多少”。 一個關聯規則`{A}->
{B}` 的提升度的定義如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201205084713458.png) 提升度會有三種情況: - 提升度{A}->{B} > 1:表示購買物品A 對購買物品B 的概率有提升。 - 提升度{A}->{B} = 1:表示購買物品A 對購買物品B 的概率沒有提升,也沒有下降。 - 提升度{A}->{B} < 1:表示購買物品A 對購買物品B 的概率有下降。 ### 3,如何尋找頻繁項 尋找頻繁項的一個簡單粗暴的方法是,**對所有的物品進行排列組合**,然後計算所有組合的支援度,這種演算法也可以叫做**窮舉法**。 ***窮舉法*** 窮舉法就是列出所有物品的組合,然後計算每種組合的支援度。 比如,我們有一個物品集{0,1,2,3},其中有四個物品,那麼所有的物品組合如下: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201205093614876.png?) 從圖中可以看到一共有**15** 種組合,計算每一種組合的支援度都需要遍歷一遍所有的記錄,檢查每個記錄中是否包含該組合。因此有多少種組合,就需要遍歷多少遍記錄,時間複雜度則會很大。 可以總結出:包含**N** 種物品的資料集,共有 **2N - 1** 種組合。為了計算每種組合的支援度,則需要遍歷 **2N - 1** 次記錄。 如果一個商店中有100 款商品,將會有**1.26*1030** 種組合,這是一個非常龐大的數字。而普通商店一般都會有成千上萬的商品,那麼組合數將大到無法計算。 ### 4,Apriori 演算法 為了降低計算所需的時間,1994 年 **Agrawal** 提出了著名的 **Apriori 演算法**,該演算法可以有效減少需要計算的組合的數量,避免組合數量的指數增長,從而在合理的時間內計算出頻繁項集。 **Apriori 原理**是說:如果一個項集是**非頻繁集**,那麼它的所有超集也是**非頻繁的**。 比如下圖中的項集`{1,3}` 是非頻繁集,那麼`{0,1,3}`,`{1,2,3}`,`{0,1,2,3}` 就都是非頻繁項集。這就大大減少了需要計算的項集的數量。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020120512132242.png?) ### 5,Apriori 演算法的實現 這裡,我們使用**Apriori 演算法**來尋找上文表格中的購物清單的頻繁項集(為了方便檢視,我把表格放在這裡)。 | 交易編號 | 購物清單 | |:--|:--| | 1 | 牛奶,麵包 | | 2 | 牛奶,麵包,火腿 | | 3 | 麵包,火腿,可樂 | | 4 | 火腿,可樂,方便麵 | | 5 | 麵包,火腿,可樂,方便麵 | ***efficient_apriori 模組*** [Efficient-Apriori](https://pypi.org/project/efficient-apriori/) 包是**Apriori 演算法**的穩定高效的實現,該模組適用於 `Python 3.6+`。 > 使用**Apriori 演算法**要先安裝:`pip install efficient-apriori` **efficient_apriori** 包中有一個 `apriori` 函式,原型如下(這裡只列出了常用引數): ```python apriori(data, min_support = 0.5, min_confidence = 0.5) ``` 引數的含義: - **data**:表示資料集,是一個列表。列表中的元素可以是元組,也可以是列表。 - **min_support**:表示最小支援度,小於最小支援度的項集將被捨去。 - 該引數的取值範圍是 **[0, 1]**,表示一個百分比,比如**0.3** 表示**30%**,那麼支援度小於**30%** 的項集將被捨去。 - 該引數的預設值為**0.5**,常見的取值有**0.5,0.1,0.05**。 - **min_confidence**:表示最小可信度。 - 該引數的取值範圍也是 **[0, 1]**。 - 該引數的預設值為**0.5**,常見的取值有**1.0,0.9,0.8**。 ***使用 apriori 函式*** 首先,將表格中的購物清單轉化成 **Python** 列表,如下: ```python data = [ ('牛奶', '麵包'), ('牛奶', '麵包', '火腿'), ('麵包', '火腿', '可樂'), ('火腿', '可樂', '方便麵'), ('麵包', '火腿', '可樂', '方便麵') ] ``` 挖掘頻繁項集和頻繁規則: ```python # 該函式的使用很簡單,就一行程式碼 # 最小支援度為 0.5 # 最小可信度為 1 itemsets, rules = apriori(data, min_support=0.5, min_confidence=1) ``` 檢視頻繁項集和頻繁規則: ```python >>> itemsets # 頻繁項集 {1: { # 只有一個元素的項集 ('麵包',): 4, # 4 表示記錄數 ('火腿',): 4, ('可樂',): 3 }, 2: { # 有兩個元素的項集 ('火腿', '麵包'): 3, ('可樂', '火腿'): 3 } } >>> rules # 頻繁規則 [{可樂} -> {火腿}] ``` ### 6,總結 本篇文章主要介紹了什麼是關聯分析,關聯分析中三個重要的概念,以及 **Apriori** 演算法。 **Apriori** 演算法用於加快關聯分析的速度,但它也需要多次掃描資料集。其實除了**Apriori** 演算法,還有其它演算法也可以加快尋找頻繁項集的速度。 2000 年提出的[FP-Growth](https://pypi.org/project/fptools/) 演算法,對 **Apriori** 演算法進行了改進。**FP-Growth** 通過建立一棵 **FP樹**來儲存頻繁項集。對不滿足最小支援度的項不會建立節點,減少了儲存空間。而且整個生成過程只遍歷資料集 2 次,大大減少了計算量。 另外,還有**CBA** 演算法,**GSP** 演算法等,都對**Apriori**演算法進行了改進,這裡不再詳細介紹。 (本節完。) --- **推薦閱讀:** [資料變換-歸一化與標準化](https://www.cnblogs.com/codeshell/p/14060164.html) [如何使用Python 進行資料視覺化](https://www.cnblogs.com/codeshell/p/14066350.html) [KNN 演算法-實戰篇-如何識別手寫數字](https://www.cnblogs.com/codeshell/p/14077625.html) [K 均值演算法-如何讓資料自動分組](https://www.cnblogs.com/codeshell/p/14084190.html) [PageRank 演算法-Google 如何給網頁排名](https://www.cnblogs.com/codeshell/p/14106948.html) --- *歡迎關注作者公眾號,獲取更多技術乾貨。* ![碼農充電站pro](https://img-blog.csdnimg.cn/20200505082843773.png?#pic