首页IT科技python关联规则算法(利用python实现Apriori关联规则算法)

python关联规则算法(利用python实现Apriori关联规则算法)

时间2025-04-30 10:03:34分类IT科技浏览3306
导读:关联规则 大家可能听说过用于宣传数据挖掘的一个案例:啤酒和尿布;据说是沃尔玛超市在分析顾客的购买记录时,发现许多客户购买啤酒的同时也会购买婴儿尿布,于是超市调整了啤酒和尿布的货架摆放,让这两个品类摆放在一起;结果这两个品...

关联规则

        大家可能听说过用于宣传数据挖掘的一个案例:啤酒和尿布;据说是沃尔玛超市在分析顾客的购买记录时             ,发现许多客户购买啤酒的同时也会购买婴儿尿布                  ,于是超市调整了啤酒和尿布的货架摆放      ,让这两个品类摆放在一起;结果这两个品类的销量都有明显的增长;分析原因是很多刚生小孩的男士在购买的啤酒时          ,会顺手带一些婴幼儿用品            。

不论这个案例是否是真实的                  ,案例中分析顾客购买记录的方式就是关联规则分析法Association Rules                   。

关联规则分析也被称为购物篮分析         ,用于分析数据集各项之间的关联关系      。

关联规则基本概念

项集:item的集合       ,如集合{牛奶             、麦片                  、糖}是一个3项集                   ,可以认为是购买记录里物品的集合         。

频繁项集:顾名思义就是频繁出现的item项的集合                   。如何定义频繁呢?用比例来判定            ,关联规则中采用支持度和置信度两个概念来计算比例值

支持度:共同出现的项在整体项中的比例         。以购买记录为例子   ,购买记录100条                   ,如果商品A和B同时出现50条购买记录(即同时购买A和B的记录有50)               ,那边A和B这个2项集的支持度为50%

置信度:购买A后再购买B的条件概率,根据贝叶斯公式                ,可如下表示:

 提升度:为了判断产生规则的实际价值                  ,即使用规则后商品出现的次数是否高于商品单独出现的评率   ,提升度和衡量购买X对购买Y的概率的提升作用      。如下公式可见             ,如果X和Y相互独立那么提升度为1                  ,提升度越大      ,说明X->Y的关联性越强

关联规则Apriori算法

1. Apriori算法的基本思想

对数据集进行多次扫描          ,第一次扫描得到频繁1-项集的集合L1                  ,第k次扫描首先利用第k-1次扫描的结果Lk-1产生候选k-项集Ck         ,在扫描过程中计算Ck的支持度       ,在扫描结束后计算频繁k-项集Lk                   ,算法当候选k-项集的集合Ck为空的时候结束                   。

2. Apriori算法产生频繁项集的过程

(1)连接步

(2)剪枝步

3.Apriori算法的主要步骤

(1) 扫描全部数据            ,产生候选1-项集的集合C1

(2) 根据最小支持度   ,由候选1-项集的集合C1产生频繁1-项集的集合L1

(3) 对k>1                   ,重复步骤(4)(5)(6)

(4) 由Lk执行连接和剪枝操作               ,产生候选(k+1)-项集Ck+1

(5) 根据最小支持度,由候选(k+1)-项集的集合Ck+1产生频繁(k+1)-项集的集合Lk+1

(6) 若L不为空集                ,则k = k+1                  ,跳往步骤(4)   ,否则跳往步骤(7)

(7) 根据最小置信度             ,由频繁项集产生强关联规则

Apriori算法是经典的关联规则算法             。Apriori算法的目标是找到最大的K项频繁集   。Apriori算法从寻找1项集开始                  ,通过最小支持度阈值进行剪枝      ,依次寻找2项集          ,3项集直到没有更过项集为止                  。

代码实现 

本次算法实现我们借助了mlxtend第三方包                  ,pip install mlxtend安装一下即可

编译工具:jupyter notebook

首先导入本次项目用到的第三方包:

import pandas as pd from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules import warnings warnings.filterwarnings(ignore)

接下来我将使用两个小案例给大家示范如何使用关联规则算法

案例一

准备数据

order = {001: 面包         ,黄油       ,尿布                   ,啤酒, 002: 咖啡            ,糖   ,小甜饼                   ,鲑鱼               ,啤酒, 003: 面包,黄油                ,咖啡                  ,尿布   ,啤酒             ,鸡蛋, 004: 面包                  ,黄油      ,鲑鱼          ,鸡, 005: 鸡蛋                  ,面包         ,黄油, 006: 鲑鱼       ,尿布                   ,啤酒, 007: 面包            ,茶   ,糖鸡蛋, 008: 咖啡                   ,糖               ,鸡,鸡蛋, 009: 面包                ,尿布                  ,啤酒   ,盐, 010: 茶             ,鸡蛋                  ,小甜饼      ,尿布          ,啤酒} data_set = [] id_set= [] shopping_basket = {} for key in order: item = order[key].split(                  ,) id_set.append(key) data_set.append(item) shopping_basket[ID] = id_set shopping_basket[Basket] = data_set shopping_basket

将数据转换为DataFrame类型

data = pd.DataFrame(shopping_basket) data

接着我们需要将Basket的数据转换为one-hot(0         ,1)编码

这一步主要就是对数据的ID和Basket进行划分处理       ,最后进行合并

data_id = data.drop(Basket,1) data_basket = data[Basket].str.join(,) data_basket = data_basket.str.get_dummies(,) new_data = data_id.join(data_basket) new_data

 调用apriori算法

apriori()中min_support也就是最小支持度默认为0.5                   ,所以我们要修改的话直接修改这个值

frequent_itemsets = apriori(new_data.drop(ID,1),min_support=0.5,use_colnames=True) frequent_itemsets

 从结果中            ,我们发现在二项集中   ,出现了尿布和啤酒                   ,说明尿布和啤酒的关联性很大                。

接着我们查看其具体的关联规则

association_rules(frequent_itemsets,metric=lift)

我们看出尿布和啤酒的提升度值也很大(大于1)                ,更一步说明了尿布和啤酒的关联性很强,所有在销售的时候                ,应该将其放在一起售卖                  ,或者适当增加一下促销方式。

案例二

步骤跟案例一相似

准备数据

shopping_backet = {ID:[1,2,3,4,5,6], Basket:[[Beer,Diaper,Pretzels,Chips,Aspirin], [Diaper,Beer,Chips,Lotion,Juice,BabyFood,Milk], [Soda,Chips,Milk], [Soup,Beer,Diaper,Milk,IceCream], [Soda,Coffee,Milk,Bread], [Beer,Chips] ] } data = pd.DataFrame(shopping_backet) data

将数据转换为apriori算法要求的数据类型

data_id = data.drop(Basket,1) data_basket = data[Basket].str.join(,) data_basket = data_basket.str.get_dummies(,) new_data = data_id.join(data_basket) new_data

调用apriori算法

frequent_itemsets = apriori(new_data.drop(ID,1),min_support=0.5,use_colnames=True) frequent_itemsets

 如果光考虑support支持度   ,那么[Beer, Chips]和[Diaper, Beer]都是很频繁的             ,那么哪一种组合更相关呢?

association_rules(frequent_itemsets,metric=lift)

 显然[Diaper, Beer]的lift值更大                  ,说明这个组合更相关

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
Vue事件传递方式有冒泡和捕获,默认是冒泡(Vue:Vue事件整理) 为什么网站不被收录?(探究主要因素及补救方法)