概述
机器学习 -- 关联规则
- 关联规则概述
- 应用场景举例
- 3个最重要的概念(支持度、置信度、提升度)
- 支持度
- 置信度
- 提升度
- 频繁项集
- Python算法实现
关联规则概述
1993年,Agrawal等人在首先提出关联规则概念,迄今已经差不多30年了,现今在各种新算法层出不穷,这算得上是老古董了,比很多人的年纪还大,往往是数据挖掘的入门算法,但深入研究的不多,尤其在风控领域,有着极其重要的应用潜力。
比如你女朋友,低头玩手指+沉默,那大概率生气了,那这就是你总结出来的规则。啤酒与尿布的例子相信很多人都听说过吧,故事是这样的:在一家超市中,人们发现了一个特别有趣的现象,尿布与啤酒这两种风马牛不相及的商品居然摆在一起,但这一奇怪的举措居然使尿布和啤酒的销量大幅增加了。为什么有这么奇怪现象呢?是因为美国妇女在丈夫回家前买尿布,然后丈夫顺手买了自己喜欢的啤酒,所以发生了这么有趣的事情。
应用场景举例
1、股票涨跌预测
放量+高换手率
→
rightarrow
→大概率上涨,历史数据挖掘,假如发现放量+高换手率的股票大概率上涨,则挖掘当天满足条件的个股,然后第二天买入,躺赚。
2、视频、音乐、图书等推荐
根据历史数据,如果大规模的存在某些用户看剧列表为:小时代
→
rightarrow
→上海堡垒,那么一个新的用户看了小时代,马上就给推荐上海堡垒,那大概率也会被观看。
3、打车路线预测(考虑时空)
根据大量的数据挖掘出以下规则
早上:起点家 → rightarrow →目的地公司,
晚上:起点家 → rightarrow →目的高铁站
周末:起点家 → rightarrow →目的地购物中心
那当你每天早上打开软件的时候,打车软件就会推荐你的公司作为目的地,大大的减少用户的打车时间。如下图,我输入小区名称,马上给我推荐了三个地方,杭州东站第一位,因为平时的打车这个组合的支持度最高。
4、风控策略自动化挖掘
根据历史标题,总结出规律发现商品标题包含 老司机+百度网盘 -> 色情风险高,那后面遇到这标题包含这两个词语的,就直接拒绝了。
根据历史行为数据,发现了沉默用户+非常用地登录+修改密码->大概率都被盗号了,那一个新的账户满足这个三个条件,那马上就进行账户冻结或者实人认证,就能避免盗号风险的发生。
根据历史数据,发现用户A +B 每天都相隔10s登录 ,则可以认为A、B存在关联关系,可能是机器控制的同一批薅羊毛账户。
3个最重要的概念(支持度、置信度、提升度)
支持度
支持度 (Support):指某个商品组合出现的次数与总订单数之间的比例。
订单编号 | 购买商品 |
---|---|
1 | 牛奶、面包、尿不湿、啤酒、薯片 |
2 | 可乐、面包、尿不湿、啤酒、裤子 |
3 | 牛奶、鸡蛋、尿不湿、啤酒、果汁 |
4 | 面包、牛奶、尿不湿、啤酒、衬衫 |
5 | 面包、牛奶、尿不湿、啤酒、鸡翅 |
在这个例子中,订单中“牛奶”出现了4次,这5笔订单中“牛奶”的支持度就是4/5=0.8
订单编号 | 购买商品 |
---|---|
1 | 牛奶、面包、尿不湿、啤酒、薯片 |
2 | 可乐、面包、尿不湿、啤酒、裤子 |
3 | 牛奶、鸡蛋、尿不湿、啤酒、果汁 |
4 | 面包、牛奶、尿不湿、啤酒、衬衫 |
5 | 面包、牛奶、尿不湿、啤酒、鸡翅 |
在这个例子中,订单中“牛奶+面包”出现了3次,这5笔订单中“牛奶”的支持度就是3/5=0.6
置信度
支持度 (Support):指的就是当你购买了商品 A,会有多大的概率购买商品 B,在包含A的子集中,B的支持度,也就是包含B的订单的比例。
订单编号 | 购买商品 |
---|---|
1 | 牛奶、面包、尿不湿、啤酒、薯片 |
2 | 可乐、面包、尿不湿、啤酒、裤子 |
3 | 牛奶、鸡蛋、尿不湿、啤酒、果汁 |
4 | 面包、牛奶、尿不湿、啤酒、衬衫 |
5 | 面包、牛奶、尿不湿、可乐、鸡翅 |
置信度(牛奶 → rightarrow →啤酒)= 3/4 = 0.75,代表购买了牛奶的订单中,还有多少订单购买了啤酒。
提升度
提升度 (Lift):我们在做商品推荐或者风控策略的时候,重点考虑的是提升度,因为提升度代表的是A 的出现,对B的出现概率提升的程度。
提升度 (A
→
rightarrow
→B) = 置信度 (A
→
rightarrow
→B)/ 支持度 (B)
提升度有三种可能
- 提升度 (A → rightarrow →B)>1:代表有提升
- 提升度 (A → rightarrow →B)=1:代表有没有提升,也没有下降;
- 提升度 (A → rightarrow →B)<1:代表有下降。
提升度 (啤酒 → rightarrow →尿不湿) =置信度 (啤酒 → rightarrow →尿不湿) /支持度 (尿不湿) = 1.0/0.8 = 1.25,可见啤酒对尿不湿是有提升的,提升度为1.25,大于1。
可以简单理解为:在全集的情况下,尿不湿的概率为80%,而在包含啤酒这个子集中,尿不湿的概率为100%,因此,子集的限定,提高了尿不湿的概率,啤酒的出现,提高了尿不湿的概率。
频繁项集
频繁项集(frequent itemset) :就是支持度大于等于最小支持度 (Min Support) 阈值的项集,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集,项集可以是单个商品,也可以是组合。
频繁集挖掘面临的最大难题就是项集的组合爆炸,
随着商品数量增多,这个网络的规模将变得特别庞大,我们不可能根据传统方法进行统计和计算,为了解决这个问题,Apriori算法提出了两个核心思想:
- 某个项集是频繁的,那么它的所有子集也是频繁的。{Milk, Bread, Coke} 是频繁的 → rightarrow →{Milk, Coke} 是频繁的
- 如果一个项集是 非频繁项集,那么它的所有超集也是非频繁项集。{Battery} 是非频繁 → rightarrow →{Milk, Battery} 也非平凡
如下图,如果我们已知B不频繁,那么可以说图中所有绿色的项集都不频繁,搜索时就要这些项避开,减少计算开销。
同理,如果下图所示,{A,B}这个项集是非频繁的,那虚线框后面的都不用计算了,运用Apriori算法的思想,我们就能去掉很多非频繁的项集,大大简化计算量,当然,面对大规模数据的时候,这种排除还是解决不了问题,于是还有FP-Growth(Frequent pattern Growth,频繁模式增长树)这种更高效的方法。
需要注意的是:
- 如果支持度和置信度阈值过高,虽然可以在一定程度上减少数据挖掘的时间,但是一些隐含在数据中的非频繁特征项容易被忽略掉,难以发现足够有用的规则
- 如果支持度和置信度阈值过低,可能会导致大量冗余和无效的规则产生,导致较大计算量负荷
Python算法实现
pip install efficient-apriori #安装相应包
from efficient_apriori import apriori
#构建数据集
data = [('牛奶','面包','尿不湿','啤酒','榴莲'),
('可乐','面包','尿不湿','啤酒','牛仔裤'),
('牛奶','尿不湿','啤酒','鸡蛋','咖啡'),
('面包','牛奶','尿不湿','啤酒','睡衣'),
('面包','牛奶','尿不湿','可乐','鸡翅')]
itemsets, rules = apriori(data, min_support=0.6,
min_confidence=1)
print(itemsets[1])
#{('牛奶',): 4, ('面包',): 4, ('尿不湿',): 5, ('啤酒',): 4}
print(itemsets[2])
#{('啤酒', '尿不湿'): 4, ('啤酒', '牛奶'): 3, ('啤酒', '面包'): 3, ('尿不湿', '牛奶'): 4, ('尿不湿', '面包'): 4, ('牛奶', '面包'): 3}
print(itemsets[3])
#{('啤酒', '尿不湿', '牛奶'): 3, ('啤酒', '尿不湿', '面包'): 3, ('尿不湿', '牛奶', '面包'): 3}
print(rules)
#[{啤酒} -> {尿不湿}, {牛奶} -> {尿不湿}, {面包} -> {尿不湿}, {啤酒, 牛奶} -> {尿不湿}, {啤酒, 面包} -> {尿不湿}, {牛奶, 面包} -> {尿不湿}]
itemsets, rules = apriori(data, min_support=0.6,min_confidence=0.5,max_length=2)
print(itemsets)
#{1: {('牛奶',): 4, ('面包',): 4, ('尿不湿',): 5, ('啤酒',): 4}, 2: {('啤酒', '尿不湿'): 4, ('啤酒', '牛奶'): 3, ('啤酒', '面包'): 3, ('尿不湿', '牛奶'): 4, ('尿不湿', '面包'): 4, ('牛奶', '面包'): 3}}
最后
以上就是现代苗条为你收集整理的机器学习之关联规则理解关联规则概述应用场景举例3个最重要的概念(支持度、置信度、提升度)Python算法实现的全部内容,希望文章能够帮你解决机器学习之关联规则理解关联规则概述应用场景举例3个最重要的概念(支持度、置信度、提升度)Python算法实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复