zoukankan      html  css  js  c++  java
  • 【机器学习与R语言】10- 关联规则

    1.理解关联规则

    1)基本认识

    • 购物篮分析:用来判别事务型数据中商品之间关联的机器学习方法,在零售店之间广泛使用。
    • 购物篮分析的结果是一组指定商品之间关系模式的关联规则
    • 表现形式:{花生酱,果冻}——>{面包},即如果购买了花生酱和果冻,就很有可能购买面包。商品的集合称为项集。
    • 特点:无监督学习,不能预测,智能发现知识;不能衡量算法性能,只能定性地评估。
    • 其他应用场景:癌症种寻找DNA和蛋白质频繁出现的模式;信用卡欺诈和保险或医疗津贴的模式等。

    2)Apriori算法

    • Apriori:a priori,即事先
    • 事务型数据特点:一般很庞大,潜在的项集数量随着特征的数量呈指数增加。给定k个项,则有2^k个可能的项集必须用于规则的搜索。
    • 采用启发式算法来减少需要搜索的项集数,如广泛使用的Apriori算法,利用了一个简单的先验信念作为准则来减少关联规则的搜索空间(Apriori性质:一个频繁项集的所有子集必须也是频繁的)。

    image.png

    度量规则兴趣度:支持度和置信度

    • 支持度:一个项集或规则在数据中出现的频率。项集可以是多个项{A,B},也可是单个{A}。
      N是数据库中交易次数,count(X)是项集X的交易次数
    • 置信度:规则的预测能力或准确度度量,即表交易中项集X的出现导致项集Y出现的比例,和贝叶斯概率P(A|B)类似。
      同时包含项集X和Y的支持度与只包含项集X支持度之商

    用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的商品
    

    10%
    top20

    ③可视化稀疏矩阵(商品交易)
    矩阵中有黑色填充的,说明被购买了。大多数情况下,图形是比较随机的。
    对于超大型交易数据集不适合全部展示,这时可以对交易进行随机抽样并可视化。

    # 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))
    

    image.png

    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,则说明商品关联一起比单类商品购买更常见。
      提升率与置信度不同,与商品购买顺序无关,lift(X—>Y)和lift(Y—>X)一样
    • 需要注意一些平凡的规则和令人费解的规则(可能只是随机模式)
    ## 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])
    

    lift排序top5

    ②提取关联规则的子集
    假如只对某种商品和其他商品关联感兴趣,,如浆果berries,则可以提取包含berries的所有规则。

    # finding subsets of rules containing any berry items
    berryrules <- subset(groceryrules, items %in% "berries")
    inspect(berryrules)
    

    image.png

    ③将关联规则保存到文件或数据框中
    转化数据框使用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)
    

    image.png


    机器学习与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-如何提高模型的性能?

  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/jessepeng/p/13644841.html
Copyright © 2011-2022 走看看