天天看點

機器學習(無監督學習)關聯規則Apriori算法原理與python實作

一、關聯規則原理:

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個項的資料集提取的可能規則的總數為:

機器學習(無監督學習)關聯規則Apriori算法原理與python實作

。上面的案例中就有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算法原理與python實作

Apriori算法過程:

  • 1、資料集-->設定最低支援度門檻值-->擷取1-項集-->過濾出頻繁項集(剪枝非頻繁)-->擷取2-項集-->過濾出頻繁項集(剪枝非頻繁)--->......
  • 2、設定置信度門檻值-->從頻繁項集中提取高置信度的規則
機器學習(無監督學習)關聯規則Apriori算法原理與python實作

三、代碼案例

# 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)
           
機器學習(無監督學習)關聯規則Apriori算法原理與python實作
# 生成關聯規則二維表,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獨立。

機器學習(無監督學習)關聯規則Apriori算法原理與python實作
#篩選出提升度和置信度滿足條件的關聯規則
rules[ ( rules["lift"] > 1) & (rules["confidence"] > 0.8) ]
           
機器學習(無監督學習)關聯規則Apriori算法原理與python實作

結論:在支援度大于等于0.4,置信度大于0.8且提升度大于1的條件下,關聯産品組合有潔面乳和補水霜,且是雙側關聯。即可以将這兩個産品進行組合售賣,會提高收益。