AI目录:sheng的学习笔记-AI目录-CSDN博客
规则学习:sheng的学习笔记-AI-规则学习(rule learning)-CSDN博客
剪枝:https://blog.csdn.net/coldstarry/article/details/137441167
基础知识
什么是序贯覆盖
规则学习的目标是产生一个能覆盖尽可能多的样例的规则集。最直接的做法是“序贯覆盖”(sequential covering),即逐条归纳:在训练集上每学到一条规则,就将该规则覆盖的训练样例去除,然后以剩下的训练样例组成训练集重复上述过程。由于每次只处理一部分数据,因此也被称为“分治”(separate-and-conquer)策略。
命题规则学习
命题规则的规则体是对样例属性值进行评估的布尔函数,如“色泽=青绿”“含糖率60.2”等,规则头是样例类别。
序贯覆盖法的关键是如何从训练集学出单条规则。对规则学习目标⊕,产生一条规则就是寻找最优的一组逻辑文字来构成规则体,这是一个搜索问题。
流程
概述
给定正例集合与反例集合,学习任务是基于候选文字集合来生成最优规则r.在命题规则学习中,候选文字是形如“R(属性i,属性值i,j)”的布尔表达式,其中属性i表示样例第i个属性,属性值i,j表示属性i的第j个候选值,R(x,y)则是判断x、y是否满足关系R的二元布尔函数。
一个简单的方案是:从空规则“⊕←”开始,将正例类别作为规则头,再逐个遍历训练集中的每个属性及取值,尝试将其作为逻辑文字增加到规则体中,若能使当前规则体仅覆盖正例,则由此产生一条规则,然后去除已被覆盖的正例并基于剩余样本尝试生成下一条规则
穷举法示例分析
以西瓜为例
- 根据第1个样例,生成文字“好瓜”和“色泽=青绿”加入规则,得到好瓜←(色泽=青绿)。
- 这条规则覆盖样例1,6,10和17,其中有两个正例和两个反例,不符合“当前规则仅覆盖正例”的条件。
- 尝试将该命题替换为基于属性“色泽”形成的其他原子命题,例如“色泽=乌黑”;
- 在这个数据集上,这样的操作不能产生符合条件的规则。
- 回到“色泽=青绿”,尝试增加一个基于其他属性的原子命题,例如“根蒂=蜷缩”:好瓜←(色泽=青绿)∧(根蒂=蜷缩)。
- 这条规则不覆盖任何反例,虽然它仅覆盖一个正例,但已满足“当前规则仅覆盖正例”的条件
- 因此保留这条规则并去除它覆盖的样例6,然后将剩下的9个样例用作训练集
最终得到结果:
规则1:好瓜←(色泽=青绿)∧(根蒂=稍蜷);
规则2:好瓜←(色泽=青绿)∧(敲声=浊响);
规则3:好瓜←(色泽=乌黑)∧(根蒂=蜷缩);
规则4:好瓜←(色泽=乌黑)∧(纹理=稍糊)。
注意,为了简便起见,上述只讨论了正例(好瓜),没有覆盖反例(坏瓜)
上面这种基于穷尽搜索的做法在属性和候选值较多时会由于组合爆炸而不可行
优化方式
自顶向下
从比较一般的规则开始,逐渐添加新文字以缩小规则覆盖范围,直到满足预定条件为止;亦称为“生成-测试”(generate-thentest)法,是规则逐渐“特化”(specialization)的过程。
策略是覆盖范围从大往小搜索规则
更容易产生泛化性能较好的规则
自底向上
从比较特殊的规则开始,逐渐删除文字以扩大规则覆盖范围,直到满足条件为止;亦称为“数据驱动”(data-driven)法,是规则逐渐“泛化”(generalization)的过程
策略是覆盖范围从小往大搜索规则
更适合于训练样本较少的情形
对比
- 第一种策略是覆盖范围从大往小搜索规则,第二种策略则相反
- 前者通常更容易产生泛化性能较好的规则,而后者则更适合于训练样本较少的情形,
- 前者对噪声的鲁棒性比后者要强得多。因此,在命题规则学习中通常使用第一种策略,而第二种策略在一阶规则学习这类假设空间非常复杂的任务上使用较多。
示例分析
展示自顶向下的规则生成方法
从空规则“好瓜←”开始,逐一将“属性=取值”作为原子命题加入空规则进行考察。
假定基于训练集准确率来评估规则的优劣,n/m表示加入某命题后新规则在训练集上的准确率,其中m为覆盖的样例总数,n为覆盖的正例数。
如图15.1所示
- 经过第一轮评估,“色泽=乌黑”和“脐部=凹陷”都达到了最高准确率3/4.
- 将属性次序最靠前的逻辑文字“色泽=乌黑”加入空规则,得到 好瓜←(色泽=乌黑)。
- 对上面这条规则覆盖的样例,通过第二轮评估可发现,将图15.1中的五个逻辑文字加入规则后都能达到100%准确率,我们将覆盖样例最多、且属性次序最靠前的逻辑文字“根蒂=蜷缩”加入规则,得到结果 好瓜←(色泽=乌黑)∧(根蒂=蜷缩)
规则生成过程中涉及一个评估规则优劣的标准,在上面的例子中使用的标准是:先考虑规则准确率,准确率相同时考虑覆盖样例数,再相同时考虑属性次序。现实应用中可根据具体任务情况设计适当的标准。
贪心搜索问题
局部最优
在上面的例子中每次仅考虑一个“最优”文字,这通常过于贪心,易陷入局部最优。
为缓解这个问题,可采用一些相对温和的做法,例如采用“集束搜索”(beam search),即每轮保留最优的b个逻辑文字,在下一轮均用于构建候选集,再把候选集中最优的b个留待再下一轮使用。
图15.1中若采用b=2的集束搜索,则第一轮将保留准确率为3/4的两个逻辑文字,在第二轮评估后就能获得下面这条规则,其准确率仍为100%,但是覆盖了3个正例:好瓜←(脐部=凹陷)∧(根蒂=蜷缩)。
剪枝优化
贪心搜索过程,需有一定的机制来缓解过拟合的风险,最常见的做法是剪枝(pruning)。决策树的减枝可参考https://blog.csdn.net/coldstarry/article/details/137441167
剪枝可发生在规则生长过程中,即“预剪枝”,也可发生在规则产生后,即“后剪枝”。通常是基于某种性能度量指标来评估增/删逻辑文字前后的规则性能,或增/删规则前后的规则集性能,从而判断是否要进行剪枝。
剪枝还可借助统计显著性检验来进行。
CN2算法
例如CN2算法在预剪枝时,假设用规则集进行预测必须显著优于直接基于训练样例集后验概率分布进行预测。为便于计算,CN2使用了似然率统计量(Likelihood Ratio Statistics,简称LRS)。令m+,m-分别表示训练样例集中的正、反例数目,分别表示规则(集)覆盖的正、反例数目,则有
是一种信息量指标,衡量了规则(集)覆盖样例的分布与训练集经验分布的差别:LRS越大,说明采用规则(集)进行预测与直接使用训练集正、反例比率进行猜测的差别越大;LRS越小,说明规则(集)的效果越可能仅是偶然现象。在数据量比较大的现实任务中,通常设置为在LRS很大(例如0.99)时CN2算法才停止规则(集)生长。
REP算法(后剪枝)
后剪枝最常用的策略是“减错剪枝”(Reduced Error Pruning,简称REP),其基本做法是:将样例集划分为训练集和验证集,从训练集上学得规则集ℛ后进行多轮剪枝,在每一轮穷举所有可能的剪枝操作,包括删除规则中某个文字、删除规则结尾文字、删除规则尾部多个文字、删除整条规则等,然后用验证集对剪枝产生的所有候选规则集进行评估,保留最好的那个规则集进行下一轮剪枝,如此继续,直到无法通过剪枝提高验证集上的性能为止。
IREP算法(后剪枝)
REP剪枝通常很有效,但其复杂度是O(m的4次方),m为训练样例数目。
IREP(Incremental REP)将复杂度降低,其做法是:在生成每条规则前,先将当前样例集划分为训练集和验证集,在训练集上生成一条规则r,立即在验证集上对其进行REP剪枝,得到规则r′;将r′覆盖的样例去除,在更新后的样例集上重复上述过程。显然,REP是针对规则集进行剪枝,而IREP仅对单条规则进行剪枝,因此后者比前者更高效。
RIPPER算法
RIPPER全称Repeat-ed Incremental Pruning to Produce Error Reduction,WEKA中的实现称为JRIP。
若将剪枝机制与其他一些后处理手段结合起来对规则集进行优化,则往往能获得更好的效果。RIPPER,其泛化性能超过很多决策树算法,而且学习速度也比大多数决策树算法更快,奥妙就在于将剪枝与后处理优化相结合
图15.2中重复次数取值k时亦称RIPPERk,例如RIPPER5意味着k=5.
RIPPER优化策略原因:最初生成ℛ的时候,规则是按序生成的,每条规则都没有对其后产生的规则加以考虑,这样的贪心算法本质常导致算法陷入局部最优;RIPPER的后处理优化过程将ℛ中的所有规则放在一起重新加以优化,恰是通过全局的考虑来缓解贪心算法的局部性,从而往往能得到更好的效果
多类问题
由于序贯覆盖法简单有效,几乎所有规则学习算法都以它为基本框架。它能方便地推广到多分类问题上,只需将每类分别处理即可:当学习关于第c类的规则时,将所有属于类别c的样本作为正例,其他类别的样本作为反例。
参考资料
机器学习 书