1.理解關(guān)聯(lián)規(guī)則
1)基本認識
- 購物籃分析:用來判別事務型數(shù)據(jù)中商品之間關(guān)聯(lián)的機器學習方法肢专,在零售店之間廣泛使用本姥。
- 購物籃分析的結(jié)果是一組指定商品之間關(guān)系模式的關(guān)聯(lián)規(guī)則肩袍。
- 表現(xiàn)形式:{花生醬,果凍}——>{面包}婚惫,即如果購買了花生醬和果凍氛赐,就很有可能購買面包。商品的集合稱為項集先舷。
- 特點:無監(jiān)督學習艰管,不能預測,智能發(fā)現(xiàn)知識密浑;不能衡量算法性能蛙婴,只能定性地評估。
- 其他應用場景:癌癥種尋找DNA和蛋白質(zhì)頻繁出現(xiàn)的模式尔破;信用卡欺詐和保險或醫(yī)療津貼的模式等街图。
2)Apriori算法
- Apriori:a priori,即事先
- 事務型數(shù)據(jù)特點:一般很龐大懒构,潛在的項集數(shù)量隨著特征的數(shù)量呈指數(shù)增加餐济。給定k個項,則有2^k個可能的項集必須用于規(guī)則的搜索胆剧。
- 采用啟發(fā)式算法來減少需要搜索的項集數(shù)絮姆,如廣泛使用的Apriori算法,利用了一個簡單的先驗信念作為準則來減少關(guān)聯(lián)規(guī)則的搜索空間(Apriori性質(zhì):一個頻繁項集的所有子集必須也是頻繁的)秩霍。
度量規(guī)則興趣度:支持度和置信度
-
支持度:一個項集或規(guī)則在數(shù)據(jù)中出現(xiàn)的頻率篙悯。項集可以是多個項{A,B},也可是單個{A}铃绒。
-
置信度:規(guī)則的預測能力或準確度度量,即表交易中項集X的出現(xiàn)導致項集Y出現(xiàn)的比例颠悬,和貝葉斯概率P(A|B)類似矮燎。
用Apriori性質(zhì)建立規(guī)則
- 如果{A,B}是頻繁的定血,那么{A}和{B}必須是頻繁的。通過Apriori算法可提前排除潛在的關(guān)聯(lián)規(guī)則诞外。
- 過程:一是通過多次迭代-停止的過程來識別所有滿足最小支持度閾值的項集澜沟;二是根據(jù)滿足最小置信度閾值的這些項集來創(chuàng)建規(guī)則。
2.關(guān)聯(lián)規(guī)則應用示例
用關(guān)聯(lián)規(guī)則確定經(jīng)常一起購買的食品雜貨
1)收集數(shù)據(jù)
來自某超市經(jīng)營一個月的購物數(shù)據(jù)峡谊,包含9835次交易茫虽,大約每天327次交易。不考慮品牌靖苇,將食品雜貨數(shù)量歸為169個類型席噩,探究哪種類型的商品有可能一起購買。
數(shù)據(jù)下載:
鏈接: https://pan.baidu.com/s/11xTz8xkJxXTuj0hc5THTZA 提取碼: s5pr
2)探索和準備數(shù)據(jù)
不同于矩陣贤壁,事務型數(shù)據(jù)形式更自由悼枢,每一行為案例(一次交易),每條記錄包括用逗號隔開的任意數(shù)量的產(chǎn)品清單脾拆,一至多個馒索。也就是說案例之間的特征可能是不同的。
①為交易數(shù)據(jù)創(chuàng)建一個稀疏矩陣
傳統(tǒng)的數(shù)據(jù)框一旦增加額外的交易和商品名船,會變得過大而導致內(nèi)存不足绰上,因此用稀疏矩陣(購買了該單元格為1,否則為0渠驼,169列商品大部分單元為0)在內(nèi)存中沒有存儲完整的矩陣蜈块,只是存儲了由一個商品所占用的單元。
使用arules包中的read.transactions函數(shù)創(chuàng)建事務型數(shù)據(jù)的稀疏矩陣迷扇。
## Example: Identifying Frequently-Purchased Groceries ----
## Step 2: Exploring and preparing the data ----
# load the grocery data into a sparse matrix
library(arules)
groceries <- read.transactions("groceries.csv", sep = ",")
summary(groceries)
# look at the first five transactions
inspect(groceries[1:5])
# examine the frequency of items
itemFrequency(groceries[, 1:3])
②可視化商品的支持度(商品頻率)
# plot the frequency of items
itemFrequencyPlot(groceries, support = 0.1) #支持度至少10%
itemFrequencyPlot(groceries, topN = 20) #支持度前20的商品
③可視化稀疏矩陣(商品交易)
矩陣中有黑色填充的百揭,說明被購買了。大多數(shù)情況下蜓席,圖形是比較隨機的器一。
對于超大型交易數(shù)據(jù)集不適合全部展示,這時可以對交易進行隨機抽樣并可視化厨内。
# a visualization of the sparse matrix for the first five transactions
image(groceries[1:5])
# visualization of a random sample of 100 transactions
image(sample(groceries, 100))
3)訓練模型
apriori函數(shù)很簡單祈秕,但要找到支持度和置信度參數(shù)來產(chǎn)生合理數(shù)量的關(guān)聯(lián)規(guī)則,需要大量的試驗和誤差評估雏胃。參數(shù)閾值設置太高请毛,可能沒有規(guī)則或規(guī)則太普通,太低則可能導致規(guī)則數(shù)量龐大瞭亮,耗時耗內(nèi)存获印。
訓練模型函數(shù)說明:
#找出關(guān)聯(lián)規(guī)則
myrules=arules::apriori(data,
parameter = list(
support = 0.1, #最低支持度
confidence = 0.8, #最低置信度
minlen = 1)) #最低項數(shù)
# 檢驗關(guān)聯(lián)規(guī)則
inspect(myrules)
- 支持度的閾值設置:考慮規(guī)則之前,事先想好需要最小的交易數(shù)量,如某商品一天購買2次(一月約60次)時可考慮建立規(guī)則兼丰,則支持度設為60/9835=0.006。
- 置信度的閾值設置:涉及一個巧妙的平衡唆缴。絕大部分取決于分析目標鳍征,如從保守值開始,若無可行性規(guī)則面徽,再降低要求拓寬范圍艳丛。
- minlen設定為2有助于消除包含少于兩類商品的規(guī)則,防止僅僅是由于某商品被頻繁購買而創(chuàng)建的無趣規(guī)則趟紊。
## Step 3: Training a model on the data ----
library(arules)
# default settings result in zero rules learned
apriori(groceries)
# set better support and confidence levels to learn more rules
groceryrules <- apriori(groceries, parameter = list(support =
0.006, confidence = 0.25, minlen = 2))
groceryrules
4)評估性能
- 規(guī)則的大械:前項(條件項/左項,lhs)和后項(結(jié)果項/右項霎匈,rhs)之和戴差,如{peanut butter, jully}=>{bread}的大小為2+1=3.
-
度量規(guī)則質(zhì)量的統(tǒng)計量:支持度(support),置信度(confidence)和提升度(lift)铛嘱。提升率是指一類商品相對于它的一般購買率暖释,被購買的可能性有多大。若lift大于1墨吓,則說明商品關(guān)聯(lián)一起比單類商品購買更常見球匕。
- 需要注意一些平凡的規(guī)則和令人費解的規(guī)則(可能只是隨機模式)
## Step 4: Evaluating model performance ----
# summary of grocery association rules
summary(groceryrules)
# look at the first three rules
inspect(groceryrules[1:3])
5)提高模型性能
①對關(guān)聯(lián)規(guī)則集合排序
最有用的規(guī)則或許是那些具有最高支持度亮曹、置信度和提升度的規(guī)則,所以對其進行排序來尋找感興趣的規(guī)則秘症。
# sorting grocery rules by lift
inspect(sort(groceryrules, by = "lift")[1:5])
②提取關(guān)聯(lián)規(guī)則的子集
假如只對某種商品和其他商品關(guān)聯(lián)感興趣照卦,,如漿果berries历极,則可以提取包含berries的所有規(guī)則窄瘟。
# finding subsets of rules containing any berry items
berryrules <- subset(groceryrules, items %in% "berries")
inspect(berryrules)
③將關(guān)聯(lián)規(guī)則保存到文件或數(shù)據(jù)框中
轉(zhuǎn)化數(shù)據(jù)框使用as函數(shù)。
# writing the rules to a CSV file
write(groceryrules, file = "groceryrules.csv",
sep = ",", quote = TRUE, row.names = FALSE)
# converting the rule set to a data frame
groceryrules_df <- as(groceryrules, "data.frame")
str(groceryrules_df)