1993年,Agrawal等人在首先提出关联规则概念,迄今已经差不多30年了,现今在各种新算法层出不穷,这算得上是老古董了,比很多人的年纪还大,往往是数据挖掘的入门算法,但深入研究的不多,尤其在风控领域,有着极其重要的应用潜力。
比如你女朋友,低头玩手指+沉默,那大概率生气了,那这就是你总结出来的规则。啤酒与尿布的例子相信很多人都听说过吧,故事是这样的:在一家超市中,人们发现了一个特别有趣的现象,尿布与啤酒这两种风马牛不相及的商品居然摆在一起,但这一奇怪的举措居然使尿布和啤酒的销量大幅增加了。为什么有这么奇怪现象呢?是因为美国妇女在丈夫回家前买尿布,然后丈夫顺手买了自己喜欢的啤酒,所以发生了这么有趣的事情。
1、股票涨跌预测
放量+高换手率 → \rightarrow →大概率上涨,历史数据挖掘,假如发现放量+高换手率的股票大概率上涨,则挖掘当天满足条件的个股,然后第二天买入,躺赚。
2、视频、音乐、图书等推荐
根据历史数据,如果大规模的存在某些用户看剧列表为:小时代 → \rightarrow →上海堡垒,那么一个新的用户看了小时代,马上就给推荐上海堡垒,那大概率也会被观看。
3、打车路线预测(考虑时空)
根据大量的数据挖掘出以下规则
早上:起点家 → \rightarrow →目的地公司,
晚上:起点家 → \rightarrow →目的高铁站
周末:起点家 → \rightarrow →目的地购物中心
那当你每天早上打开软件的时候,打车软件就会推荐你的公司作为目的地,大大的减少用户的打车时间。如下图,我输入小区名称,马上给我推荐了三个地方,杭州东站第一位,因为平时的打车这个组合的支持度最高。
4、风控策略自动化挖掘
根据历史标题,总结出规律发现商品标题包含 老司机+百度网盘 -> 色情风险高,那后面遇到这标题包含这两个词语的,就直接拒绝了。
根据历史行为数据,发现了沉默用户+非常用地登录+修改密码->大概率都被盗号了,那一个新的账户满足这个三个条件,那马上就进行账户冻结或者实人认证,就能避免盗号风险的发生。
根据历史数据,发现用户A +B 每天都相隔10s登录 ,则可以认为A、B存在关联关系,可能是机器控制的同一批薅羊毛账户。
支持度 (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)
提升度有三种可能
提升度 (啤酒 → \rightarrow →尿不湿) =置信度 (啤酒 → \rightarrow →尿不湿) /支持度 (尿不湿) = 1.0/0.8 = 1.25,可见啤酒对尿不湿是有提升的,提升度为1.25,大于1。
可以简单理解为:在全集的情况下,尿不湿的概率为80%,而在包含啤酒这个子集中,尿不湿的概率为100%,因此,子集的限定,提高了尿不湿的概率,啤酒的出现,提高了尿不湿的概率。
频繁项集(frequent itemset) :就是支持度大于等于最小支持度 (Min Support) 阈值的项集,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集,项集可以是单个商品,也可以是组合。
频繁集挖掘面临的最大难题就是项集的组合爆炸,
随着商品数量增多,这个网络的规模将变得特别庞大,我们不可能根据传统方法进行统计和计算,为了解决这个问题,Apriori算法提出了两个核心思想:
如下图,如果我们已知B不频繁,那么可以说图中所有绿色的项集都不频繁,搜索时就要这些项避开,减少计算开销。
同理,如果下图所示,{A,B}这个项集是非频繁的,那虚线框后面的都不用计算了,运用Apriori算法的思想,我们就能去掉很多非频繁的项集,大大简化计算量,当然,面对大规模数据的时候,这种排除还是解决不了问题,于是还有FP-Growth(Frequent pattern Growth,频繁模式增长树)这种更高效的方法。
需要注意的是:
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}}