1.理解關聯規則
1)基本認識
- 購物籃分析:用來判別事務型數據中商品之間關聯的機器學習方法,在零售店之間廣泛使用。
- 購物籃分析的結果是一組指定商品之間關系模式的關聯規則。
- 表現形式:{花生醬,果凍}——>{面包},即如果購買了花生醬和果凍,就很有可能購買面包。商品的集合稱為項集。
- 特點:無監督學習,不能預測,智能發現知識;不能衡量算法性能,只能定性地評估。
- 其他應用場景:癌症種尋找DNA和蛋白質頻繁出現的模式;信用卡欺詐和保險或醫療津貼的模式等。
2)Apriori算法
- Apriori:a priori,即事先
- 事務型數據特點:一般很龐大,潛在的項集數量隨着特征的數量呈指數增加。給定k個項,則有2^k個可能的項集必須用於規則的搜索。
- 采用啟發式算法來減少需要搜索的項集數,如廣泛使用的Apriori算法,利用了一個簡單的先驗信念作為准則來減少關聯規則的搜索空間(Apriori性質:一個頻繁項集的所有子集必須也是頻繁的)。
度量規則興趣度:支持度和置信度
- 支持度:一個項集或規則在數據中出現的頻率。項集可以是多個項{A,B},也可是單個{A}。
- 置信度:規則的預測能力或准確度度量,即表交易中項集X的出現導致項集Y出現的比例,和貝葉斯概率P(A|B)類似。
用Apriori性質建立規則
- 如果{A,B}是頻繁的,那么{A}和{B}必須是頻繁的。通過Apriori算法可提前排除潛在的關聯規則。
- 過程:一是通過多次迭代-停止的過程來識別所有滿足最小支持度閾值的項集;二是根據滿足最小置信度閾值的這些項集來創建規則。
2.關聯規則應用示例
用關聯規則確定經常一起購買的食品雜貨
1)收集數據
來自某超市經營一個月的購物數據,包含9835次交易,大約每天327次交易。不考慮品牌,將食品雜貨數量歸為169個類型,探究哪種類型的商品有可能一起購買。
數據下載:
鏈接: https://pan.baidu.com/s/11xTz8xkJxXTuj0hc5THTZA 提取碼: s5pr
2)探索和准備數據
不同於矩陣,事務型數據形式更自由,每一行為案例(一次交易),每條記錄包括用逗號隔開的任意數量的產品清單,一至多個。也就是說案例之間的特征可能是不同的。
①為交易數據創建一個稀疏矩陣
傳統的數據框一旦增加額外的交易和商品,會變得過大而導致內存不足,因此用稀疏矩陣(購買了該單元格為1,否則為0,169列商品大部分單元為0)在內存中沒有存儲完整的矩陣,只是存儲了由一個商品所占用的單元。
使用arules包中的read.transactions函數創建事務型數據的稀疏矩陣。
## 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的商品
③可視化稀疏矩陣(商品交易)
矩陣中有黑色填充的,說明被購買了。大多數情況下,圖形是比較隨機的。
對於超大型交易數據集不適合全部展示,這時可以對交易進行隨機抽樣並可視化。
# 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函數很簡單,但要找到支持度和置信度參數來產生合理數量的關聯規則,需要大量的試驗和誤差評估。參數閾值設置太高,可能沒有規則或規則太普通,太低則可能導致規則數量龐大,耗時耗內存。
訓練模型函數說明:
#找出關聯規則
myrules=arules::apriori(data,
parameter = list(
support = 0.1, #最低支持度
confidence = 0.8, #最低置信度
minlen = 1)) #最低項數
# 檢驗關聯規則
inspect(myrules)
- 支持度的閾值設置:考慮規則之前,事先想好需要最小的交易數量,如某商品一天購買2次(一月約60次)時可考慮建立規則,則支持度設為60/9835=0.006。
- 置信度的閾值設置:涉及一個巧妙的平衡。絕大部分取決於分析目標,如從保守值開始,若無可行性規則,再降低要求拓寬范圍。
- minlen設定為2有助於消除包含少於兩類商品的規則,防止僅僅是由於某商品被頻繁購買而創建的無趣規則。
## 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)評估性能
- 規則的大小:前項(條件項/左項,lhs)和后項(結果項/右項,rhs)之和,如{peanut butter, jully}=>{bread}的大小為2+1=3.
- 度量規則質量的統計量:支持度(support),置信度(confidence)和提升度(lift)。提升率是指一類商品相對於它的一般購買率,被購買的可能性有多大。若lift大於1,則說明商品關聯一起比單類商品購買更常見。
- 需要注意一些平凡的規則和令人費解的規則(可能只是隨機模式)
## Step 4: Evaluating model performance ----
# summary of grocery association rules
summary(groceryrules)
# look at the first three rules
inspect(groceryrules[1:3])
5)提高模型性能
①對關聯規則集合排序
最有用的規則或許是那些具有最高支持度、置信度和提升度的規則,所以對其進行排序來尋找感興趣的規則。
# sorting grocery rules by lift
inspect(sort(groceryrules, by = "lift")[1:5])
②提取關聯規則的子集
假如只對某種商品和其他商品關聯感興趣,,如漿果berries,則可以提取包含berries的所有規則。
# finding subsets of rules containing any berry items
berryrules <- subset(groceryrules, items %in% "berries")
inspect(berryrules)
③將關聯規則保存到文件或數據框中
轉化數據框使用as函數。
# 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)
機器學習與R語言系列推文匯總:
【機器學習與R語言】1-機器學習簡介
【機器學習與R語言】2-K近鄰(kNN)
【機器學習與R語言】3-朴素貝葉斯(NB)
【機器學習與R語言】4-決策樹
【機器學習與R語言】5-規則學習
【機器學習與R語言】6-線性回歸
【機器學習與R語言】7-回歸樹和模型樹
【機器學習與R語言】8-神經網絡
【機器學習與R語言】9-支持向量機
【機器學習與R語言】10-關聯規則
【機器學習與R語言】11-Kmeans聚類
【機器學習與R語言】12-如何評估模型的性能?
【機器學習與R語言】13-如何提高模型的性能?