西宁兄,庆兄:
关于关联规则阈值的使用方式和时机,从业务上来说似乎不太好说,我手头也没有太好的例子。最近一直在研究关联规则算法中阈值的使用时机问题,现先将思路整理如次,具体的详细论证可能还需要一些时日。
1:使用阈值的目的何在?
阈值的使用是为了获取合乎约束的规则,也就是说是为了筛选自认为有用的规则。
关联规则的是事物之间的普遍联系。关联规则从本质上说是一种普遍联系的反映,通过一种特定的衡量方式来描述事物之间的某种特定联系,而这种衡量的方式就是统计学原理。它通过统计并分析大量的已经存在的单个事务间多个事物的内在联系来寻找事物间的普遍联系。
2:什么样的规则才是有用的规则?
规则是否有用最后谁说了算?用户,当然是最终用户。用户说有用才有用,不然即便各类阈值设定的再完美,也没有什么价值。至于关联规则的有用与否的分类,我比较赞同如下的分法:
(1):有用的
有用的规则是指对用户有帮助的规则。如著名的啤酒和尿布的故事。
(2):价值不高的
价值不高的规则是业务领域内众所周知的规则。例如,发现购买电视延长保修期的人通常也会购买电视机—因为没有电视保修期是无意义的;比如,原本原本知道某门课程A是学校规定学生必选的课程,而用课程A推选出来的规则对用户而言意义也不大,价值也不高。
( 3):令人费解的
这类规则并不明显,也不一定没有用处,但并不具有明显的商业价值。如发现只有当新的五金店开张时盥洗室的门把手才会卖的好。没有明显的原因证明会导致这种趋势的出现,为什么人们只有当新五金店开张时才需要盥洗室的门把手?这其中似乎隐含着某种规律性,但是其中的原因我们并不清楚。
所以,关联规则有用与否的评定权紧紧的握在用户的手里面,但因为关联规则算法的原理基于统计学方法,所以从数学的角度,引申出来了一些阈值,称为客观性度量标准。另外还有一些主观性度量的阈值,主要取决于用户的意愿,带有比较明显的主观性质。
3:客观性评价指标类阈值
这类阈值主要有:支持度,置信度,提升度
如:支持度是用来衡量项集在事务集中出现的频率。
置信度是用来描述在出现关联规则左件(左项)的前提下又出现关联规则右件(右项)的概率。置信度: P(B|A),即在出现项集A的事务集D中,项集B也同时出现的概率。
提升度是用来衡量关联规则左件与右件独立性的指标,也就是概率论中的 P(AB)/P(A)P(B)。
4:主观性评价指标类阈值
这类阈值主要有:新颖度,用户感兴趣度,简洁度
新颖度是将新产生的关联规则与已经存在的知识库中规则进行比对后得出的一个指标,这个和专家库息息相关,在科学研究领域应用比较多,在商务领域应用比较少。
用户感兴趣度就是为了满足用户只想看包含自己想看的项的规则而设定的指标,比如用户在业务进行中对某个项比较感兴趣,她就可以指定计算与这个项相关的规则。
简洁度就是指定规则或者项集的宽度。简洁度(记为CN)是用来衡量关联规则的最终可理解程度的指标。它也表现在两个方面:一方面表现在规则的个数上,如果规则项数很多将不利于对这条规则的理解。因此,规则的项数越少,规则的简洁性越好。另一方面表现在规则所包含的抽象层次上,规则包含的抽象层次越高,它对应的解释力越强。
这个指标在apriori系列算法中颇为有用。其他指标适用于关联规则的所有不同算法。
关联规则的实现总体可以分为两大步骤:一是频繁项集的获取,二是关联规则的生成。
5:apriori算法中各阈值的设定时机探讨
5.1:应用Apriori算法的现存工具
现在几乎所有的现成工具中使用的的联规则算法是apriori"系列"算法,如sas中的enterprise minier,microsoft 的ssas使用的是priori算法,另外,IBM是关联规则apriori算法的传造者,是否使用就不言而喻了。所以这里先讨论apriori算法中各阈值的设定时机,如有机会,对Fp-Growth中使用各阈值的时机仍会作一个讨论。
5.2:Apriori算法
详见ttnn 矩阵:
Apriori算法总体可以分为两大步骤实现,一是频繁项集的获取,二是关联规则生成。关联规则的生成算法相对固定,因此挖掘关联规则的总体性能由第一步决定,第二步相对容易实现。
5.3:Apriori算法中的频繁项集生成
Apriori首先产生频繁1-项集L1,然后是频繁2-项集L2,直到有某个r值使得Lr为空,这时算法停止。这里在第k次循环中,过程先产生候选k-项集的集合Ck,Ck中的每一个项集是对两个只有一个项不同的属于Lk-1的频集做一个(k-2)-连接来产生的。Ck中的项集是用来产生频集的候选集,最后的频集Lk必须是Ck的一个子集。Ck中的每个元素需在交易数据库中进行验证来决定其是否加入Lk,这里的验证过程是算法性能的一个瓶颈。这个方法要求多次扫描可能很大的交易数据库,即如果频集最多包含10个项,那么就需要扫描交易数据库10遍,这需要很大的I/O负载。
在频繁项集生成步骤中需要统计的关键指标:总事务数,每个项集出现的频次
在频繁项集生成步骤中可以引入的阈值有:支持度,简洁度
在本阶段引入支持度的原因和目的:
1:从数学角度分析,好像不需要什么阈值。(迷惑ing)
2:频繁项集产生的初始步骤是产生频繁一项集,频繁一项集定义为支持度大于最小支持度的一项集称为频繁1项集,所以此时需要指定最小支持度;
3:候选项集的产生是频繁项集进行叉积的结果。因此频繁项集的多少(或者可以称之为频繁项集集合的大小)是影响算法效率的关键因素之一。因此,设定最小支持度,通过进行剪枝操作,可以对参与运算的频繁项集进行控制;
在本阶段引入简洁度的原因和目的:
1:确定了项集的SIZE也就确定了扫描事务数据库的次数。
2:项集size的大小不仅决定了扫描次数,对关联规则的生成效率也有较大影响。
3:过多事物之间的线性联系容易造成规则解读上的困难。如,重点不突出。
支持度大小对关联规则筛选的影响:
1:支持度越大,关联规则越有分量吗?
2:支持度越小,关联规则的有用性就越小吗?
3:支持度阈值的最大缺点是什么?
我试图自问自答:
支持度阈值设定的越高,所求得的频繁项集数目(&关联规则数目)越少,且频繁项集(&关联规则)出现的频次也相应越高(出现频次低的项都被无情的抛弃了),但此时容易出现的情况是:最后获取的关联规则是有价值但价值不高的规则(价值不高的规则是业务领域内众所周知的规则。例如,发现购买电视延长保修期的人通常也会购买电视机—因为没有电视保修期是无意义的)此时最可恨是发现了已经发现过的,抛弃了有可能很有用的规则。试问60%的概率和59%的概率区别会有多大?但当支持度阈值设定在0.6的时候,那么支持度为0.59的规则就会被无情的淘汰。支持度越低,关联规则的可用性就会越小?未必见得,但苦于无现实例子说服,只能凭直觉。总体感觉是这样,0.03也就是3%的支持度阈值应该算低的吧,100个里面出现3个纯属小概率事件,但是我们知道大多数数据挖掘面对的都是数以十万计百万计的事务,十万*
0.03=3000,当有三千个同类出现的时候,整体也较为可观了吧,如果百万计呢?
另外一点,就是支持度对关联规则的求取到底起到的是什么作用?我试图从算法执行的过程来分析一下:对于apriori算法,如果支持度阈值设为0(亦即没有支持度阈值的限制),那么所发现的项集应该都能被称为频繁项集。我们先从1项频繁集作起,此时的一项频繁集就是事务集中所包含的所有的项的集合,真正做到了关联规则的无目标性挖掘(体现事务是普遍联系的,狗屁哲学,没有区分的联系,没有重点的联系对于用户来说就是一团烂麻,一陀大便)。然后在生成2项候选项集的时候不需要支持度阈值,对2项候选集进行剪枝时也不需要支持度阈值(此时将生成所有在事务集中存在的2项集并作为频繁2项集使用),同样的推理,进行n项频繁集生成的过程中都可以忽略支持度阈值的存在。
也就是说,从数学的角度而言,支持度阈值是可有可无的。但是,从算法的效率角度分析(减少了参与计算的项,增加了与阈值进行比对的代价,所以对算法效率的支撑也是一个相对的概念,从绝大多数的情况来看,支持度的不同对算法效率的影响是很大的),从用户筛选规则的便利性角度分析,从抓住主要矛盾的观点分析支持度阈值是必须的
,所以,我认为引入支持度阈值的目的在于规则筛选&算法效率。但是,有利总归会有弊端。支持度阈值的引入解决了规则筛选&算法效率的问题,却带来了一个最大的,被无数人诟病的的问题:会丢失可能有用的规则。(几乎所有的阈值都会有类似的境况)这恐怕也是大多数人在阈值设定上存在犹豫、疑惑的原因吧。
(人性中最大的弱点:贪婪与恐惧在此暴露)
说了这么多还没有牵涉到具体到阈值设定的大小该如何去思考,该遵循怎样的思路。我的想法是先将这几个代表性的阈值解读后,能有一个综述性的阈值设定的思路。这需要大家多讨论,共同探讨一下究竟该怎样去思考阈值的设定。
明天放假,今天先写这么多。下面还有关于关联规则其他阈值的解读以及阈值确定的思路。祝各位假期愉快!多多讨论。