zoukankan      html  css  js  c++  java
  • 规则学习

    周志华 第15章 看到有人总结很详细:http://blog.csdn.net/fjssharpsword/article/details/72674841

    详细介绍就不写了,写一下自己看的时候觉得重要的东西,便于自己回顾。。。。

    规则学习概念:机器学习中的规则(rule)通常是指语义明确、能描述数据分布所隐含的客观规律或领域概念、可写成"若…则…"形式的逻辑规则。规则学习(rulelearning)是从训练数据中学习出一组能用于对未见示例进行判别的规则。
    
    规则学习在某些方面优于神经网络,支持向量机。它有更好的可解释性。数理逻辑局以极强的表达能力。描述能力在处理一些高度复杂的AI任务时具有显著的优势。例如在问答系统中有时可能遇到非常多、甚至无穷种可能的答案,此时若能基于逻辑规则进行抽象表达或者推理则将带来很大便利。
    

      

    在一个规则集合中,有很多规则。一个示例被判别结果不同的多条规则覆盖时,称发生了“冲突”。解决方法(冲突消解conflict resolution):
    
    1、投票法:将判别相同的规则数最多的结果作为最终结果
    
    2、排序法:在规则集合上定义一个顺序,在发生冲突时使用排序最前的规则;相应的规则学习过程称为“带序规则”(ordered rule)学习或“优先级规则”学习。
    
    3、元规则法:根据领域知识事先设定一些“元规则”(mete-rule),即关于规则的规则,例如“发生冲突时使用长度最小的规则”,然后根据元规则的指导来使用规则集。

    默认规则:

      从训练集学得的规则集合也许不能覆盖所有可能未见示例(属性数目过多时时常出现)。因此,规则学习算法通常会设置一条“默认规则-default rule”(或称缺省规则),由它来处理集合未覆盖的样本;例如加一条默认规则:“未被规则1、2 覆盖的都不是好瓜”。也就是为了判断规则集合原有规则无法判断的示例。

    规则分类:
    
    1、“命题规则”:由“原子命题”和逻辑连接词“与”、“或”、“非”、“蕴含”构成的简单陈述句。
    
    2、“一阶规则”:基本成分是能描述事物的属性或关系的原子公式(atomic formula)。如表达父子关系的谓词(predicate)父亲(X,Y)就是原子公式;再比如加一操作add(x)=x+1。
    
    一阶规则能表达复杂的关系,因此也被称为关系型规则(relational rule)。如果进一步用“谓词”——“自然数(X)”表示X是自然数,任意X。加入全称量词,用于限定变量的取值范围,称为“量词”(quantifier)。
    

      

    以西瓜集为例,简单地把属性当作谓词来定义示例与属性值之间的关系,则命题规则集R可改写为一阶规则集R*:

    显然,从形式语言系统的角度来看,命题规则是一阶规则的特例。因此一阶规则的学习比命题规则要复杂得多。

    序列覆盖:
    
      规则学习的目标是产生一个能覆盖尽可能多的样例的规则集,最直接的做法是“序贯覆盖”。
      即逐条归纳:在训练集上每学到一条规则,就将该规则覆盖的训练样例去除,然后以剩下的训练样例组成训练集重复上述过程。由于每次只处理一部分数据,因此也称为分治(separate-and-conquer)策略。

    这种基于穷尽搜索的做法在属性和候选值较多时会由于组合爆炸而不可行。一般有两种策略来产生规则:
    
    1)自顶向下(top-down),即从比较一般的规则开始,逐渐增加新文字以缩小规则覆盖范围,直到满足预定条件为止,也称为生成-测试(generate-then-test)法,是规则逐渐特化(specialization)的过程,是从一般到特殊的过程;
    
    (一般的规则是:例如不含任何属性的空规则,它覆盖所有的样例,就是一条比较一般的规则)
    
    2)自底向上(bottom-up),即从比较特殊的规则开始,逐渐删除文字以扩大覆盖范围,直到满足条件为止;也称为数据驱动(data-driven)法,是规则逐渐泛化(generalization)的过程,是从特殊到一般的过程。
    
    (特殊的规则是:例如直接以某样例的属性取值形成规则,该规则仅覆盖此样例,就是一条比较特殊的规则)
    
    自顶向下是覆盖范围从大到小搜索规则,自底向上则正好相反;前者更容易产生泛化性能较好的规则,而后者更适合于训练样本较少的情形;另外,前者对噪声的鲁棒性比后者要强;因此,在命题规则学习中通常使用前者,而后者则在一阶规则学习这类假设空间非常复杂的任务使用较多。
      
    

      

    文中给出了西瓜集例子,展示自顶向下的规则生成方法。例子中规则生成过程设计一个评估规则优劣的标准,例子中给出的标准是:

    1、先考虑规则准确率(准确率=n/m。n:规则覆盖的正例数,m:覆盖的样例总数)
    
    2、准确率相同时,考虑覆盖样例数,
    
    3、准确率、覆盖样例数都相同时考虑属性次序。
    

      

    现实应用中可根据具体任务情况设计适当的标准。例子中每次仅考虑一个最优文字,过于贪心,容易陷入局部最优,为缓解这个问题,采用集束搜索(beam search),即每轮保留最优的b个逻辑文字,在下一轮均用于构建候选集,再把候选集中最优的b个留待下一轮使用。

    序贯覆盖法简单有效,几乎所有规则学习算法都以其为基本框架,也能方便地推广到多分类问题上,只需将每类分别处理即可:当学习关于第c类的规则时,将所有属于类别c的样本作为正例,其他类别的样本作为反例。

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

      

    预剪枝:CN2算法(用到了LRS) 后剪枝:“减错剪枝”REP 

    RIPPER中的后处理机制是为了在剪枝的基础上进一步提升性能,对R中的每条规则ri,RIPPER为它产生两个变体:

    第一:r*i:基于ri覆盖的样例,用IREP*重新生成一条规则r*i,该规则称为替换规则(replacement rule);

    第二:r**i:基于ri增加文字进行特化,然后再用IREP*剪枝生成一条规则r**i,该规则称为修订规则(revised rule)。

    接下来,把r*i和r**i分别于R中除ri之外的规则放在一起,组成规则集R*和R**,将它们与R一起进行比较,选择最优的规则集保留下来。

    RIPREP更有效的原因是:最初生成R时,规则是按序生成的,每条规则都没有对其后产生的规则加以考虑,这样的贪心算法本质常导致算法陷入局部最优;而RIPPER的后处理优化过程将R中的所有规则放在一起重新加以优化,恰是通过全局的考虑来缓解贪心算法的局部性,从而往往能获得更好的效果。

  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/hozhangel/p/7866571.html
Copyright © 2011-2022 走看看