Rule_set = {}; //学习的规则集初试为空 for 每个类c do repeat Rule = Learn_One_Rule(D,Att-vals,c) 从D中删除被Rule覆盖的元组; until终止条件被满足 Rule_set = Rule_set +Rule end for 返回Rule_set
以上是顺序覆盖算法的基本过程
Learn_One_Rule采用一种贪心的深度优先策略。每当面临添加一个新的属性测试到当前规则时,它根据训练样本选择最能提高规则质量属性的测试。
而什么样的度量能被选择为规则质量,将是我们以下将解决的问题。
有几个概念:
准确率:当前规则覆盖的正确的元组/当前规则覆盖的全部元组
覆盖率:当前规则覆盖的全部元组/当前全部元组
正元组(pos):在顺序覆盖算法中,当前所关心的类
负元组(neg):在顺序覆盖算法中,所有类-当前所关心的类 的集合
直觉上,我们选择准确率作为规则质量标准,但是这有一个问题,如下图所示:
虽然R2只覆盖两个元组,但是R2的准确率为100%,大于R1,在顺序覆盖算法中,将会选择R2而不是R1,这显然是不合理的。
为了解决这个问题,采用Foil_Gain作为规则质量标准:
FOIL_Gain = pos' x (log2((pos'/pos' +neg'))-log2((pos/pos +neg)))
其中 pos' ,neg'为新增规则R'所覆盖的正元组和负元组,pos,neg是R'覆盖之前的R所覆盖的正元组和负元组
FOIL_Gain越大越好。
规则剪枝:
FOIL_Prune(R) = (pos - neg)/(pos+neg)
如果R剪枝后的FOIL_Prune值较高,则对R剪枝。