机器学习算法基本型 关联规则(笔记)
引言
有一个很经典的例子:超市里面发现,尿布和啤酒,经常出现在同一张购物单上。这两个毫不相干的事情,为什么会产生联系?后来发现,原来是因为,有时候母亲在家中照看婴儿,父亲会去超市购买尿布。父亲在购买尿布的同时,往往会顺便为自己购买啤酒,这样,啤酒与尿布这两件看上去不相干的商品,就经常会出现在同一个购物篮中。这就是一个关联规则。
关联规则能解决什么问题?
比如,上面的例子,我们或许就可以解决三个问题:
相关概念
假设,我们知道上述例子的一些统计信息:

支持度(Support)

两者共同出现次数占总销售次数的比例。比如 n2是5次购买中,购买尿布的次数,为3;n3是5次购买中,购买啤酒的次数,为4;n1为n2和n3的交集,即同时购买尿布和啤酒的次数,为3;n4为购买的总次数,为5。所以,购买{尿布} 也会 购买{啤酒}的支持程度:n1/n4 = 3/5 ,即:60%的交易中他们共同出现了。这里注意,支持度衡量的是两者同时出现的次数,所以分子是交集,结果具有对称性。即购买尿布也会购买啤酒的支持度,和购买啤酒也会购买尿布的支持度,是一样的。使用时,可以设置最小支持度,来过滤一些不需要的规则。
置信度(Confidence)
那么,究竟是啤酒促进了尿布的销量,还是尿布促进了啤酒的销量呢?这就通过置信度来衡量的:两者共同出现次数占前者出现次数的比例。
{尿布}-->{啤酒}的置信度:n1/n2 = 3/3;
{啤酒}-->{尿布}的置信度:n1/n3 = 3/4;
所以,{尿布}-->{啤酒},比 {啤酒}-->{尿布} 更让人信服,也就是买尿布的更可能同时也买啤酒,而买啤酒的也去买尿布的情况,概率没那么大。使用时,可以设置最小置信度,来过滤一些不需要的规则。
强相关?负相关?

然而,这条规则是具有误导性的,因为单独购买视频的概率是75%,甚至高于规则中所显示的 66%。这意味,如果我买了电脑游戏,反而会令视频的购买量下降。电脑游戏和视频之间是负相关的!如果没有充分理解这一现象,就很容易根据上面的规则做出不明智的商业决策。同时也说明,关联规则 A ⇒ B 的置信度(confidence)具有欺骗性,它并不能唯一地去衡量 A 和 B 之间相关性或因果关系的强度。因此,在数据挖掘中,除了传统的支持度–置信度(support–confidence)框架之外,同时也使用其他指标或方法来发现更有意义的数据关系也是十分必要的。
转化效率/提升度(Lift)
为了避免上面的负相关问题,了解真正可以促进销售的关系,引入了这个概念:转化效率/提升度(Lift)。Lift = 置信度 / 后者在总销售记录的比例 ,针对 {尿布}-->{啤酒} 的数据关系,Lift = (n1/n2) / (n3/n4) ,即:
• 检查B的基础概率(太高时Lift容易被夸大)
• 检查样本量(太小时Lift不稳定)
• 是否存在混杂因素,如时间/季节/性别等,进一步进行分组分析(辛普森悖论)
因此,在数据挖掘中,构建模型,得出一个关系结论,一定要结合各种指标去判断它是否可靠,比如支持度、置信度、提升度、确信度、卡方检验等。而即使基于很多指标,判断这个关系足够靠谱,也依然要持怀疑态度,明白它可能并非100%正确的。它只是,相对靠谱。带着这种“相对靠谱”的结论去做决策时,要考虑容错机制,要有A/B测试验证的测试策略,要持续监控效果。数据挖掘不是寻找真理,而是构建一个“当前证据下最靠谱的假设”,然后用业务实践去检验它。
关联规则算法--Apriori算法
相关概念
1、项(Item):每一个可被购买或出现的对象称为一个项(Item);
算法流程

算法发现关联规则的计算过程

第一次迭代:每个单个项都被视为一个候选1-项集C1的成员。对C1中的每一个候选1-项集进行扫描,统计C1中每个项在数据集中出现的次数(即支持计数)。筛选出满足最小支持计数的候选项,生成频繁1-项集。

第二次迭代:算法通过对 L1*L1 进行连接操作,生成一个候选2-项集。对C2中的每一个候选2-项集进行扫描,统计C2中每个项在数据集中出现的次数(即支持计数)。筛选出满足最小支持计数的候选项,生成频繁2-项集。

第三次迭代:算法通过对 L2*L2 进行连接操作,生成一个候选3-项集。此时每个项有3项,开始存在非频繁的非空子集。此次迭代,我们是为了求得频繁3-项集。所以为了提高算法效率,根据频繁项集的每个非空子集也必须是频繁的,对当前候选3-项集中,已经存在非频繁非空子集的3-项集进行剪裁。
Tips:快速比对是否存在非频繁子集,可以对每个候选3-项集的非空2-项子集,直接和频繁2-项集L2比对,非空2-项子集没有出现在L2的候选3-项集,就可以直接裁剪了,不需要和原数据集挨个比对了。

对剪裁后的C3中的每一个候选3-项集进行扫描,统计C3中每个项集在数据集中出现的次数(即支持计数)。筛选出满足最小支持计数的候选项,生成频繁3-项集。

第四次迭代:算法通过对 L3*L3 进行连接操作,生成一个候选4-项集 C4 = {I1,I2,I3,I5}。和频繁3-项集L3比对,{I2,I3,I5}不在L3中,所以直接剪裁。此时,C4 = ∅,无候选4-项集,本次不需要再次迭代,算法终止。所有频繁项集均已被发现,即:L1,L2,L3。
根据频繁项集生成强关联规则:频繁项集被发现后,生成强关联规则就变得非常直接。强关联规则,必须同时满足最小支持度和最小置信度。对每个频繁项集 X,可以生成规则:A⇒(X−A),∀A⊂X,A不为∅。其中 A 是 X 的非空子集,X − A 是剩余项集。也就是通过A,可以发现 X-A 。由于规则是从频繁项集生成的,每条规则天然满足最小支持度,只需检查置信度。若置信度 ≥ 最小置信度,则该规则为强关联规则。比如,对{I1, I2, I5 },所有非空子集为{I1, I2}, {I1,I5}, {I2, I5}, {I1}, {I2 }, {I5 }.根据置信度公式,交集/前项的概率,这里都用次数,可以得到每个关系的置信度结果。这其中,置信度大于等于要求的关系,就是强关联规则,比如我要求大于等于50%,那么第4,5条就不符合,可以剪除了:

同样的方法,依次得到每个频繁项集中,满足要求的强关联规则。
Apriori算法的瓶颈
1、宽度优先(逐层)搜索:可能需要生成大量候选集。如,若存在10的四次方个频繁1项集,Apriori算法可能需要生成超过10的七次方个候选 2项集;
2、频繁扫描数据库:需要多次扫描整个数据库,对大量候选集进行模式匹配检查;
3、计算开销大:需要遍历每条事务记录来计算候选项集的支持度,成本较高。
因此,Apriori算法适用于数据量适中、更新不频繁、需要挖掘明确关联规则的离线分析场景。
关联规则算法--FP-Growth算法
一种基于频繁模式增长(Frequent Pattern-Growth)的挖掘方法,是Apriori算法的改进。FP-Growth算法,采用深度优先的搜索策略,无需候选项集生成,即可发现频繁项集。它是利用局部频繁项,从短模式逐步增长成长模式,仅在条件数据库中进行挖掘,避免全局候选爆炸。
算法流程
算法发现关联规则的计算过程
依然基于这个例子进行说明。


4)对上述重排后的每一条事务都会在 FP-tree 中创建一条分支。为了便于对 FP-tree 的遍历,构建了一个项头表(item headertable),使得每个项可以通过节点链(node-links)指向其在树中所有出现的位置。扫描完所有事务后得到的 FP tree,以及与之对应的节点链,如图所示:


FP-Growth算法的特点
-
高选择性 = 在全校找“身高2.2米以上的人”(很少)
-
低选择性 = 在全校找“身高1.6米以上的人”(很多)
FP-Growth采用从低频到高频的处理顺序:先处理最不频繁的项(I5、I4),后处理较频繁的项(I3、I1),不处理最高频的项(I2)。这也是FP算法提升效率的核心,可以快速剪枝、快速收敛、避免指数级爆炸。FP-tree 的大小不会超过原始数据库(不计节点链和计数字段,因为这是为了让算法高效运行而附加的“工具”或“元数据”,与树的规模无关),它以前缀路径为单位存储,将所有事务中相同的前缀合并。比如,I2作为根节点下的第一个节点,无论它在多少条事务中出现,在每棵FP树中只存一次,只是把它的计数(count)设为7。FP-tree通过共享前缀,消除了原始数据中项在事务间的重复存储;


关联算法在WEKA里的指标说明

本文来自博客园,作者:1234roro 当你迷惘的时候,开始学习吧!当你目标清晰的时候,开始学习吧!转载请注明原文链接:https://www.cnblogs.com/1234roro/p/19648010
浙公网安备 33010602011771号