0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Apriori关联规则算法(Python代码)

数据分析与开发 来源:数据分析与开发 作者:数据分析与开发 2022-03-22 10:12 次阅读
一、关联规则概述1993年,Agrawal等人在首先提出关联规则概念,迄今已经差不多30年了,在各种算法层出不穷的今天,这算得上是老古董了,比很多人的年纪还大,往往是数据挖掘的入门算法,但深入研究的不多,尤其在风控领域,有着极其重要的应用潜力,是一个被低估的算法,很少见到公开的文章提及,我尝试一一剖析,希望给你带来一定的启示。 我倒是进行了比较深刻、全面的思考,并进行了大量的实验,这个话题感觉可以聊三天三夜。世界风云变幻,但本质没变化,各种关联一直存在,有意或无意的! 比如你女朋友,低头玩手指+沉默,那大概率生气了,那这就是你总结出来的规则。啤酒与尿布的例子相信很多人都听说过吧,故事是这样的:在一家超市中,人们发现了一个特别有趣的现象,尿布与啤酒这两种风马牛不相及的商品居然摆在一起,但这一奇怪的举措居然使尿布和啤酒的销量大幅增加了。为什么有这么奇怪现象呢?是因为美国妇女在丈夫回家前买尿布,然后丈夫顺手买了自己喜欢的啤酒,所以发生了这么有趣的事情。 很多人只记住了啤酒尿不湿,很少深入思考,我们稍微转换下,日常的事情,也存在非常多的关联规则?
2df6f5d8-a916-11ec-952b-dac502259ad0.png

二、应用场景举例

1、股票涨跌预测

放量+高换手率 -> 大概率上涨,历史数据挖掘,假如发现放量+高换手率的股票大概率上涨,则挖掘当天满足条件的个股,然后第二天买入,躺赚。

2、视频、音乐、图书等推荐

根据历史数据,如果大规模的存在某些用户看剧列表为:小时代 -> 上海堡垒,那么一个新的用户看了小时代,马上就给推荐上海堡垒,那大概率也会被观看,呼兰的账号,就是这么脏的。

3、打车路线预测(考虑时空)

根据大量的数据挖掘出以下规则早上:起点家->目的地公司晚上:起点家->目的高铁站周末:起点家->目的地购物中心

那当你每天早上打开软件的时候,打车软件就会推荐你的公司作为目的地,大大的减少用户的打车时间。如下图,我输入小区名称,马上给我推荐了三个地方,杭州东站第一位,因为平时的打车这个组合的支持度最高。

2e0aa498-a916-11ec-952b-dac502259ad0.png

4、风控策略自动化挖掘

根据历史标题,总结出规律发现商品标题包含 老司机+百度网盘 -> 色情风险高,那后面遇到这标题包含这两个词语的,就直接拒绝了。 根据历史行为数据,发现了沉默用户+非常用地登录+修改密码->大概率都被盗号了,那一个新的账户满足这个三个条件,那马上就进行账户冻结或者实人认证,就能避免盗号风险的发生。 根据历史数据,发现用户A +B 每天都相隔10s登录 ,则可以认为A、B存在关联关系,可能是机器控制的同一批薅羊毛账户。风控策略的自动化挖掘,这个也是我们后续要重点关注和讲解的地方。

三、3个最重要的概念

关联规则有三个核心概念需要理解:支持度、置信度、提升度,下面用最经典的啤酒-尿不湿案例给大家举例说明这三个概念,假如以下是几名客户购买订单的商品列表:

2e2581dc-a916-11ec-952b-dac502259ad0.png

1、支持度

支持度 (Support):指某个商品组合出现的次数总订单数之间的比例。

在这个例子中,我们可以看到“牛奶”出现了 4 次,那么这 5 笔订单中“牛奶”的支持度就是 4/5=0.8。

2e39d222-a916-11ec-952b-dac502259ad0.png同样“牛奶 + 面包”出现了 3 次,那么这 5 笔订单中“牛奶 + 面包”的支持度就是 3/5=0.62e53d83e-a916-11ec-952b-dac502259ad0.png

这样理解起来是不是非常简单了呢,大家可以动动手计算下 '尿不湿+啤酒'的支持度是多少?

2、置信度

置信度 (Confidence):指的就是当你购买了商品 A,会有多大的概率购买商品 B,在包含A的子集中,B的支持度,也就是包含B的订单的比例。

置信度(牛奶→啤酒)= 3/4=0.75,代表购买了牛奶的订单中,还有多少订单购买了啤酒,如下面的表格所示。

2e685868-a916-11ec-952b-dac502259ad0.png置信度(啤酒→牛奶)= 3/4=0.75,代表如果你购买了啤酒,有多大的概率会购买牛奶?2e7f345c-a916-11ec-952b-dac502259ad0.png置信度(啤酒→尿不湿)= 4/4=1.0,代表如果你购买了啤酒,有多大的概率会买尿不湿,下面的表格看出来是100%。2e91fc0e-a916-11ec-952b-dac502259ad0.png

由上面的例子可以看出,置信度其实就是个条件概念,就是说在 A 发生的情况下,B 发生的概率是多大。如果仅仅知道这两个概念,很多情况下还是不够用,需要用到提升度的概念。比如A出现的情况下B出现的概率为80%,那到底AB是不是有关系呢,不一定,人家B本来在大盘中的比例95%。你的A出现,反而减少了B出现的概率。

3、提升度

提升度 (Lift):我们在做商品推荐或者风控策略的时候,重点考虑的是提升度,因为提升度代表的是A 的出现,对B的出现概率提升的程度。提升度 (A→B) = 置信度 (A→B)/ 支持度 (B)所以提升度有三种可能:
  • 提升度 (A→B)>1:代表有提升;

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

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

提升度 (啤酒→尿不湿) =置信度 (啤酒→尿不湿) /支持度 (尿不湿) = 1.0/0.8 = 1.25,可见啤酒对尿不湿是有提升的,提升度为1.25,大于1。 可以简单理解为:在全集的情况下,尿不湿的概率为80%,而在包含啤酒这个子集中,尿不湿的概率为100%,因此,子集的限定,提高了尿不湿的概率,啤酒的出现,提高了尿不湿的概率。

4、频繁项集

频繁项集(frequent itemset) :就是支持度大于等于最小支持度 (Min Support) 阈值的项集,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集,项集可以是单个商品,也可以是组合。

频繁集挖掘面临的最大难题就是项集的组合爆炸,如下图:

2ea15b86-a916-11ec-952b-dac502259ad0.png

随着商品数量增多,这个网络的规模将变得特别庞大,我们不可能根据传统方法进行统计和计算,为了解决这个问题,Apriori算法提出了两个核心思想:

某个项集是频繁的,那么它的所有子集也是频繁的
{Milk, Bread, Coke} 是频繁的 → {Milk, Coke} 是频繁的
如果一个项集是 非频繁项集,那么它的所有超集也是非频繁项集
{Battery} 是非频繁的 → {Milk, Battery} 也非平凡

如下图,如果我们已知B不频繁,那么可以说图中所有绿色的项集都不频繁,搜索时就要这些项避开,减少计算开销。

2eb71890-a916-11ec-952b-dac502259ad0.png

同理,如果下图所示,{A,B}这个项集是非频繁的,那虚线框后面的都不用计算了,运用Apriori算法的思想,我们就能去掉很多非频繁的项集,大大简化计算量,当然,面对大规模数据的时候,这种排除还是解决不了问题,于是还有FP-Growth(Frequent pattern Growth,频繁模式增长树)这种更高效的方法,后面有机会慢慢讲。

2ecc1970-a916-11ec-952b-dac502259ad0.png

需要注意的是:

1)如果支持度和置信度阈值过高,虽然可以在一定程度上减少数据挖掘的时间,但是一些隐含在数据中的非频繁特征项容易被忽略掉,难以发现足够有用的规则;2)如果支持度和置信度阈值过低,可能会导致大量冗余和无效的规则产生,导致较大计算量负荷。

四、Python算法介绍

这里用的是Python举例,用的包是apriori,当然R语言等其他语言,也有对应的算法包,原理都是一样的,大家自行进行试验。
#包安装我们使用efficient-apriori,python中也可以利用apyori库和mlxtend库
pipinstallefficient-apriori

#加载包
fromefficient_aprioriimportapriori

‘’‘
apriori(transactions:typing.Iterable[typing.Union[set,tuple,list]],
min_support:float=0.5,
min_confidence:float=0.5,
max_length:int=8,
verbosity:int=0,
output_transaction_ids:bool=False)
上面就是这个函数的参数
min_support:最小支持度
min_confidence:最小置信度
max_length:项集长度
‘’‘

#构造数据集
data=[('牛奶','面包','尿不湿','啤酒','榴莲'),
('可乐','面包','尿不湿','啤酒','牛仔裤'),
('牛奶','尿不湿','啤酒','鸡蛋','咖啡'),
('面包','牛奶','尿不湿','啤酒','睡衣'),
('面包','牛奶','尿不湿','可乐','鸡翅')]
#挖掘频繁项集和频繁规则
itemsets,rules=apriori(data,min_support=0.6,min_confidence=1)
#频繁项集
print(itemsets)
{1:{('啤酒',):4,('尿不湿',):5,('牛奶',):4,('面包',):4},
2:{('啤酒','尿不湿'):4,('啤酒','牛奶'):3,('啤酒','面包'):3,('尿不湿','牛奶'):4,('尿不湿','面包'):4,('牛奶','面包'):3},
3:{('啤酒','尿不湿','牛奶'):3,('啤酒','尿不湿','面包'):3,('尿不湿','牛奶','面包'):3}}
itemsets[1]#满足条件的一元组合
{('啤酒',):4,('尿不湿',):5,('牛奶',):4,('面包',):4}
itemsets[2]#满足条件的二元组合
{('啤酒','尿不湿'):4,('啤酒','牛奶'):3,('啤酒','面包'):3,('尿不湿','牛奶'):4,('尿不湿','面包'):4,('牛奶','面包'):3}
itemsets[3]#满足条件的三元组合
{('啤酒','尿不湿','牛奶'):3,('啤酒','尿不湿','面包'):3,('尿不湿','牛奶','面包'):3}
#频繁规则
print(rules)
[{啤酒}->{尿不湿},{牛奶}->{尿不湿},
{面包}->{尿不湿},{啤酒,牛奶}->{尿不湿},
{啤酒,面包}->{尿不湿},{牛奶,面包}->{尿不湿}]

#我们把max_length=2这个参数加进去看看
itemsets,rules=apriori(data,min_support=0.6,
min_confidence=0.5,
max_length=2)
#频繁项集
print(itemsets)
{1:{('牛奶',):4,('面包',):4,('尿不湿',):5,('啤酒',):4,('R',):4},
2:{('R','啤酒'):4,('R','尿不湿'):4,('R','牛奶'):3,('R','面包'):3,('啤酒','尿不湿'):4,('啤酒','牛奶'):3,('啤酒','面包'):3,('尿不湿','牛奶'):4,('尿不湿','面包'):4,('牛奶','面包'):3}}
#通过这个数据我们可以看到,项集的长度只包含有两个项了

五、挖掘实例

每个导演都有自己的偏好、比如周星驰有星女郎,张艺谋有谋女郎,且巩俐经常在张艺谋的电影里面出现,因此,每个导演对演员的选择都有一定的偏爱,我们以宁浩导演为例,分析下选择演员的一些偏好,没有找到公开的数据集,自己手动扒了一部分,大概如下,有些实在有点多,于是简化下进行分析。

2ee90058-a916-11ec-952b-dac502259ad0.png

可以看到,我们一共扒了9部电影,计算的时候,支持度的时候,总数就是9.

#把电影数据转换成列表
data=[['葛优','黄渤','范伟','邓超','沈腾','张占义','王宝强','徐峥','闫妮','马丽'],
['黄渤','张译','韩昊霖','杜江','葛优','刘昊然','宋佳','王千源','任素汐','吴京'],
['郭涛','刘桦','连晋','黄渤','徐峥','优恵','罗兰','王迅'],
['黄渤','舒淇','王宝强','张艺兴','于和伟','王迅','李勤勤','李又麟','宁浩','管虎','梁静','徐峥','陈德森','张磊'],
['黄渤','沈腾','汤姆·派福瑞','马修·莫里森','徐峥','于和伟','雷佳音','刘桦','邓飞','蔡明凯','王戈','凯特·纳尔逊','王砚伟','呲路'],
['徐峥','黄渤','余男','多布杰','王双宝','巴多','杨新鸣','郭虹','陶虹','黄精一','赵虎','王辉'],
['黄渤','戎祥','九孔','徐峥','王双宝','巴多','董立范','高捷','马少骅','王迅','刘刚','WorapojThuantanon','赵奔','李麒麟','姜志刚','王鹭','宁浩'],
['黄渤','徐峥','袁泉','周冬雨','陶慧','岳小军','沈腾','张俪','马苏','刘美含','王砚辉','焦俊艳','郭涛'],
['雷佳音','陶虹','程媛媛','山崎敬一','郭涛','范伟','孙淳','刘桦','黄渤','岳小军','傅亨','王文','杨新鸣']]
#算法应用
itemsets,rules=apriori(data,min_support=0.5,min_confidence=1)
print(itemsets)
{1:{('徐峥',):7,('黄渤',):9},2:{('徐峥','黄渤'):7}}
print(rules)[{徐峥}->{黄渤}]

通过上述分析可以看出:在宁浩的电影中,用的最多的是黄渤和徐峥,黄渤9次,支持度100%,徐峥7次,支持度78%,('徐峥', '黄渤') 同时出现7次,置信度为100%,看来有徐峥,必有黄渤,真是宁浩必请的黄金搭档,且是一对好基友。 当然,这个数据量比较小,我们基本上肉眼也能看出来,这里只是提供一个分析案例和基础方法,巩固下基础知识,算是开胃菜,大规模的数据,人眼无法直接感知的时候,算法的挖掘与发现,就显得特别有意义了。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 关联规则
    +关注

    关注

    0

    文章

    29

    浏览量

    7997
  • Apriori
    +关注

    关注

    0

    文章

    10

    浏览量

    7916

原文标题:Apriori 关联规则算法(Python代码)

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于关联规则的农副产品价格变化规律研究

    优化Apriori算法Apriori算法各种性能,来说明优化Apriori算法的优越性。…【关
    发表于 04-24 09:18

    PythonApriori算法和FP-Growth算法是什么

    [源码和文档分享]基于Python实现的Apriori算法和FP-Growth算法的频繁项集挖掘的研究与实现
    发表于 06-04 12:49

    Apriori算法的一种优化方法

    介绍关联规则挖掘中的经典算法――Apriori算法的关键思想。针对传统Apriori
    发表于 04-10 08:48 19次下载

    基于用户兴趣导向的关联规则数据挖掘

    本文在针对关联规则Apriori 算法的基础上,为了提高用户数据挖掘的人机交互性能,解决关联规则
    发表于 08-26 11:41 11次下载

    基于关联规则Apriori-Partition算法的可视化

    关联规则的提取是数据挖掘中的重要研究内容,对关联规则提取中的Apriori算法进行了分析与研究,
    发表于 01-15 13:51 15次下载

    关联规则Apriori算法的改进

    关联规则是数据挖掘研究的一个重要分支。Apriori算法关联规则挖掘中最有影响的经典
    发表于 05-13 16:37 0次下载

    基于项目编码的关联规则改进算法

    针对传统的Apriori算法在挖掘布尔型关联规则的频繁项集中需不断扫描数据库,在时间与空间上都存在很大的冗余,尤其在处理海量稠密数据时,算法
    发表于 12-17 10:45 0次下载

    基于关联规则挖掘算法的用电负荷能效研究(ECALT和APRIORI算法

    ,降低用电成本,本文试图利用关联规则算法甲对大型用电客户的数据进行深度的数据挖掘,从而对用电负荷的能效进行优化。关联规则的传统
    发表于 10-30 16:03 0次下载
    基于<b class='flag-5'>关联</b><b class='flag-5'>规则</b>挖掘<b class='flag-5'>算法</b>的用电负荷能效研究(ECALT和<b class='flag-5'>APRIORI</b><b class='flag-5'>算法</b>)

    关联规则推荐算法分析及评估

    算法频繁项集挖掘问题进行了重新评估和分析,定义了新的测评指标推荐非空率以及七前项频繁项集关联规则的概念,设计了基于K前项频繁项集的剪枝方法,提出了优化Apriori
    发表于 01-09 17:17 0次下载
    <b class='flag-5'>关联</b><b class='flag-5'>规则</b>推荐<b class='flag-5'>算法</b>分析及评估

    简介Apriori算法并解析该算法的具体策略和步骤,给出Python实现代码

    随着大数据概念的火热,啤酒与尿布的故事广为人知。我们如何发现买啤酒的人往往也会买尿布这一规律?数据挖掘中的用于挖掘频繁项集和关联规则Apriori算法可以告诉我们。本文首先对
    的头像 发表于 01-31 15:04 5826次阅读
    简介<b class='flag-5'>Apriori</b><b class='flag-5'>算法</b>并解析该<b class='flag-5'>算法</b>的具体策略和步骤,给出<b class='flag-5'>Python</b>实现<b class='flag-5'>代码</b>

    Matlab关于Apriori算法设计

    本文详细介绍了Matlab关于Apriori算法设计。Apriori算法是一种最有影响的挖掘布尔关联规则
    发表于 02-02 16:20 5128次阅读
    Matlab关于<b class='flag-5'>Apriori</b><b class='flag-5'>算法</b>设计

    Apriori算法详解

    本文主要是对Apriori算法的详解,包括了Apriori算法详细介绍概括和步骤和Apriori算法
    发表于 02-02 16:35 2.1w次阅读
    <b class='flag-5'>Apriori</b><b class='flag-5'>算法</b>详解

    关联规则挖掘——Apriori算法的基本原理以及改进

    本文详细介绍了关于关联规则挖掘——Apriori算法的基本原理以及改进。
    发表于 02-02 16:46 9415次阅读
    <b class='flag-5'>关联</b><b class='flag-5'>规则</b>挖掘——<b class='flag-5'>Apriori</b><b class='flag-5'>算法</b>的基本原理以及改进

    十大经典数据挖掘算法Apriori

    关联分析是一类非常有用的数据挖掘方法,能从数据中挖掘出潜在的关联关系。Apriori算法是一种最有影响的挖掘布尔关联
    发表于 02-04 09:37 3729次阅读
    十大经典数据挖掘<b class='flag-5'>算法</b>—<b class='flag-5'>Apriori</b>

    从五个方面让你了解人工智能算法中的Apriori

    Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法,也是十大经典机器学习算法之一。
    发表于 07-05 14:25 2369次阅读