从零开始-Machine Learning学习笔记(31)-规则学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kabuto_hui/article/details/84594421

1. 基本概念

   “规则学习” (rule learning)是从训练数据中学习出一组能用于对未见示例进行判别的规则。 形式上一般为:

式子中,右边的部分称为规则体(Body),表示该条规则的前提,由一系列逻辑文字(Literal) f k f_k 组成的合取式,合取符号 \bigwedge 表示“并且”。左边的部分称为 逻辑头(Head),表达该条规则的结果,也是逻辑文字,一般用来表示规则所判定的目标类别或概念。
  规则集合中的每条规则都可看作一个子模型,规则集合是这些子模型的一个集成。当同一个示例被判别结果不同的多条规则覆盖时,称发生了"冲突" (conflict),解决冲突的办法称为 “冲突消解” (conflict resolution)。常用的冲突消解策略有投票法、排序法、元规则法等。

  从形式语言表达能力而言,规则可以分为两类:
命题规则(Propositional rule):是由"原子命题" (propositional atom)和逻辑连接词"与"( \bigwedge )、“或”(V)、“非"和"蕴含” (←)构成的简单陈述句;
一阶规则(First-order rule):基本成分是能描述事物的属性或关系的"原子公式" (atomic formula)。

2. 序贯覆盖

  规则学习的目标是产生一个能覆盖尽可能多的样例的规则集。最直接的做法是 “序贯覆盖”(sequential covering),即逐条归纳:在训练集上每学到一条规则,就将该规则覆盖的训练样例去除,然后以剩下的训练样例组成训练集重复上述过程。由于每次只处理一部分数据,因此也被称为"分治" (separate-and-conquer) 策略。
  但是这种基于穷尽搜索的做法在属性和候选值较多时会由于组合爆炸而不可行。现实任务中一般有两种策略来产生规则:
"自顶向下"(Top-down):即从比较一般的规则开始,逐渐添加新文字以缩小规则覆盖范围,直到满足预定条件为止;亦称为"生成-测试"(generate-then-test)法,是规则逐渐"特化" (specialization)的过程;
"自底向上"(Bottom-up):,即从比较特妹的规则开始,逐渐删除文字以扩大规则覆盖范围,直到满足条件为止;亦称为"数据驱动" (data-driven)法,是规则逐渐"泛化"(generalization)的过程。
  由于序贯覆盖法简单有效,几乎所有规则学习算法都以它为基本框架。它能方便地推广到多分类问题上,只需将每类分别处理即可:当学习关于第c类的规则时,将所有属于类别c的样本作为正例,其他类别的样本作为反例。

3. 剪枝优化

  规则生成本质上是一个贪心搜索过程,需有一定的机制来缓解过拟合的风险,最常见的做法是剪枝(pruning)。与决策树相似,剪枝可发生在规则生长过程中,即"预剪枝"也可发生在规则产生后,即"后剪枝"通常是基于某种性能度量指标来评估增/删逻辑文字前后的规则性能,或增/删规则前后的规则集性能,从而判断是否要进行剪枝。

3.1 预剪枝-CN2算法

预剪枝可以借助统计显著性检验来进行,CN2算法在预剪枝的时候,假设用规则集进行预测必须显著优于直接基于训练样例集后验概率分布进行预测。 CN2算法使用了似然率统计量(Likelihood Ratio Stl1tistics, LRS),用m+与m-表示训练样本中正反样本的数量, m + m_{+}^{'} m m_{-}^{'} 表示规则所覆盖的正反样本数量,于是有:

上式实际上是一种信息量指标,衡量了规则(集)覆盖样例的分布与训练集经验分布的差别: LRS越大,说明采用规则(集)进行预测与直接使用训练集正、反例比率进行猜测的差别越大; LRS越小,说明规则(集)的效果越可能仅是偶然现象。

3.2 后剪枝-RIPPER算法

  后剪枝最常用的策略是"减错剪枝"(Reduced Error Pruning, REP),其基本做法是:将样例集划分为训练集和验证集,从训练集上学得规则集R后进行多轮剪枝,在每一轮穷举所有可能的剪枝操作,包括删除规则中某个文字、删除规则结尾文字、删除规则尾部多个文字、删除整条规则等,然后用验证集对剪枝产生的所有候选规则集进行评估,保留最好的那个规则集进行下一轮剪枝,如此继续,直到无法通过剪枝提高验证集上的性能为止。 这种方法与在决策树一章中的思路其实类似:都是判断剪枝前后的性能,如果剪枝后性能提升就执行剪枝操作。
  REP剪枝比较有效,但是其复杂度在$O(m^4)$。于是有了可以将复杂度将为$O(mlog^2 m)$的IREP(Incremental REP)方法:在生成每条规则前,先将当前样例集划分为训练集和验证集,在训练集上生成一条规则r,立即在验证集上对其进行REP剪枝,得到规则r’;将r’覆盖的样例去除,在更新后的样例集上重复上述过程。 显然,REP是针对规则集进行剪枝,而IREP仅对单条规则进行剪枝,因此后者比前者更高效。
  若将剪枝机制与其他一些后处理手段结合起来对规则集进行优化,则往往能获得更好的效果,RIPPER(Repeated Incremental Pruning to Produce Error Reduction, RIPPER)算法就是其中的代表:先使用 I R E P IREP^{*} (IREP的改进版,主要用 m + + ( m m ) m + + m \frac{m_{+}^{'}+(m_- - m_{-}^{'})}{m_+ + m_-} 取代了IREP使用的准确率作为规则性能度量指标,在剪枝时删除规则尾部的多个文字,并在最终得到规则集之后再进行一次IREP剪枝。)剪枝机制生成规则集R。其算法描述如下:

4. 一阶规则学习

  受限于命题逻辑表达能力命题规则学习难以处理对象之间的"关系" (relation),而关系信息在很多任务中非常重要。因此需用一阶逻辑表示,并且要使用一阶规则学习。所谓一阶逻辑表示其实就是利用比较,将原来的单一的表示用比较的方式来描述,如花的颜色为淡红色,另一只花的颜色比第一只更红。 于是其表达形式变化不大,还是由逻辑头和逻辑体构成,但是描述方式发生了变化:
( X Y ) ( X Z ) ( Z Y ) 更好(X,Y) ← 更好(X,Z) \bigwedge 更好(Z,Y)
无论是逻辑头还是逻辑体都变成了“更好(X,Y)”的形式,表示X比Y更好。

  FOIL(First-Order Inductive Learner)算法是著名的一阶规则学习算法,它遵循序贯覆盖框架旦采用自顶向下的规则归纳策略。FOIL使用 “FOIL增益”(FOIL gain) 来选择文字:
F G a i n = m + × ( l o g 2 m + m + + m l o g 2 m + m + + m ) F_Gain = m_{+}^{'} \times (log_2 \frac{m_{+}^{'}}{m_{+}^{'}+m_{-}^{'}} - log_2 \frac{m_+}{m_+ + m_-})
其中, m + m_{+}^{'} m m_{-}^{'} 分别为增加候选文字后新规则所覆盖的正、反例数, m + m_+ m m_- 为原规则覆盖的正、反例数。FOIL 增益与决策树使用的信息增益不同,它仅考虑正例的信息量,并且用新规则覆盖的正例数作为权重。这是由于关系数据中正例数往往远少于反例数,因此通常对正例应赋予更多的关注。

  FOIL可大致看作命题规则学习与归纳逻辑程序设计之间的过渡,其自顶向下的规则生成过程不能支持函数和逻辑表达式嵌套,因此规则表达能力仍有不足;但它是把命题规则学习过程通过变量替换等操作直接转化为一阶规则学习,因此比一般归纳逻辑程序设计技术更高效。

5. 归纳逻辑程序设计(ILP)

  归纳逻辑程序设计(Inductive Logic Programmi, ILP) 在一阶规则学习中引入了函数和逻辑表达式嵌套。

5.1 最小一般泛化

  归纳逻辑程序设计采用自底向上的规则生成策略,直接将一个或多个正例所对应的具体事实(grounded fact)作为初始规则,再对规则逐步进行泛化以增加其对样例的覆盖率。泛化操作可以是将规则中的常量替换为逻辑变量,也可以是删除规则体中的某个文字。
以一下的例子用于辅助理解:
( 1 10 ) ( 1 10 ) ( 1 10 ) ( 1 10 ) ( 1 10 ) ( 1 15 ) ( 1 15 ) ( 1 15 ) ( 1 15 ) 更好(1 , 10) ← 根蒂更蜷(1 , 10) \wedge 声音更沉(1 , 10) \wedge脐部更凹(1 , 10)\wedge触感更硬(1 , 10) \\ 更好(1 , 15) ←根蒂更蜷(1 , 15) \wedge 脐部更凹(1 , 15) \wedge触感更硬(1 , 15)

首先取出左边相同的逻辑文字:根蒂更蜷,脐部更凹,触感更硬;将相同的位置的10和15用Y代替,于是就有了更一般的表达:
( 1 Y ) ( 1 Y ) ( 1 Y ) ( 1 Y ) 更好(1 ,Y) ←根蒂更蜷(1 ,Y) \wedge 脐部更凹(1 , Y) \wedge触感更硬(1 , Y)
这个时候再来了另外的一个规则:
( 2 10 ) ( 2 10 ) ( 2 10 ) ( 2 10 ) ( 2 10 ) ( 2 10 ) 更好(2 , 10) ←颜色更深(2 , 10) \wedge根蒂更蜷(2 , 10) \wedge敲声更沉(2 , 10) \wedge脐部更凹(2 , 10) \wedge触感更硬(2 , 10)
这里是2比10更好,于是我们令比10差的规则 L C G ( 10 , Y ) = Y 2 LCG(10, Y) = Y_2 ,再取出两个规则重复的部分:根蒂更蜷,脐部更凹,触感更硬;再另 L C G ( 2 , 1 ) = X LCG(2,1)=X ,于是规则又可以一般化为:
( X Y 2 ) ( X Y 2 ) ( X Y 2 ) ( X Y 2 ) 更好(X ,Y_2) ←根蒂更蜷(X ,Y_2) \wedge 脐部更凹( X, Y_2) \wedge触感更硬(X , Y_2)

5.2 逆归结

  1965年,逻辑学家J. A. Robinson提出:一阶谓词演算中的演绎推理能用一条十分简洁的规则描述,这就是数理逻辑中著名的归结原理(resolution principle)。二十多年后,计算机科学家s. Muggleton 和w. Buntine针对归纳推理提出了"逆归结" (inverse resolution)。
所谓归结,就是基于合取范式的操作:
L = L 1 = ¬ L 2 C 1 = A L C 2 = B ¬ L C = C 1 C 2 = ( A L ) ( B ¬ L ) = A B ¬ L L = A B 假设:L=L_1= \neg L_2\\ C_1=A \vee L\\ C_2 = B \vee \neg L \\ 令:C=C_1 \vee C_2\\ =(A \vee L) \vee( B \vee \neg L)\\ =A \vee B \vee \neg L \vee L\\ =A \vee B

于是就得到了归结项: C = A B C=A \vee B

与上面的过程相反,逆归结研究的是在己知C 和某个 C i C_i 的情况下如何得到 C j ( i j ) C_j(i \neq j) 。 假定己知 C C 1 C 2 C和C_1求C_2 , 则由式(15.7) ,该过程可表述为:
C 2 = B ¬ L = ( C A ) ¬ L = ( C ( C 1 L ) ) ¬ L C_2=B \vee \neg L\\ =(C-A) \vee \neg L\\ =(C-(C_1-L)) \vee \neg L
在逻辑推理实践中,定义了4种完备的逆归结:

  归结、逆归结都能容易地扩展为一阶逻辑形式;与命题逻辑的主要不同之处是,一阶逻辑的归结、逆归结通常需进行合一置换操作:
置换: 用某些项来替换逻辑表达式中的变量;
合一: 用一种变量置换令两个或多个逻辑表达式相等。
在现实任务中,ILP系统通常先自底向上生成一组规则,然后再结合最小一般泛化与逆归结做进一步学习。

猜你喜欢

转载自blog.csdn.net/kabuto_hui/article/details/84594421
今日推荐