1. 程式人生 > 實用技巧 >【機器學習與R語言】10- 關聯規則

【機器學習與R語言】10- 關聯規則

目錄

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)