一、關聯規則原理:
1、概述:
關聯規則算法是在一堆資料集中尋找資料之間的某種關聯,通過該算法我們可以對資料集做關聯分析——在大規模的資料中尋找有趣關系的任務。這些關系可以有兩種形式:頻繁項集、關聯規則。
- 頻繁項集:經常出現在一塊的物品的集合。
- 關聯規則:暗示兩種物品之間可能存在很強的關系。
關聯分析典型的例子,沃爾瑪超市啤酒于尿不濕的關聯分析。例如:購物籃資料
訂單編号 | 購買商品集合 |
001 | 羽毛球拍,羽毛球 |
002 | 羽毛球,球網,紙巾,礦泉水 |
003 | 羽毛球拍,球網,紙巾,紅牛 |
004 | 羽毛球,羽毛球拍,球網,紙巾 |
005 | 羽毛球,羽毛球拍,球網,紅牛 |
名詞定義:
- 事物:每一個訂單被稱為一個事物,上表包含5個事物;
- 項:訂單中的每一個物品被稱為一個項;
- 項集:包含0個或多個項的集合被稱為項集,如:{羽毛球拍,羽毛球};
- k-項集:包含k個項的項集被稱為K項集,如{羽毛球拍,羽毛球}稱為2-項集;
- 前件與後件:對于規則{羽毛球拍}-->{羽毛球},{羽毛球拍}叫做前件,{羽毛球}叫做後件。
2、頻繁項集的評估标準:
頻繁項集:經常出現在一塊的物品的集合,當資料量非常大的時候,我們不可能通過人工去算,是以催生了關聯規則的算法,如:Apriori、prefixSpan、CBA等。有了計算方法,那麼常常出現在一塊多少次的物品集合才算頻繁項集,則還需要一個評估頻繁項集的标準。評估标準有支援度,置信度、和提升度等,需要自定義一個門檻值來衡量判别。
- 支援度(support):幾個關聯的資料集中出現的次數占總資料集的比重,或者說幾個資料關聯出現的機率。上例中:Support(羽毛球,球網,紙巾)= 2/5.。一般來說支援度高不一定是頻繁項集,但支援度低一定不能構成頻繁項集,是以可設定一個最低的支援度來進行過濾。
- 置信度(confidence):一個資料出現後,另一個資料出現的機率,或者說是資料的條件機率。定量評估一個頻繁項集的置信度(即準确度)的統計量。Confidence(y-->x)=P(X|Y)=P(XY)/P(Y)。針對如{羽毛球拍}->{羽毛球}這樣的關聯規則來定義的。計算為 支援度{羽毛球拍,羽毛球}/支援度{羽毛球拍},其中{羽毛球拍,羽毛球}的支援度為3/5,{羽毛球拍}的支援度為4/5,是以“羽毛球拍->羽毛球”的置信度為3/4=0.75,這意味着羽毛球拍的記錄中,我們的規則有75%都适用。從關聯規則的可信程度角度來看,“購買羽毛球拍的顧客會購買羽毛球”這個商業推測,有75%的可能性是成立的,也可以了解為做這種商業決策,可以獲得75%的回報率期望。同理:Confidence(yz-->x)=p(x|yz)=p(xyz)/p(yz)。
- 提升度(lift):表示含有Y的條件下同時含有X的機率,與x總體發生的機率之比,也就是說x對y的提升度與x總體發生的機率之比,即Lift(y-->x)=p(x|y)/p(x)=Confidence(y-->x)/p(x)。提升度大于1 有效的強關聯規則,小于1 無效的強關聯規則,等于1 x與y獨立。
3.關聯規則發現
給定事務的集合T,關聯規則發現是指找出支援度大于等于門檻值,并且置信度大于等于門檻值的所有規則。挖掘關聯規則的一種原始方法是:計算每個可能規則的支援度和置信度,但可以從資料集提取的規則的數目達指數級,更具體地說,從包含d個項的資料集提取的可能規則的總數為:
。上面的案例中就有3^6-2^7+1種可能的關聯規則。
當資料量增加的時候,計算非常龐大,是以往往我們會采取剪枝政策,即設定支援度、置信度的門檻值,沒有達到門檻值的項集将不必再進行後續的計算。
于是将關聯規則分為2個主要的子任務:
- 1.頻繁項集的産生:發現滿足最小支援度門檻值的所有項集,把這些項集稱作頻繁項集。
- 2.規則 的産生:從頻繁項集中提取高置信度的規則,把這些規則稱作強規則。
優化計算開銷:通常頻繁項集的産生計算開銷遠遠大于規則産生所需要的計算開銷。
- 1.減少候選項集數目M。
- 2.減少比較次數。替代将每個候選項集與每個事物相比對,可以使用更進階的資料結構,或者存儲候選項集或者壓縮資料集,來減少比較次數。具體展現看Apriori算法。
二、Apriori算法
先驗原理:如果一個項集是頻繁的,則它的所有子集一定也是頻繁的。如果一個項集是非頻繁的,則它的所有超集都是非平凡的。這樣找到一個非頻繁項集後,就可以把它的超集進行剪枝處理了。
如下圖,假如0,1,2,3分别表示4類商品,其中我們假定123為頻繁項集,則12,13,23,1,2,3都是頻繁的。
反而言之,如果012是非頻繁項集,那麼他的超集0123也是非頻繁的。
Apriori算法過程:
- 1、資料集-->設定最低支援度門檻值-->擷取1-項集-->過濾出頻繁項集(剪枝非頻繁)-->擷取2-項集-->過濾出頻繁項集(剪枝非頻繁)--->......
- 2、設定置信度門檻值-->從頻繁項集中提取高置信度的規則
三、代碼案例
# pip install apriori
# pip install MLxtend
import pandas as pd
import xlrd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
import warnings
warnings.filterwarnings("ignore") #用于排除警告
#讀取sheet_name='table1'的資料
df=pd.read_excel('e:\glgz.xlsx') #根據表的名稱
display(df)#預設讀取前5行的資料
訂單編号 | 面膜 | 洗面乳 | 美白霜 | 補水霜 | 潔面乳 | |
---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | |||
1 | 2 | 1 | 1 | 1 | 1 | |
2 | 3 | 1 | 1 | |||
3 | 4 | 1 | 1 | 1 | ||
4 | 5 | 1 | 1 | 1 | ||
5 | 6 | 1 | 1 | 1 | 1 | 1 |
6 | 7 | 1 | ||||
7 | 8 | 1 | 1 | 1 | ||
8 | 9 | 1 | 1 | 1 | 1 |
# 調用apriori算法,并且設定最小支援度
frequent_itemsets = apriori(df[['面膜', '洗面乳', '美白霜', '補水霜', '潔面乳' ]],min_support=0.4, use_colnames=True)
# frequent_itemsets = apriori(df.drop("訂單編号",1),min_support=0.4,use_colnames=True)
display(frequent_itemsets)
# 生成關聯規則二維表,min_threshold=1表示最少是兩種産品的關聯規則
rules = association_rules(frequent_itemsets,metric="lift",min_threshold=1)
display(rules)
注意:antecedent support:前置支援度(由前面一個産品到後面一個産品的支援度);consequent support:後置支援度(由後面一個産品到前面一個産品的支援度);support:綜合支援度;confidence:置信度;lift:提示度。
其中support太小的話,則表示該關聯規則在整體樣本中出現的機率較低,對整體來說分析價值會降低(整體貢獻度不夠);confidence太低,則說明該組産品組合的價值不高,沒有組合價值;lift提升度大于1 有效的強關聯規則,小于1 無效的強關聯規則,等于1 x與y獨立。
#篩選出提升度和置信度滿足條件的關聯規則
rules[ ( rules["lift"] > 1) & (rules["confidence"] > 0.8) ]
結論:在支援度大于等于0.4,置信度大于0.8且提升度大于1的條件下,關聯産品組合有潔面乳和補水霜,且是雙側關聯。即可以将這兩個産品進行組合售賣,會提高收益。