本博客根据周志华的西瓜书和参考资料1、2、3所做的笔记,主要用于学习,非技术类博客,因此存在大量复制粘贴,请见谅。
如果本篇博客有后记部分,则该部分表示的是在书本原有的基础知识上,进行的知识点的扩充。
机器学习中的“规则”(rule)通常是指语义明确、能描述数据分布所隐含的客观规律或领域概念、可写成“若……,则……”形式的逻辑规则. “规则学习” (rule learning)是从训练数据中学习出一组能用于对未见示例进行判别的规则。
其中逻辑蕴含符号 ← \leftarrow ←右边部分称为“规则体”(body),表示该条规则的前提,左边部分称为“规则头” (head),表示该条规则的结果。规则体是由逻辑文字(literal) f k f_k fk组成的合取式(conjunction),其中合取符号 ∩ \cap ∩用来表示“并且”,每个文字 f k f_k fk都是对示例属性进行检验的布尔表达式,例如“(色泽=乌
黑)”或“一(根蒂=硬挺)”.L是规则体中逻辑文字的个数,称为规则的长度.规则头的 ⊕ \oplus ⊕同样是逻辑文字,一般用来表示规则所判定的目标类别或概念,例如“好瓜”,这样的逻辑规则也被称为if-then规则。
显然,规则集合中的每条规则都可看作一个子模型,规则集合是这些子模型的一个集成,当同一个示例被判别结果不同的多条规则覆盖时,称发生了“冲突”(conflict),解决冲突的办法称为“冲突消解”(conflict resolution).常用的冲突消解策略有投票法、排序法、元规则法等。
投票法是将判别相同的规则数最多的结果作为最终结果;排序法是在规则集合上定义一个顺序,在发生冲突时使用排序最前的规则;相应的规则学习过程称为“带序规则”(ordered rule)学习或“优先级规则” (priority rule)学习;元规则法是根据领域知识事先设定一些“元规则” (meta-rule),即关于规则的规则,例如“发生冲突时使用长度最小的规则”,然后根据元规则的指导来使用规则集.
从形式语言表达能力而言,规则可分为两类: “命题规则”(propositional rule)和“一阶规则” (first-order rule).前者是由“原子命题”(propositional atom)和逻辑连接词“与”( ∩ \cap ∩)、“或”( ∪ \cup ∪)、“非”( ¬ \lnot ¬)和“蕴含”( ← \leftarrow ←)构成的简单陈述句; 后者的基本成分是能描述事物的属性或关系的“原子公式” (atomic formula)。一阶规则能够表达复杂的关系,因此被称为“关系型规则”。
规则学习的目标是产生一个能覆盖尽可能多的样例的规则集,最直接的做法是“序贯覆盖”(sequential covering),即逐条归纳:在训练集上每学到一条规则,就将该规则覆盖的训练样例去除,然后以剩下的训练样例组成训练集重复上述过程,由于每次只处理一部分数据,因此也被称为“分治”(separate-and-conquer)策略。
现实任务中一般有两种策略来产生规则:
第一种是“自顶向下” (top-down),即从比较一般的规则开始,逐渐添加新文字以缩小规则覆盖范围,直到满足预定条件为止;亦称为“生成-测试” (generate-then-test)法,是规则逐渐“特化” (specialization)的过程。
第二种策略是“自底向上”(bottom-up),即从比较特殊的规则开始,逐渐删除文字以扩大规则覆盖范围,直到满足条件为止;亦称为“数据驱动”(data-driven)法,是规则逐渐“泛化”(generalization)的过程。
第一种策略是覆盖范围从大往小搜索规则,第二种策略则相反;
前者通常更容易产生泛化性能较好的规则,而后者则更适合于训练样本较少的情形;
此外,前者对噪声的鲁棒性比后者要强得多,因此,在命题规则学习中通常使用第一种策略,而第二种策略在一阶规则学习这类假设空间非常复杂的任务上使用较多。
此外,每次仅考虑一个“最优”文字,这通常过于贪心,易陷入局部最优,为缓解这个问题,可采用一些相对温和的做法,例如采用“集束搜索” (beam search),即每轮保留最优的b个逻辑文字,在下一轮均用于构建候选集,再把候选集中最优的b个留待再下一轮使用。
规则生成本质上是一个贪心搜索过程,需有一定的机制来缓解过拟合的风险,最常见的做法是剪枝(pruning).与决策树相似,剪枝可发生在规则生长过程中,即“预剪枝”,也可发生在规则产生后,即“后剪枝”,通常是基于某种性能度量指标来评估增/删逻辑文字前后的规则性能,或增/删规则前后的规则集性能从而判断是否要进行剪枝。
后剪枝最常用的策略是“减错剪枝”(Reduced Error Pruning,简称 REP),其基本做法是:将样例集划分为训练集和验证集,从训练集上学得规则集R后进行多轮剪枝,在每一轮穷举所有可能的剪枝操作,包括删除规则中某个文字、删除规则结尾文字、删除规则尾部多个文字、删除整条规则等,然后用验证集对剪枝产生的所有候选规则集进行评估,保留最好的那个规则集进行下一轮剪枝,如此继续,直到无法通过剪枝提高验证集上的性能为止。
REP 剪枝通常很有效,但其复杂度是O(m4),m为训练样例数目. IREP(Incremental REP) 将复杂度降到 O ( m l o g 2 m ) O(mlog^2m) O(mlog2m),其做法是:在生成每条规则前,先将当前样例集划分为训练集和验证集,在训练集上生成一条规则r,立即在验证集上对其进行REP剪枝,得到规则 r ′ r' r′;将 r ′ r' r′覆盖的样例去除,在更新后的样例集上重复上述过程,显然,REP是针对规则集进行剪枝,而IREP仅对单条规则进行剪枝,因此后者比前者更高效.
受限于命题逻辑表达能力命题规则学习难以处理对象之间的"关系" (relation),而关系信息在很多任务中非常重要。因此需用一阶逻辑表示,并且要使用一阶规则学习。
所谓一阶逻辑表示其实就是利用比较,将原来的单一的表示用比较的方式来描述。如“色泽更深”。
FOIL (First-Order Inductive Learner) 是著名的一阶规则学习算法,它遵循序贯覆盖框架且采用自顶向下的规则归纳策略,由于逻辑变量的存在,FOIL在规则生成时需考虑不同的变量组合.
例如再西瓜数据集上,对“更好(X,Y)”这个概念,最初的空规则是
FOIL 使用“FOIL增益”(FOIL gain)来选择文字:
其中 m ^ + \hat{m}_+ m^+, m ^ − \hat{m}_- m^−分别为增加候选文字后新规则所覆盖的正反例数, m + m_+ m+, m − m_- m−为原规则覆盖的正反例数。
FOIL增益与决策树使用的信息增益不同,它仅考虑正例的信息量,并且用新规则覆盖的正例数作为权重。这是由于关系数据中正例数往往远少于反例数,因此通常对正例应赋予更多的关注。
若允许将目标谓词作为候选文字加入规则体,则FOIL能学出递归规则;若允许将否定形式的文字 ¬ f \lnot f ¬f作为候选,则往往能得到更简洁的规则集.
FOIL可大致看作命题规则学习与归纳逻辑程序设计之间的过渡,其自顶向下的规则生成过程不能支持函数和逻辑表达式嵌套,因此规则表达能力仍有不足;但它是把命题规则学习过程通过变量替换等操作直接转化为一阶规则学习,因此比一般归纳逻辑程序设计技术更高效。
归纳逻辑程序设计(Inductive Logic Programming,简称 ILP)在一阶规则学习中引入了函数和逻辑表达式嵌套,一方面,这使得机器学习系统具备了更为强大的表达能力;另一方面,ILP可看作用机器学习技术来解决基于背景知识的逻辑程序(logic program)归纳,其学得的“规则”可被PROLOG等逻辑程序设计语言直接使用.
归纳逻辑程序设计采用自底向上的规则生成策略,直接将一个或多个正例所对应的具体事实作为初始规则,再对规则逐步进行泛化以增加其对样例的覆盖率,泛化操作可以是将规则中的常量替换为逻辑变量,也可以删除规则体中的某个文字。
基于归结原理,我们可将貌似复杂的逻辑规则与背景知识联系起来化繁为简;而基于逆归结,我们可基于背景知识来发明新的概念和关系.
归结、逆归结都能容易地扩展为一阶逻辑形式;与命题逻辑的主要不同之处是,一阶逻辑的归结、逆归结通常需进行合一置换操作。
置换: 用某些项来替换逻辑表达式中的变量;
合一: 用一种变量置换令两个或多个逻辑表达式相等。
在现实任务中,ILP系统通常先自底向上生成一组规则,然后再结合最小一般泛化与逆归结做进一步学习。
后记:《机器学习》西瓜书的知识点学习便到此为止了,西瓜书最后一章是强化学习,我另外开了专栏学习强化学习,欢迎阅读。