關聯規則挖掘(二)-- Apriori 演算法

LiSW007發表於2017-12-11

本文首先介紹了Apriori演算法的原理,進行了簡單的示例推導,而後運用R語言中的arules包對Groceries資料集進行關聯規則挖掘實戰。

一、概述

Apriori演算法是一種最有影響的挖掘布林關聯規則頻繁項集的演算法,這種演算法所針對的關聯規則是單維、單層、布林關聯規則
在前一篇文章中寫到關聯規則挖掘演算法的總體效能取決於尋找頻繁項集,而後由頻繁項集產生強關聯規則就很容易了。那麼如何尋找頻繁項集呢?自然的想法是對於資料集D,遍歷它的每一條記錄T,得到T的所有子集,然後計算每一個子集的支援度,最後的結果再與最小支援度比較。此種方法的計算量非常巨大,顯然是不可取的。因此,Apriori演算法提出了逐層搜尋的迭代方法:
1.自連線獲取候選集。第一輪的候選集就是資料集D中的項,而其他輪次的候選集則是由前一輪次頻繁集自連線得到(頻繁集由候選集剪枝得到)。
2.對候選集進行剪枝。剪枝規則1:如果某條候選集的支援度小於最小支援度,那麼就會被剪掉;剪枝規則2:如果某條候選集的子集中存在非頻繁集,該候選集也會被剪掉。
值得注意的是,為了提高頻繁項集逐層產生的效率,進一步減少計算量,一種稱作 Apriori 性質的重要性質被用於壓縮搜尋空間,即:頻繁項集的所有非空子集都必須也是頻繁的(對應剪枝規則2)。

二、示例推導

該示例基於某事務資料庫,資料庫中有9個事務,如下圖所示:
這裡寫圖片描述
如何使用Apriori演算法尋找頻繁項集呢?具體如下:
1.在演算法的第一次迭代,每個項都是候選 1-項集的集合 C1

C_1
的成員。演算法簡單地掃描所有的事務,對每個項的出現次數計數。
2.假定最小事務支援計數為 2(即,min_sup = 2/9 = 22%)。可以確定頻繁 1-項集的集合L1
L_1
。它由具有最小支援度的候選 1-項集組成。
3.為發現頻繁 2-項集的集合 L2
L_2
,演算法使用L1
L_1
L1
L_1
自連線產生候選 2-項集的集合C2
C_2

4.下一步,掃描 D 中事務,計算C2
C_2
中每個候選項集的支援計數,如下圖的第二行的中間表所示。
5.將候選集支援度計數與最小支援度比較,產生頻繁 2-項集的集合L2
L_2

6.產生候選 3-項集的集合C3
C_3
。首先,L2
L_2
L2
L_2
自連線得到{I1,I2,I3},{I1,I2,I5},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}
\{I1,I2,I3\}, \{I1,I2,I5\},\{I1,I3,I5\}, \{I2,I3,I4\}, \{I2,I3,I5\}, \{I2,I4,I5\}
。根據Apriori 性質,頻繁項集的所有子集必須是頻繁的,我們可以確定後 4 個候選不可能是頻繁的。因此,我們把它們由C3
C_3
刪除,這樣,在此後掃描 D 確定L3
L_3
時就不必再求它們的計數值。值得注意的是,Apriori 演算法使用逐層搜尋技術,給定 k-項集,我們只需要檢查它們的(k-1)-子集是否頻繁。
7.掃描 D 中事務,以確定L3
L_3
,它由具有最小支援度的C3
C_3
中的候選 3-項集組成。
8.產生候選 4-項集的集合C4
C_4
L3
L_3
L3
L_3
自連線得到{I1,I2,I3,I5}
\{I1,I2,I3,I5\}
,由於其子集{I1,I3,I5}
\{I1,I3,I5\}
不是頻繁的,所以C4
C_4
為空,演算法終止。
這裡寫圖片描述

三、例項

1.R語言函式介紹

R語言中arules包可以實現Apriori演算法。

  • apriori
    apriori
    函式的用法:

apriori(data,parameter=list(support=0.1,confidence=0.8,minlen=1,maxlen=10))

apriori(data, parameter = list(support = 0.1, confidence = 0.8, minlen = 1, maxlen = 10))

其中parameter引數是一個列表,包含支援度,置信度,和minlen,maxlen即規則包含的元素個數(LHS+RHS),預設的minlen = 1,意味著 {}=>beer
\{\} => {beer}
是合法的規則,我們往往不需要這種規則,所以一般設定minlen = 2。

2.R語言實戰

本次實戰採用arules包中的資料集Groceries,該資料集來自現實生活中某超市的一個月經營資料。

(1)瞭解資料集

> #下載並載入包
> install.packages("arules")
> library("arules")
> #呼叫資料集,並檢視summary
> data(Groceries)
> summary(Groceries)
transactions as itemMatrix in sparse format with
 9835 rows (elements/itemsets/transactions) and
 169 columns (items) and a density of 0.02609146 

most frequent items:
      whole milk other vegetables       rolls/buns             soda           yogurt 
            2513             1903             1809             1715             1372 
         (Other) 
           34055 

element (itemset/transaction) length distribution:
sizes
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17 
2159 1643 1299 1005  855  645  545  438  350  246  182  117   78   77   55   46   29 
  18   19   20   21   22   23   24   26   27   28   29   32 
  14   14    9   11    4    6    1    1    1    1    3    1 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   2.000   3.000   4.409   6.000  32.000 

includes extended item information - examples:
       labels  level2           level1
1 frankfurter sausage meat and sausage
2     sausage sausage meat and sausage
3  liver loaf sausage meat and sausage

summary(Groceries)的解釋:
第一段:該資料集9835條交易記錄,169種交易商品,稀疏矩陣的密度為0.02609146,即所有購物籃的商品總數量為9835*169*0.02609146=43367。
第二段:出現頻率最高的商品為whole milk:2513次,other vegetables:1903次等。
第三段:購物籃裡商品數量,其中只買了一件商品的訂單有2159個,購物籃裡商品最多的有32件商品。
第四段:購物籃裡商品的五數總括和平均數。
第五段:資料集除了商品名稱,還包括其他資訊,在這裡是商品所屬類別level2和level1,level2是小類,level1是大類。

> #進一步檢視資料集資訊
> inspect(Groceries[1:5])
    items                     
[1] {citrus fruit,            
     semi-finished bread,     
     margarine,               
     ready soups}             
[2] {tropical fruit,          
     yogurt,                  
     coffee}                  
[3] {whole milk}              
[4] {pip fruit,               
     yogurt,                  
     cream cheese ,           
     meat spreads}            
[5] {other vegetables,        
     whole milk,              
     condensed milk,          
     long life bakery product}
> basketsize <- size(Groceries)
> itemfreq <- itemFrequency(Groceries)

解釋:
size函式和itemFrequency函式都是arules包中的函式,前者是為了計算購物籃裡商品數量,後者是為了計算每種商品的支援度。而itemFrequencyPlot則可以畫出條形圖進行展現,如下:

> itemFrequencyPlot(Groceries, support = 0.1)

這裡寫圖片描述

> itemFrequencyPlot(Groceries, topN = 10)

這裡寫圖片描述

(2)關聯規則挖掘

為了進行關聯規則挖掘,第一步要根據具體的業務知識設定最小支援度。根據日訂單9835/30=328,時訂單328/12=27,可知該超市為一箇中型超市,我們假設最小支援度為某商品每天至少被購買兩次即2*30/9835=0.006。最小置信度暫定為0.25。

> #提取關聯規則
> rules <- apriori(Groceries,parameter = list(support = 0.006, confidence = 0.25, minlen = 2))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target
       0.25    0.1    1 none FALSE            TRUE       5   0.006      2     10  rules
   ext
 FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 59 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
sorting and recoding items ... [109 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 4 done [0.00s].
writing ... [463 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
> summary(rules)
set of 463 rules

rule length distribution (lhs + rhs):sizes
  2   3   4 
150 297  16 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   2.000   3.000   2.711   3.000   4.000 

summary of quality measures:
    support           confidence          lift            count      
 Min.   :0.006101   Min.   :0.2500   Min.   :0.9932   Min.   : 60.0  
 1st Qu.:0.007117   1st Qu.:0.2971   1st Qu.:1.6229   1st Qu.: 70.0  
 Median :0.008744   Median :0.3554   Median :1.9332   Median : 86.0  
 Mean   :0.011539   Mean   :0.3786   Mean   :2.0351   Mean   :113.5  
 3rd Qu.:0.012303   3rd Qu.:0.4495   3rd Qu.:2.3565   3rd Qu.:121.0  
 Max.   :0.074835   Max.   :0.6600   Max.   :3.9565   Max.   :736.0  

mining info:
      data ntransactions support confidence
 Groceries          9835   0.006       0.25

summary(rules)的解釋:
第一段:規則的條數,共有463條規則
第二段:規則長度的分佈,len=2有150條規則,len=3有297,len=4有16。
第三段:規則長度的五數總括和均值。
第四段:支援度、置信度和lift的五數總括和均值。
第五段:挖掘的相關資訊。

(3)評估規則

規則可以劃分為3大類:

  • 提供非常清晰、有用的洞察,可以直接應用在業務上。
  • 顯而易見,很清晰但是沒啥用,屬於common sense,如 {尿布} => {嬰兒食品}。
  • 不清晰,難以解釋,需要額外的研究來判定是否是有用的rule。

那麼,如何發現有用的rules呢?

  • 按照某種度量對規則進行排序。
> #按照lift,對規則進行排序
> orderbylift_rules <- sort(rules, by = 'lift')
> inspect(orderbylift_rules[1:5])
    lhs                   rhs                      support confidence     lift count
[1] {herbs}            => {root vegetables}    0.007015760  0.4312500 3.956477    69
[2] {berries}          => {whipped/sour cream} 0.009049314  0.2721713 3.796886    89
[3] {tropical fruit,                                                                
     other vegetables,                                                              
     whole milk}       => {root vegetables}    0.007015760  0.4107143 3.768074    69
[4] {beef,                                                                          
     other vegetables} => {root vegetables}    0.007930859  0.4020619 3.688692    78
[5] {tropical fruit,                                                                
     other vegetables} => {pip fruit}          0.009456024  0.2634561 3.482649    93
  • 按照條件搜尋規則

items %in% c(“A”, “B”)表示 lhs+rhs的項集並集中至少有一個item在c(“A”, “B”)中。
如果僅僅想搜尋lhs或者rhs,那麼用lhs或rhs替換items即可。如:lhs %in% c(“yogurt”)。
%in%是精確匹配
%pin%是部分匹配,也就是說只要item like ‘%A%’ or item like ‘%B%’
%ain%是完全匹配,也就是說itemset has ’A’ and itemset has ‘B’
同時可以通過條件運算子(&, |, !) 新增 support, confidence, lift的過濾條件。

> #按條件篩選關聯規則
> subsetrules <- subset(rules, subset = rhs %in% "whole milk" & lift >= 2)
> inspect(sort(subsetrules, by = "support")[1:5])
    lhs                             rhs          support    confidence lift     count
[1] {other vegetables,yogurt}    => {whole milk} 0.02226741 0.5128806  2.007235 219  
[2] {tropical fruit,yogurt}      => {whole milk} 0.01514997 0.5173611  2.024770 149  
[3] {root vegetables,yogurt}     => {whole milk} 0.01453991 0.5629921  2.203354 143  
[4] {pip fruit,other vegetables} => {whole milk} 0.01352313 0.5175097  2.025351 133  
[5] {root vegetables,rolls/buns} => {whole milk} 0.01270971 0.5230126  2.046888 125  
  • 檢視其它的quality measure

這裡一般用到另外兩種測度指標:
coverage:規則左邊的支援度,衡量規則應用的頻率。
chiSquared:卡方統計量,為了檢驗規則的lhs和rhs之間的獨立性。在α= 0.05時,具有1個自由度(2×2列聯表)的卡方分佈的臨界值是3.84;較高的卡方值表明lhs和rhs不是獨立的,也就是該值越大,表示關聯規則越可信。
還有很多種測度指標,具體可以看幫助?interestMeasure。

> #檢視其它的quality measure
> qualityMeasures <- interestMeasure(subsetrules, measure = c("coverage", "chiSquared"), transactions = Groceries)
> summary(qualityMeasures)
    coverage          chiSquared    
 Min.   :0.009964   Min.   : 43.35  
 1st Qu.:0.011845   1st Qu.: 60.16  
 Median :0.014642   Median : 73.63  
 Mean   :0.016264   Mean   : 77.80  
 3rd Qu.:0.017743   3rd Qu.: 91.90  
 Max.   :0.043416   Max.   :155.43  
> quality(subsetrules) <- cbind(quality(subsetrules), qualityMeasures)  #將coverage和chiSquared統計量加入到quality(subsetrules)中
> inspect(head(sort(subsetrules, by = "chiSquared")))
    lhs                                 rhs          support     confidence lift     count coverage  
[1] {other vegetables,yogurt}        => {whole milk} 0.022267412 0.5128806  2.007235 219   0.04341637
[2] {root vegetables,yogurt}         => {whole milk} 0.014539908 0.5629921  2.203354 143   0.02582613
[3] {butter,yogurt}                  => {whole milk} 0.009354347 0.6388889  2.500387  92   0.01464159
[4] {tropical fruit,root vegetables} => {whole milk} 0.011997966 0.5700483  2.230969 118   0.02104728
[5] {tropical fruit,yogurt}          => {whole milk} 0.015149975 0.5173611  2.024770 149   0.02928317
[6] {other vegetables,butter}        => {whole milk} 0.011489578 0.5736041  2.244885 113   0.02003050
    chiSquared
[1] 155.4279  
[2] 129.5825  
[3] 112.9113  
[4] 109.9678  
[5] 106.9339  
[6] 106.9239 

(4)將規則寫出

#寫出關聯規則
> write(subsetrules, file="subsetrules.csv", sep=",", quote=TRUE, row.names=FALSE)

說明:本文僅作學習使用。在R語言實戰部分大部分借鑑了博文R語言 | 關聯規則,在此感謝原作者,由於R語言視覺化部分還沒有深入瞭解,所以原文中的進階部分沒有深入探討,有需要的童鞋請看原文。

參考資料:
【1】資料探勘概念與技術
【2】R語言之Apriori演算法應用
【3】R語言 | 關聯規則

相關文章