R語言之Apriori算法應用
一. 概念
關聯(lián)分析用于發(fā)現(xiàn)隱藏在大型數(shù)據(jù)集中的有意義的聯(lián)系。所發(fā)現(xiàn)的聯(lián)系可以用關聯(lián)規(guī)則(association rule)或頻繁項集的形式表示。
項集:在關聯(lián)分析中,包含0個或多個項的集合被稱為項集(itemset)。如果一個項集包含k個項,則稱它為k-項集。例如:{啤酒,尿布,牛奶,花生} 是一個4-項集??占侵覆话魏雾椀捻椉?。
關聯(lián)規(guī)則(association rule):是形如 X → Y 的蘊含表達式,其中X和Y是不相交的項集,即:X∩Y=∅。關聯(lián)規(guī)則的強度可以用它的支持度(support)和置信度(confidence)來度量。
支持度:一個項集或者規(guī)則在所有事物中出現(xiàn)的頻率,確定規(guī)則可以用于給定數(shù)據(jù)集的頻繁程度。σ(X):表示項集X的支持度計數(shù)
項集X的支持度:s(X)=σ(X)/N;規(guī)則X → Y的支持度:s(X → Y) = σ(X∪Y) / N
置信度:確定Y在包含X的事務中出現(xiàn)的頻繁程度。c(X → Y) = σ(X∪Y)/σ(X)
支持度是一種重要的度量,因為支持度很低的規(guī)則可能只是偶然出現(xiàn),低支持度的規(guī)則多半也是無意義的。因此,支持度通常用來刪去那些無意義的規(guī)則;
置信度度量是通過規(guī)則進行推理具有可靠性。對于給定的規(guī)則X → Y,置信度越高,Y在包含X的事物中出現(xiàn)的可能性就越大。即Y在給定X下的條件概率P(Y|X)越大。
二. R語言中實現(xiàn)Apriori算法應用
R語言中的Apriori算法實現(xiàn)包含在arules包中,本文不涉及算法的實現(xiàn),只是應用arules該包實現(xiàn)關聯(lián)規(guī)則的挖掘。
1.數(shù)據(jù)源:利用arules包中自帶的Groceries數(shù)據(jù)集,該數(shù)據(jù)集是來自一個現(xiàn)實世界中的超市經(jīng)營一個月的購物數(shù)據(jù),包含了9835次交易。我們按照超市一天12個小時的工作時間計算,大約每小時的交易次數(shù)為9835/30/12=27.3,表明該超市規(guī)模屬于中等。
- > library(arules) #加載 arules 包
- > data(Groceries)
- > Groceries
- transactions in sparse format with
- 9835 transactions (rows) and
- 169 items (columns)
2.探索和準備數(shù)據(jù):
(1)事務型數(shù)據(jù)每一行指定一個單一的實例,每條記錄包括用逗號隔開的任意數(shù)量的產(chǎn)品清單,通過inspect()函數(shù)可以看到超市的交易記錄,每次交易的商品名稱;通過summary()函數(shù)可以查看該數(shù)據(jù)集的一些基本 信息。
- > inspect(Groceries[1:5]) #通過inspect函數(shù)查看Groceries數(shù)據(jù)集的前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}
- <br>> 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 (Other)
- 2513 1903 1809 1715 1372 34055
- element (itemset/transaction) length distribution:
- sizes
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 29
- 2159 1643 1299 1005 855 645 545 438 350 246 182 117 78 77 55 46 29 14 14 9 11 4 6 1 1 1 1 3
- 32
- 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
- > itemFrequency(Groceries[,1:3]) #itemFrequency()函數(shù)可以查看商品的交易比例<br>frankfurter sausage liver loaf <br>0.058973055 0.093950178 0.005083884
分析:
①密度值0.02609146(2.6%)指的是非零矩陣單元格的比例。
該數(shù)據(jù)集一共有9835行(交易記錄),169列(所有交易的商品種類),因此,矩陣中共有9835*169=1662115個位置,我們可以得出,在30天內(nèi)共有1662115*0.02609146=43367件商品被購買。進一步可以得出在每次交易中包含了43367/9835=4.409件商品被購買,在均值那一列可以看出(Mean=4.409)我們的計算是正確的;
②most frequent items:列出了事務型數(shù)據(jù)中最常購買的商品。whole milk 在9835次交易中被購買了2513次,因此,我們可以得出結論:whole milk有2513/9835=25.6%的概率出現(xiàn)在所有的交易中;
③element (itemset/transaction) length distribution:呈現(xiàn)了一組關于交易規(guī)模的統(tǒng)計,總共有2159次交易中包含一件商品,有1次交易中包含了32件商品.從分位數(shù)分布情況可以看出,25%的交易中包含了兩件或者更少的商品,大約一半的交易中商品數(shù)量為3件;
(2)可視化商品的支持度——商品的頻率圖
為了直觀地呈現(xiàn)統(tǒng)計數(shù)據(jù),可以使用itemFrequenctyPlot()函數(shù)生成一個用于描繪所包含的特定商品的交易比例的柱狀圖。因為包含很多種商品,不可能同時展現(xiàn)出來,因此可以通過support或者topN參數(shù)進行排除一部分商品進行展示
(3)可視化交易數(shù)據(jù)——繪制稀疏矩陣
通過使用image()函數(shù)可以可視化整個稀疏矩陣。
- image(Groceries[1:5]) # 生成一個5行169列的矩陣,矩陣中填充有黑色的單元表示在此次交易(行)中,該商品(列)被購買了
從上圖可以看出,***行記錄(交易)包含了四種商品(黑色的方塊),這種可視化的圖是用于數(shù)據(jù)探索的一種很有用的工具。它可能有助于識別潛在的數(shù)據(jù)問題,比如:由于列表示的是商品名稱,如果列從上往下一直被填充表明這個商品在每一次交易中都被購買了;另一方面,圖中的模式可能有助于揭示交易或者商品的有趣部分,特別是當數(shù)據(jù)以有趣的方式排序后,比如,如果交易按照日期進行排序,那么黑色方塊圖案可能會揭示人們購買商品的數(shù)量或者類型受季節(jié)性的影響。這種可視化對于超大型的交易數(shù)據(jù)集是沒有意義的,因為單元太小會很難發(fā)現(xiàn)有趣的模式。
3.訓練模型
- grocery_rules <- apriori(data=Groceries,parameter=list(support =,confidence =,minlen =))
運行apriori()函數(shù)很簡單,但是找到支持度和置信度參數(shù)來產(chǎn)生合理數(shù)量的關聯(lián)規(guī)則時,可能需要進行大量的試驗與誤差評估。
如果參數(shù)設置過高,那么結果可能是沒有規(guī)則或者規(guī)則過于普通而不是非常有用的規(guī)則;另一方面如果閾值太低,可能會導致規(guī)則數(shù)量很多,甚至需要運行很長的時間或者在學習階段耗盡內(nèi)存。
aprior()函數(shù)默認設置 support = 0.1 和 confidence = 0.8,然而使用默認的設置,不能得到任何規(guī)則
- > apriori(Groceries)
- set of 0 rules # 因為support = 0.1,則意味著該商品必須至少出現(xiàn)在 0.1 * 9835 = 983.5次交易中,在前面的分析中,我們發(fā)現(xiàn)只有8種商品的 support >= 0.1,因此使用默認的設置沒有產(chǎn)生任何規(guī)則也不足為奇
解決支持度設定問題的一種方法是考慮一個有趣的模式之前,事先想好需要的最小交易數(shù)量,例如:我們可以認為如果一種商品一天被購買了2次,一個月也就是60次交易記錄,這或許是我們所感興趣的,據(jù)此,可以計算所需要的支持度support=60/9835=0.006;
關于置信度:設置太低,可能會被大量不可靠的規(guī)則淹沒,設置過高,可能會出現(xiàn)很多顯而易見的規(guī)則致使我們不能發(fā)現(xiàn)有趣的模式;一個合適的置信度水平的選取,取決于我們的分析目標,我們可以嘗試以一個保守的值開始,如果發(fā)現(xiàn)沒有具有可行性的規(guī)則,可以降低置信度以拓寬規(guī)則的搜索范圍。
在此例中,我們將從置信度0.25開始,這意味著為了將規(guī)則包含在結果中,此時規(guī)則的正確率至少為25%,這將排除最不可靠的規(guī)則
minlen = 2 表示規(guī)則中至少包含兩種商品,這可以防止僅僅是由于某種商品被頻繁購買而創(chuàng)建的無用規(guī)則,比如在上面的分析中,我們發(fā)現(xiàn)whole milk出現(xiàn)的概率(支持度)為25.6%,很可能出現(xiàn)如下規(guī)則:{}=>whole milk,這種規(guī)則是沒有意義的。
最終,根據(jù)上面的分析我們確定如下參數(shù)設置:
- > grocery_rules <- apriori(data = Groceries,parameter = list(support = 0.006,confidence = 0.25,minlen = 2))
- > grocery_rules
- set of 463 rules
4.評估模型的性能
- > summary(grocery_rules)
- set of 463 rules
- rule length distribution (lhs + rhs):sizes # 前件+后件 的規(guī)則長度分布
- 2 3 4
- 150 297 16 #有150個規(guī)則只包含2種商品,297個規(guī)則包含3種商品,16個規(guī)則包含4種商品
- 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
- Min. :0.006101 Min. :0.2500 Min. :0.9932
- 1st Qu.:0.007117 1st Qu.:0.2971 1st Qu.:1.6229
- Median :0.008744 Median :0.3554 Median :1.9332
- Mean :0.011539 Mean :0.3786 Mean :2.0351
- 3rd Qu.:0.012303 3rd Qu.:0.4495 3rd Qu.:2.3565
- Max. :0.074835 Max. :0.6600 Max. :3.9565
- mining info:
- data ntransactions support confidence
- Groceries 9835 0.006 0.25
- <br>> inspect(grocery_rules[1:5])
- lhs rhs support confidence lift
- 1 {pot plants} => {whole milk} 0.006914082 0.4000000 1.565460
- 2 {pasta} => {whole milk} 0.006100661 0.4054054 1.586614
- 3 {herbs} => {root vegetables} 0.007015760 0.4312500 3.956477
- 4 {herbs} => {other vegetables} 0.007727504 0.4750000 2.454874
- 5 {herbs} => {whole milk} 0.007727504 0.4750000 1.858983
這里需要解釋一下lift(提升度),表示用來度量一類商品相對于它的一般購買率,此時被購買的可能性有多大。通俗的講就是:比如***條規(guī)則{pot plants} => {whole milk},lift = 1.565,表明(購買pot plants 之后再購買 whole milk商品的可能性) 是 (沒有購買pot plants 但是購買了whole milk 的可能性) 的 1.565倍;
***條規(guī)則解讀:如果一個顧客購買了pot plants,那么他還會購買whole milk,支持度support為0.0070,置信度confidence為0.4000,我們可以確定該規(guī)則涵蓋了大約0.7%的交易,而且在購買了pot plants后,他購買whole milk的概率為40%,提升度lift值為1.565,表明他相對于一般沒有購買pot plant商品的顧客購買whole milk商品的概率提升了1.565倍,我們在上面的分析中知道,有25.6%的顧客購買了whole milk,因此計算提升度為0.40/0.256=1.56,這與顯示的結果是一致的,注意:標有support的列表示規(guī)則的支持度,而不是前件(lhs)或者后件(rhs)的支持度。
提升度 lift(X → Y) = P (Y| X) / P (Y) , lift(X → Y) 與 lift(Y → X) 是相同的。
如果lift值>1,說明這兩類商品在一起購買比只有一類商品被購買更常見。一個大的提升度值是一個重要的指標,它表明一個規(guī)則時很重要的,并反映了商品之間的真實聯(lián)系。
5.提高模型的性能
(1)對關聯(lián)規(guī)則集合排序
根據(jù)購物籃分析的目標,最有用的規(guī)則或許是那些具有高支持度、信度和提升度的規(guī)則。arules包中包含一個sort()函數(shù),通過指定參數(shù)by為"support","confidence"或者"lift"對規(guī)則列表進行重新排序。 在默認的情況下,排序是降序排列,可以指定參數(shù)decreasing=FALSE反轉排序方式。
- > inspect(sort(grocery_rules,by="lift")[1:10])
- lhs rhs support confidence lift
- 3 {herbs} => {root vegetables} 0.007015760 0.4312500 3.956477
- 57 {berries} => {whipped/sour cream} 0.009049314 0.2721713 3.796886
- 450 {tropical fruit,other vegetables,whole milk} => {root vegetables} 0.007015760 0.4107143 3.768074
- 174 {beef,other vegetables} => {root vegetables} 0.007930859 0.4020619 3.688692
- 285 {tropical fruit,other vegetables} => {pip fruit} 0.009456024 0.2634561 3.482649
- 176 {beef,whole milk} => {root vegetables} 0.008032537 0.3779904 3.467851
- 284 {pip fruit,other vegetables} => {tropical fruit} 0.009456024 0.3618677 3.448613
- 282 {pip fruit,yogurt} => {tropical fruit} 0.006405694 0.3559322 3.392048
- 319 {citrus fruit,other vegetables} => {root vegetables} 0.010371124 0.3591549 3.295045
- 455 {other vegetables,whole milk,yogurt} => {tropical fruit} 0.007625826 0.3424658 3.263712
(2)提取關聯(lián)規(guī)則的子集:可以通過subset()函數(shù)提取我們感興趣的規(guī)則
- > fruit_rules <- subset(grocery_rules,items %in% "pip fruit") # items 表明與出現(xiàn)在規(guī)則的任何位置的項進行匹配,為了將子集限制到匹配只發(fā)生在左側或者右側位置上,可以使用lhs或者rhs代替
- > fruit_rules
- set of 21 rules
- > inspect(fruit_rules[1:5])
- lhs rhs support confidence lift
- 127 {pip fruit} => {tropical fruit} 0.020437214 0.2701613 2.574648
- 128 {pip fruit} => {other vegetables} 0.026131164 0.3454301 1.785237
- 129 {pip fruit} => {whole milk} 0.030096594 0.3978495 1.557043
- 281 {tropical fruit,pip fruit} => {yogurt} 0.006405694 0.3134328 2.246802
- 282 {pip fruit,yogurt} => {tropical fruit} 0.006405694 0.3559322 3.392048
以上,就是應用R語言添加包arules中實現(xiàn)的apriori算法進行的關聯(lián)規(guī)則挖掘的應用,歡迎大家進行交流!