机器学习之关联规则理解

机器学习 -- 关联规则

  • 关联规则概述
  • 应用场景举例
  • 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) 阈值的项集,所以小于最小值支持度的项目就是非频繁项集,而大于等于最小支持度的的项集就是频繁项集,项集可以是单个商品,也可以是组合。
频繁集挖掘面临的最大难题就是项集的组合爆炸,
机器学习之关联规则理解_第1张图片

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

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

如下图,如果我们已知B不频繁,那么可以说图中所有绿色的项集都不频繁,搜索时就要这些项避开,减少计算开销。
机器学习之关联规则理解_第2张图片
同理,如果下图所示,{A,B}这个项集是非频繁的,那虚线框后面的都不用计算了,运用Apriori算法的思想,我们就能去掉很多非频繁的项集,大大简化计算量,当然,面对大规模数据的时候,这种排除还是解决不了问题,于是还有FP-Growth(Frequent pattern Growth,频繁模式增长树)这种更高效的方法。
机器学习之关联规则理解_第3张图片
需要注意的是:

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

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}}

你可能感兴趣的:(机器学习,sklearn,算法,人工智能)