1993年,Agrawal等人在首先提出关联规则概念,迄今已经差不多30年了,在各种算法层出不穷的今天,这算得上是老古董了,比很多人的年纪还大,往往是数据挖掘的入门算法,但深入研究的不多,尤其在风控领域,有着极其重要的应用潜力,是一个被低估的算法,很少见到公开的文章提及,我尝试一一剖析,希望给你带来一定的启示。

比如你女朋友,低头玩手指+沉默,那大概率生气了,那这就是你总结出来的规则。啤酒与尿布的例子相信很多人都听说过吧,故事是这样的:在一家超市中,人们发现了一个特别有趣的现象,尿布与啤酒这两种风马牛不相及的商品居然摆在一起,但这一奇怪的举措居然使尿布和啤酒的销量大幅增加了。为什么有这么奇怪现象呢?是因为美国妇女在丈夫回家前买尿布,然后丈夫顺手买了自己喜欢的啤酒,所以发生了这么有趣的事情。

很多人只记住了啤酒尿不湿,很少深入思考,我们稍微转换下,日常的事情,也存在非常多的关联规则?喜欢本文记得收藏、关注、点赞。

【注】完整版代码、数据、技术交流文末获取。

应用场景举例

1、股票涨跌预测

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

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

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

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

根据大量的数据挖掘出以下规则

早上: 起点家->目的地公司,

晚上: 起点家->目的高铁站

周末: 起点家->目的地购物中心

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

4、风控策略自动化挖掘

根据历史标题,总结出规律发现商品标题包含 老司机+百度网盘 -> 色情风险高,那后面遇到这标题包含这两个词语的,就直接拒绝了。

根据历史行为数据,发现了沉默用户+非常用地登录+修改密码->大概率都被盗号了,那一个新的账户满足这个三个条件,那马上就进行账户冻结或者实人认证,就能避免盗号风险的发生。

根据历史数据,发现用户A +B 每天都相隔10s登录 ,则可以认为A、B存在关联关系,可能是机器控制的同一批薅羊毛账户。

风控策略的自动化挖掘,这个也是我们后续要重点关注和讲解的地方。

3个最重要的概念

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

1、支持度

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

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

同样“牛奶 + 面包”出现了 3 次,那么这 5 笔订单中“牛奶 + 面包”的支持度就是 3/5=0.6

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

2、置信度

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

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

置信度(啤酒→牛奶)= 3/4=0.75,代表如果你购买了啤酒,有多大的概率会购买牛奶?

置信度(啤酒→尿不湿)= 4/4=1.0,代表如果你购买了啤酒,有多大的概率会买尿不湿,下面的表格看出来是100%。

由上面的例子可以看出,置信度其实就是个条件概念,就是说在 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) 阈值的项集,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集,项集可以是单个商品,也可以是组合。

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

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

某个项集是频繁的,那么它的所有子集也是频繁的
{Milk, Bread, Coke} 是频繁的 → {Milk, Coke} 是频繁的

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

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

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

需要注意的是:

1)如果支持度和置信度阈值过高,虽然可以在一定程度上减少数据挖掘的时间,但是一些隐含在数据中的非频繁特征项容易被忽略掉,难以发现足够有用的规则;

2)如果支持度和置信度阈值过低,可能会导致大量冗余和无效的规则产生,导致较大计算量负荷。

四、Python算法介绍

这里用的是Python举例,用的包是apriori,当然R语言等其他语言,也有对应的算法包,原理都是一样的,大家自行进行试验。

#包安装 我们使用efficient-apriori,python中也可以利用apyori库和mlxtend库
pip install efficient-apriori#加载包
from efficient_apriori import apriori‘’‘
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}}
#通过这个数据我们可以看到,项集的长度只包含有两个项了

挖掘实例

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

可以看到,我们一共扒了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%,看来有徐峥,必有黄渤,真是宁浩必请的黄金搭档,且是一对好基友。

当然,这个数据量比较小,我们基本上肉眼也能看出来,这里只是提供一个分析案例和基础方法,巩固下基础知识,算是开胃菜,大规模的数据,人眼无法直接感知的时候,算法的挖掘与发现,就显得特别有意义了,后续会陆续推出相应的文章。

推荐文章

  • 李宏毅《机器学习》国语课程(2022)来了

  • 有人把吴恩达老师的机器学习和深度学习做成了中文版

  • 上瘾了,最近又给公司撸了一个可视化大屏(附源码)

  • 如此优雅,4款 Python 自动数据分析神器真香啊

  • 梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学

  • 年终汇总:20份可视化大屏模板,直接套用真香(文末附源码)

技术交流

欢迎转载、收藏、有所收获点赞支持一下!数据、代码可以找我获取

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

关联规则:一款在策略挖掘中必不可少的算法相关推荐

  1. 【机器学习】数据挖掘算法——关联规则(二),挖掘过程,Aprioir算法

    关联规则挖掘的原理和过程 从关联规则(一)的分析中可知,关联规则挖掘是从事务集合中挖掘出这样的关联规则:它的支持度和置信度大于最低阈值(minsup,minconf),这个阈值是由用户指定的.根据 s ...

  2. 关联规则挖掘技术——主流推荐算法评述

    链接:http://www.csdn.net/article/a/2011-07-11/301462 啤酒和尿布的购买有关系吗?答案是,跟尿布一起购买最多的商品就是啤酒.据沃尔玛的分析调查,美国的太太 ...

  3. 余承东:华为自研的麒麟A1芯片已经应用在了多款可穿戴产品中

    [TechWeb]3月12日,华为余承东发微博称,华为自研的麒麟A1芯片已经应用在了多款可穿戴产品中. 余承东:我们可穿戴产品的品类也越来越丰富,FreeBuds 3开创了半开放式主动降噪TWS耳机品 ...

  4. 教师和计算机平面设计图谁更好一些,平面设计计算机论文,关于计算机平面设计课程教学策略对中职生就业的作用和意义相关参考文献资料-免费论文范文...

    导读:主要论述了平面设计计算机论文范文相关参考文献文献 (江苏省南京市玄武中等专业学校,江苏 南京 210000) [摘 要]随着信息技术的发展,计算机教学受到了广泛的关注,在此基础上,应社会及行业需 ...

  5. 小红书爆款产品营销策略分享

    小红书作为一个种草分享平台,在品牌营销中发挥重要作用. 但要想打败小红书上琳琅满目的各种产品,不仅要吸引用户的眼球,还要让用户下单购买.产品也需要有足够的产品力和差异性,其创造的消费场景也要更加个性化 ...

  6. 【.NET Core 3.1】 策略授权中获取权限数据

    ▼ 更多精彩推荐,上午11点到达 ▼ 随着项目关注度渐渐升高,目前已经1.2k个star,我的内心反而更加的惶恐了起来,最近也是很有强迫症,只要有小伙伴反馈项目的问题,就很着急,哪怕一丁点的问题,就需 ...

  7. 风控策略分析中最重要的五步心法

    在策略制定的过程中,很多同学在咨询有没有通用的方法论可以介绍下,今天我们给大家推荐一个在策略分析中比较有效的方法: ①确立目标 ②分解目标 ③分析数据 ④生成策略 ⑤策略调优 1.确立目标 策略最基础 ...

  8. 数据分析与挖掘中常用Python库的介绍与实践案例

    数据分析与挖掘中常用Python库的介绍与实践案例 一.Python介绍 现在python一词对我们来说并不陌生,尤其是在学术圈,它的影响力远超其它任何一种编程语言, 作为一门简单易学且功能强大的编程 ...

  9. 微型计算机不可少,[单选] 微型计算机中必不可少的输入和输出设备是()。

    [单选] 微型计算机中必不可少的输入和输出设备是(). 更多相关问题 [多选题]反映企业经营成果的要素有 A. 所有者权益 B. 收入 C. 费用 D. 利润 太平天国圣库制度的基础是人无私财和大致的 ...

  10. 计算机系统中必不可少的系统软件是哪个,计算机系统中必不可少的软件

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 计算机系统中必不可少的软件是系统软件,其主要特征是: 1.与硬件有很强的交互性: 2.能对资源共享进行调度管理: 3.能解决并发操 ...

最新文章

  1. UA MATH567 高维统计II 随机向量5 亚高斯随机向量
  2. 局域网内连接MySQL
  3. Jenkins配置ansible
  4. cad2020 开始_中望cad2020发布,附简体中文免费版安装教程
  5. 如何去除图片背景变透明?在线抠图软件怎么用?
  6. 【软件】如何批量手机号码归属地查询并且快速分类?批量号码归属地告诉查询分类系统怎么使用?全部教会你
  7. 华为HarmonyOS手机系统如何下载手机淘宝APP领取淘宝内部隐藏优惠券?
  8. 我的脚本-一键禁用启用笔记本自带键盘
  9. 万物之始,大道至简,衍化至繁
  10. java 集合元素自定义排序——Comparator.comparing , 不用实现 Comparable 接口
  11. python:TypeError:takes at least 8 arguments (9 given)
  12. 干货分享:今天谈谈大学生该如何运营校园微信公众号!
  13. 32位谷歌浏览器的下载网址
  14. 关于 Dota Rdsp 计算器的编写(一)
  15. JavaScript运算符完全攻略(史上最全!)
  16. 清除浮动的五种方法详解
  17. python采用解释方式执行_Python解释执行原理
  18. 系统修复软件测试工资,技术员们有福了,关于怎么用MHDD修复硬盘坏道,现在免费给大家了!!!...
  19. 正则匹配以什么开头、以什么结尾,以非什么开头,以非什么结尾
  20. Redhat系列系统在线镜像源

热门文章

  1. JAVA接口签名(Signature)实现方案
  2. Python 调用高德 API 实现地址转为经纬度
  3. Win 7 远程桌面报错“出现身份验证错误,要求的函数不受支持”解决办法
  4. 微信公众号配置失败问题解决方法
  5. 彩扩机项目--两个状态指示灯,巧妙的使用二极管的特性,以及物理按键的滤波...
  6. oracle sql 常用语句大全,SQL常用语句大全
  7. MySQL条件查询IN和NOT IN左右两侧包含NULL值的处理方式
  8. mysql todate日期格式写法_MYSQL的日期格式date_format用法
  9. javascript在avant浏览器中的妙用
  10. 阿里云磁盘异常爆满的原因排查及解决方法