【推荐系统入门到项目实战】:关联规则之Apriori算法(含代码实现(4)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

关联规则

1.基础知识

关联规则学习的官方定义(英语:Association rule learning)是一种在大型数据库中发现变量之间的有趣性关系的方法。它的目的是利用一些有趣性的量度来识别数据库中发现的强规则。基于强规则的概念,Rakesh Agrawal等人引入了关联规则以发现由超市的POS系统记录的大批交易数据中产品之间的规律性。例如,从销售数据中发现的规则 {洋葱, 土豆}→{汉堡} 会表明如果顾客一起买洋葱和土豆,他们也有可能买汉堡的肉。此类信息可以作为做出促销定价或产品植入等营销活动决定的根据。除了上面购物篮分析(英语:market basket analysis)中的例子以外, 关联规则如今还被用在许多应用领域中,包括网络用法挖掘(英语:Web usage mining)、入侵检测连续生产(英语:Continuous production)及生物信息学中。与序列挖掘(英语:sequence mining)相比,关联规则学习通常不考虑在事务中、或事务间的项目的顺序。—— 维基百科

直观来看关联规则挖掘可以让我们从数据集中发现项与项(item 与 item)之间的关系。解释了:如果一个消费者购买了产品A,那么他有多大几率会购买产品B?我们来看一个案例。

关联规则(Association Rules)

在关联规则最经典的例子不得不提到啤酒和尿布。

在上个世纪90年代沃尔玛在分析销售记录时,发现啤酒和尿布经常一起被购买,于是他们调整了货架,把两者放在一起,结果真的提升了啤酒的销量。但是这是为什么呢?

原因解释:爸爸在给宝宝买尿布的时候,会顺便给自己买点啤酒?

沃尔玛是最早通过大数据分析而受益的传统零售企业,对消费者购物行为进行跟踪和分析。

下面我们来看看如何进行关联规则的分析,首先我们要了解三个概念:支持度、置信度和提升度

1.1支持度

支持度: 首先是个百分比值,指的是某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合(可以是单个商品)出现的频率越大。这里是一个先验概率。我们来看一个例子

订单编号购买的商品
1牛奶、面包、尿布
2可乐、面包、尿布、啤酒
3牛奶、尿布、啤酒、鸡蛋
4面包、牛奶、尿布、啤酒
5面包、牛奶、尿布、可乐

“牛奶” 的支持度=4/5=0.8,出现在了(1,3,4,5中)

“牛奶+面包” 的支持度=3/5=0.6。

从概率的角度来看,这就是一个先验概率。P(A)

1.2置信度

置信度:首先是个条件概率。指的是当你购买了商品A,会有多大的概率购买商品B

订单编号购买的商品
1牛奶、面包、尿布
2可乐、面包、尿布、啤酒
3牛奶、尿布、啤酒、鸡蛋
4面包、牛奶、尿布、啤酒
5面包、牛奶、尿布、可乐

置信度(牛奶→啤酒)=2/4=0.5(买了牛奶会买啤酒的概率)

置信度(啤酒→牛奶)=2/3=0.67

从概率的角度来看,等价于

P

(

B

A

)

P(B|A)

P(B∣A)

下面我们再来看一下,置信度(可乐→尿布)=2/2=1 ,虽然此时置信度是1,但是我们发现5个订单全部都有尿布,因此这个时候用置信度来看是不够全面的。我们还需要看其他的指标.

1.3提升度

提升度: 商品A的出现,对商品B的出现概率提升的程度

提升度(A→B)=置信度(A→B)/支持度(B)

提升度的三种可能:

提升度(A→B)>1: 代表有提升;

提升度(A→B)=1: 代表有没有提升,也没有下降

提升度(A→B)<1: 代表有下降。

从概率的角度来看,等价于一个条件概率与先验概率的比值。

P

(

B

A

)

P

(

B

)

\frac{P(B|A)}{P(B)}

P(B)P(B∣A)​

现在,我们来看看具体的关联规则算法。关联规则最经典的算法有两个

  • Apriori
  • FP-Grouth算法

2.Apriori算法

我们把上面案例中的商品用ID来代表,牛奶、面包、尿布、可乐、啤酒、鸡蛋的商品ID分别设置为1-6

Apriori算法就是查找**频繁项集(frequent itemset)**的过程。

什么样的数据才是频繁项集呢?从名字上来看就是出现次数多的集合,没错,但是上面算次数多呢?这里我们给出频繁项集的定义

**频繁项集:**支持度大于等于最小支持度(Min Support)阈值的项集。

非频繁项集:支持度小于最小支持度的项集

在这里使用label-encoder得到下表

订单编号购买的商品
11、2、3
24、2、3、5
31、3、5、6
42、1、3、5
52、1、3、4

先计算K=1项的支持度

商品项集支持度
14/5
24/5
35/5
42/5
53/5
61/5

假设最小支持度=0.5,那么Item4和6不符合最小支持度的,不属于频繁项集

在这个基础上,我们将商品进行组合,得到k=2项的支持度

商品项集支持度
1,23/5
1,34/5
1,51/5
2,34/5
2,52/5
3,53/5

此时只剩下将商品进行K=3项的商品组合,可以得到:

商品项集支持度
1,2,33/5
2,3,52/5
1,2,51/5

筛选掉小于最小值支持度的商品组合。得到K=3项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。

2.1基本步骤

Apriori算法的流程:

  • 1.加载数据集,创建集合
  • 2.计算K=1时,计算k项集的支持度
  • 3.筛选掉小于最小支持度的项集
  • 4.如果项集为空,则对应K-1项集的结果为最终结果。
  • 否则K=K+1,重复2-4步。
2.2代码实现如下
#!pip install efficient\_apriori 安装库
from efficient_apriori import apriori
# 设置数据集
transactions = [('牛奶','面包','尿布'),
		('可乐','面包', '尿布', '啤酒'),
		('牛奶','尿布', '啤酒', '鸡蛋'),
		('面包', '牛奶', '尿布', '啤酒'),
		('面包', '牛奶', '尿布', '可乐')]
# 挖掘频繁项集和频繁规则
itemsets, rules = apriori(transactions, min_support=0.5,  min_confidence=1)#设置最小支持度为0.5,最小置信度为1
print("频繁项集:", itemsets)
print("关联规则:", rules)

频繁项集: {1: {('牛奶',): 4, ('面包',): 4, ('尿布',): 5, ('啤酒',): 3}, 2: {('啤酒', '尿布'): 3, ('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3}, 3: {('尿布', '牛奶', '面包'): 3}}
关联规则: [{啤酒} -> {尿布}, {牛奶} -> {尿布}, {面包} -> {尿布}, {牛奶, 面包} -> {尿布}]

3.关联分析的使用场景

万物皆Transaction:

  • 超市购物小票(TransactionID => Item)
  • 每部电影的分类(MovieID => 分类)
  • 每部电影的演员(MovieID => 演员)

这里我们来举几个简单的实际案例进行分析。

3.1超市购物小票的关联关系

BreadBasket数据集(21293笔订单)https://www.kaggle.com/datasets/sulmansarwar/transactions-from-a-bakery?select=BreadBasket_DMS.csv

  • BreadBasket_DMS.csv
  • 字段:Date(日期),Time(时间),Transaction(交易ID)Item(商品名称)
  • 交易ID的范围是[1,9684],存在交易ID为空的情况,同一笔交易中存在商品重复的情况。以外,有些交易没有购买商品(对应的Item为NONE)
import pandas as pd
# 数据加载
data = pd.read_csv('BreadBasket/BreadBasket\_DMS.csv')
# 统一小写
data['Item'] = data['Item'].str.lower()
# 去掉none项
data = data.drop(data[data.Item == 'none'].index)
# 采用efficient\_apriori工具包
def rule():
	from efficient_apriori import apriori
	# 得到一维数组orders\_series,并且将Transaction作为index, value为Item取值
	orders_series = data.set_index('Transaction')['Item']
	# 将数据集进行格式转换
	transactions = []
	temp_index = 0
	for i, v in orders_series.items():#将同一个交易的商品放到一起
		if i != temp_index:#i是交易ID
			temp_set = set()
			temp_index = i
			temp_set.add(v)#v是item的值
			transactions.append(temp_set)
		else:
			temp_set.add(v)
	# 这个时候我们得到的transactions就是我们想要的数据
	# 挖掘频繁项集和频繁规则
	itemsets, rules = apriori(transactions, min_support=0.02,  min_confidence=0.5)#支持度为0.02,置信度为0.5
	print('频繁项集:', itemsets)
	print('关联规则:', rules)
rule()

频繁项集: {1: {('scandinavian',): 275, ('hot chocolate',): 552, ('cookies',): 515, ('muffin',): 364, ('bread',): 3096, ('pastry',): 815, ('coffee',): 4528, ('medialuna',): 585, ('tea',): 1350, ('farm house',): 371, ('juice',): 365, ('soup',): 326, ('cake',): 983, ('sandwich',): 680, ('alfajores',): 344, ('brownie',): 379, ('truffles',): 192, ('toast',): 318, ('scone',): 327}, 2: {('bread', 'cake'): 221, ('bread', 'coffee'): 852, ('bread', 'pastry'): 276, ('bread', 'tea'): 266, ('cake', 'coffee'): 518, ('cake', 'tea'): 225, ('coffee', 'cookies'): 267, ('coffee', 'hot chocolate'): 280, ('coffee', 'juice'): 195, ('coffee', 'medialuna'): 333, ('coffee', 'pastry'): 450, ('coffee', 'sandwich'): 362, ('coffee', 'tea'): 472, ('coffee', 'toast'): 224}}
关联规则: [{cake} -> {coffee}, {cookies} -> {coffee}, {hot chocolate} -> {coffee}, {juice} -> {coffee}, {medialuna} -> {coffee}, {pastry} -> {coffee}, {sandwich} -> {coffee}, {toast} -> {coffee}]

3.2电影分类的关联分析

数据集:MovieLens

下载地址:https://www.kaggle.com/jneupane12/movielens/download

主要使用的文件:movies.csv

格式:movieId title genres

记录了电影ID,标题和分类

我们可以分析下电影分类之间的频繁项集和关联规则

MovieLens 主要使用 Collaborative Filtering 和 Association Rules 相结合的技术,向用户推荐他们感兴趣的电影。

# 分析MovieLens 电影分类中的频繁项集和关联规则
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
#from efficient\_apriori import apriori
# 数据加载
movies = pd.read_csv('MovieLens/movies.csv')
#print(movies.head())
# 将genres进行one-hot编码(离散特征有多少取值,就用多少维来表示这个特征)
#print(movies['genres'])
movies_hot_encoded = movies.drop('genres',1).join(movies.genres.str.get_dummies(sep='|'))
#print(movies\_hot\_encoded)

pd.options.display.max_columns=100
print(movies_hot_encoded.head())

# 将movieId, title设置为index
movies_hot_encoded.set_index(['movieId','title'],inplace=True)
#print(movies\_hot\_encoded.head())
# 挖掘频繁项集,最小支持度为0.02
itemsets = apriori(movies_hot_encoded,use_colnames=True, min_support=0.02)
# 按照支持度从大到小
itemsets = itemsets.sort_values(by="support" , ascending=False) 
print('-'\*20, '频繁项集', '-'\*20)
print(itemsets)
# 根据频繁项集计算关联规则,设置最小提升度为2
rules =  association_rules(itemsets, metric='lift', min_threshold=2)
# 按照提升度从大到小进行排序
rules = rules.sort_values(by="lift" , ascending=False) 
#rules.to\_csv('./rules.csv')
print('-'\*20, '关联规则', '-'\*20)
print(rules)


   movieId                               title  (no genres listed)  Action  \
0        1                    Toy Story (1995)                   0       0   
1        2                      Jumanji (1995)                   0       0   
2        3             Grumpier Old Men (1995)                   0       0   
3        4            Waiting to Exhale (1995)                   0       0   
4        5  Father of the Bride Part II (1995)                   0       0   

   Adventure  Animation  Children  Comedy  Crime  Documentary  Drama  Fantasy  \
0          1          1         1       1      0            0      0        1   
1          1          0         1       0      0            0      0        1   
2          0          0         0       1      0            0      0        0   
3          0          0         0       1      0            0      1        0   
4          0          0         0       1      0            0      0        0   

   Film-Noir  Horror  IMAX  Musical  Mystery  Romance  Sci-Fi  Thriller  War  \
0          0       0     0        0        0        0       0         0    0   
1          0       0     0        0        0        0       0         0    0   
2          0       0     0        0        0        1       0         0    0   
3          0       0     0        0        0        1       0         0    0   
4          0       0     0        0        0        0       0         0    0   

   Western  
0        0  
1        0  
2        0  
3        0  
4        0  
-------------------- 频繁项集 --------------------
     support                  itemsets
7   0.489185                   (Drama)
4   0.306987                  (Comedy)
14  0.153164                (Thriller)
12  0.151294                 (Romance)
0   0.129042                  (Action)
5   0.107743                   (Crime)
9   0.095718                  (Horror)
31  0.094325          (Romance, Drama)
26  0.093335           (Comedy, Drama)
6   0.090586             (Documentary)
1   0.085380               (Adventure)
27  0.069470         (Romance, Comedy)
32  0.068480         (Thriller, Drama)
13  0.063898                  (Sci-Fi)
28  0.062761            (Crime, Drama)
11  0.055503                 (Mystery)
8   0.051763                 (Fantasy)
29  0.045165         (Thriller, Crime)
20  0.044101           (Action, Drama)
15  0.043772                     (War)
3   0.041755                (Children)
22  0.040655        (Thriller, Action)
34  0.039336        (Thriller, Horror)
10  0.037979                 (Musical)
2   0.037649               (Animation)
17  0.035633       (Adventure, Action)
33  0.032774              (War, Drama)
35  0.029144       (Thriller, Mystery)
19  0.028118           (Action, Crime)
36  0.027458  (Comedy, Romance, Drama)
30  0.026432          (Mystery, Drama)


![img](https://img-blog.csdnimg.cn/img_convert/89d967c30a312b0139c34ada4b07505b.png)
![img](https://img-blog.csdnimg.cn/img_convert/3e5ac06c1c6c4198d54db713053d51ad.png)
![img](https://img-blog.csdnimg.cn/img_convert/11f01c356ac75aa56f9c999ebaa34071.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

      (War, Drama)
35  0.029144       (Thriller, Mystery)
19  0.028118           (Action, Crime)
36  0.027458  (Comedy, Romance, Drama)
30  0.026432          (Mystery, Drama)


[外链图片转存中...(img-heJ7ypED-1715714924787)]
[外链图片转存中...(img-uidNMlwh-1715714924787)]
[外链图片转存中...(img-6ol2O6RS-1715714924788)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值