规则分类器
基于规则的分类器
基于规则的分类器是使用一组 “if…then” 规则来对记录进行分类的技术。该模型的规则用析取范式 R = ( r 1 ∨ r 2 ∨ ⋯ ∨ r k ) R = (r_1\vee r_2 \vee \cdots \vee r_k) R=(r1∨r2∨⋯∨rk),其中 R R R称作规则集,而 r i r_i ri是分类规则或析取项
每一个分类规则可以表示为如下形式:
r i : ( 条 件 i ) → y i r_i : (条件_i) \rightarrow y_i ri:(条件i)→yi
规则左边成为规则前件,它是属性测试的合取:
条 件 i = ( A 1 o p v 1 ) ∧ ( A 2 o p v 2 ) ∧ ⋯ ∧ ( A k o p v k ) 条件_i = (A_1 \ op \ v_1)\wedge(A_2\ op\ v_2)\wedge \cdots \wedge(A_k\ op\ v_k) 条件i=(A1 op v1)∧(A2 op v2)∧⋯∧(Ak op vk)
其中, ( A i , v i ) (A_i,v_i) (Ai,vi)是属性-值对, o p op op是比较运算符。规则右边成为规则后件,包含预测类 y i y_i yi
如果规则 r r r的前件和记录 x x x的属性匹配,则称 r r r 覆盖 x x x.当 r r r覆盖给定的记录时,称 r r r被激发或者被触发。
分类规则的质量可以用覆盖率和准确率来度量
覆盖率定义为数据集 D \mathcal{D} D中出发规则 r r r的记录所占的比例
c o v e r a g e ( r ) = ∣ A ∣ ∣ D ∣ coverage(r)=\frac{|A|}{|D|} coverage(r)=∣D∣∣A∣
准确率定义为触发 r r r的记录中类标号等于 y y y的记录所占的比例
a c c u r a c y ( r ) = ∣ A ∩ y ∣ ∣ A ∣ accuracy(r) = \frac{|A\ \cap\ y|}{|A|} accuracy(r)=∣A∣∣A ∩ y∣
其中, ∣ A ∣ |A| ∣A∣是瞒住规则前件的记录数, ∣ A ∩ y ∣ |A\ \cap\ y| ∣A ∩ y∣是同时满足规则前件和规则后件的记录数
1. 工作原理
互斥规则
如果规则集
R
\mathcal R
R中不存在两条规则被同一条记录触发,则称规则集
R
\mathcal R
R中的规则是互斥的
穷举规则
如果对属性值的任意组合,
R
\mathcal R
R中都存在一条规则加以覆盖,则称规则集
R
\mathcal R
R具有穷举覆盖
如果规则集不是穷举的,那么必须添加一条默认规则 r d : ( ) → y d r_d :()\rightarrow y_d rd:()→yd来覆盖那些没有被覆盖的记录,默认规则的前件为空,当所有其他规则失效时触发
如果规则不是互斥的,则有两种方法解决:
-
有序规则
规则集中的规则按照优先级降序排列,当测试记录出现时,有覆盖记录的最高秩的规则对其进行分类 -
无序规则
允许一条记录触发多条分类规则,吧每条被触发的规则的后件看做是对相应类的一次投票,然后计票确定测试记录的类标号,通常把记录指派到得票最多的类。某些情况下,可以使用规则准确率加权无序规则的利弊:(1)不易受由于选择不当的规则而产生的错误的影响(基于有序规则的分类器则对规则排序方法的选择非常敏感)(2)建模开销小,不比维护规则的顺序(3)然而,测试记录的属性要与规则集中的每一条规则的前件比较,任务繁重
2. 规则的排序方案
基于规则的排序方案
依据规则质量的某种度量对规则进行排序。这种排序方案确保每一个测试记录都是有覆盖它的“最好的”规则来分类。该方案的潜在缺点是规则的秩越低越难解释,因为每个规则都假设排在他前面的规则不成立
基于类的排序方案
属于同一个类的规则在规则集
R
\mathcal R
R一起出现,同一个类的规则之间的相对顺序并不重要。该方案的潜在缺点是质量较差的规则碰巧预测较高秩的类,从而导致高质量的规则被忽略
大多数著名的基于规则的分类器,如C4.5、RIPPER都采用基于类的排序方案
3. 如何建立基于规则的分类器
提取分类规则的方法有二:(1)直接提取法,直接从数据中提取分类规则(2)间接法,从其他分类模型中提取分类规则
4. 规则提取的直接方法
顺序覆盖
规则基于某种评估度量以贪心的方式增长,该算法从包含多个类的数据集中一次提取一个类的规则。决定哪一个类的规则最先产生的标准取决于多种因素
- 算法开始时 R \mathcal R R为空
- 用Learn-One-Rule函数提取类
y
y
y的覆盖当前训练记录的最佳规则。
在提取规则时,类 y y y的所有训练记录被看做正例,其他类看做反例,如果一个规则覆盖大多数正例,没有或者仅覆盖极少数反例,那么该规则可取 - 一旦找到这样的规则,就删除它所覆盖的训练记录,并把新规则追加到 R \mathcal R R的尾部
- 重复上述过程,直到满足终止条件
4.1 Learn-One-Rule函数
Learn-One-Rule函数通过以一种贪心的方式的增长规则来解决指数搜索问题。
它先产生一个初始规则 r r r,并不断对该规则求精,直到满足某种终止条件为止。然后,修剪该规则,以改进它的泛化误差
规则增长策略
常见的分类规则增长策略有两种:从一般到特殊和从特殊到一般
由于规则的贪心的方式增长,上述两种方法可能会产生次优规则。为了避免这种问题,可以采用束状搜索(beam search):算法维护
k
k
k个最佳候选规则,个候选规则各自在其前件中添加或删除合取项而独立地增长;评估候选规则的质量,选出
k
k
k个最佳候选进入下一轮迭代
评估规则
(1)可以使用统计检验剪除覆盖率较低的规则,如我们可以计算下面的似然比统计量
R = 2 ∑ i = 1 k f i l o g f i e i R = 2 \sum_{i=1}^{k}f_i log \frac{f_i}{e_i} R=2∑i=1kfilogeifi
k k k是类的个数, f i f_i fi是被规则覆盖的类 i i i的样本的观测频率, e i e_i ei是规则做随机猜测的期望频率
较大的 R R R值说明该规则做出的正确预测数显著地大于随机猜测的结果
(2)了可以使用一种考虑规则覆盖率的评估度量
L a p l a c e = f + + 1 n + k Laplace = \frac{f_+ \ \ +\ \ 1}{n+k} Laplace=n+kf+ + 1
m 估 计 = f + + k p + n + k m估计 = \frac{f_+\ \ +\ \ kp_+}{n+k} m估计=n+kf+ + kp+
n n n是规则覆盖的样例数, f + f_+ f+是规则覆盖的正例数, k k k是类的总数, p + p_+ p+是正类的先验概率
当 p + = 1 / k p_+=1/k p+=1/k时,m估计等价于Laplace度量;如果规则不覆盖任何训练样例,那么Laplace度量减小到 1 / k 1/k 1/k,该值等于类符合均匀分布时正类的先验概率;当 n = 0 n=0 n=0时,m估计也降到先验概率。然而,当规则的覆盖率很高时,两个度量都渐进地趋向于规则的准确率 f + n \frac{f_+}{n} nf+
(3)另一种可以使用的评估度量是考虑规则的支持度计数的评估度量,如FOIL信息增益
假设规则 r : A → + r: A \rightarrow \ + r:A→ +覆盖 p 0 p_0 p0个正例和 n 0 n_0 n0个反例,增加新的合取项 B B B,扩展后的规则 r ′ : A ∧ B → + r': A \wedge B \rightarrow \ + r′:A∧B→ +覆盖 p 1 p_1 p1个正例和 n 1 n_1 n1个反例,于是
F O I L 信 息 增 益 = p 1 × ( l o g 2 p 1 p 1 + n 1 − l o g 2 p 0 p 0 + n 0 ) FOIL信息增益 = p_1\times(log_2\frac{p_1}{p_1+n_1}-log_2\frac{p_0}{p_0+n_0}) FOIL信息增益=p1×(log2p1+n1p1−log2p0+n0p0)
由于该度量正比于 p 1 p_1 p1和 p 1 p 1 + n 1 \frac{p_1}{p_1+n_1} p1+n1p1,所以它更倾向于选择那些高支持度计数和高准确率的规则
规则剪枝
我们可以对Learn-One-Rule函数产生的规则进行剪枝。为了确定是否需要剪枝,我们可以估计规则的泛化误差或者比较剪枝前后规则的悲观误差
4.2 顺序覆盖基本原理
规则提取出来后,顺序覆盖算法必须删除该规则所覆盖的所有正例和反例
4.3 RIPPER算法
为了阐明规则提取的直接方法,考虑一种广泛使用的规则归纳算法,叫做RIPPER算法。该算法的复杂度几乎线性地随训练样例的数目增长,并且特别适合为类分布不均衡的数据集建立模型。RIPPER也能很好地处理噪声数据集,因为它使用一个确认数据集来防止模型过拟合
对两类问题,RIPPER算法选择以多数类作为默认类,并为预测少数类学习规则。对于多类问题,先按类的频率对类进行排序,设 ( y 1 , y 2 , … , y c ) (y_1, y_2, \dots,y_c) (y1,y2,…,yc)是排序后的类,其中 y 1 y_1 y1是最不频繁的类, y c y_c yc是最频繁的类。在一次迭代中,把属于 y 1 y_1 y1的样例标记为正例,而把其他的样例标记为反例,使用顺序覆盖算法产生区分正例和反例的规则。接下来,RIPPER提取区分 y 2 y_2 y2和其他类的规则。重复该过程,知道剩下类 y c y_c yc,此时 y c y_c yc作为默认类
增长规则
RIPPER算法使用从一般到特殊的策略进行规则增长,使用FOIL信息增益来选择最佳合取项添加到规则前件中。当规则开始覆盖反例时,停止添加合取项。新规则根据其在确认集上的性能进行剪枝。计算下面的度量来确定规则是否需要剪枝:
p
−
n
/
p
+
n
{p-n}/{p+n}
p−n/p+n
其中,
p
p
p和
n
n
n分别是被规则覆盖的确认集中的正例和反例数目。剪枝是从最后添加的合取项开始的,如
A
B
C
D
→
y
ABCD \rightarrow y
ABCD→y,RIPPER算法先检查
D
D
D是否应该剪枝,然后是
C
D
CD
CD、
B
C
D
BCD
BCD等
建立规则集
只要该规则不违反基于最小描述长度原则的终止条件,就将它添加到规则集中。如果新规则把规则集的总描述长度增加了至少
d
d
d个比特位,那么RIPPER就停止把该规则加入到规则集(默认的
d
d
d是64位)。RIPPER使用的另一个终止条件是规则在确认集上的错误率不超过0.5
5. 规则提取的简介方法
这里介绍一种由决策树生成规则集的方法。
原则上,决策树从根节点到叶节点的每一条路径都可以表示一个分类规则。路径中的测试条件构成规则前件的合取项,叶节点的类标号赋给规则后件。
规则产生
给定一个分类规则
r
:
A
→
y
r: A \rightarrow y
r:A→y,考虑简化后的规则
r
′
:
A
′
→
y
r':A' \rightarrow y
r′:A′→y,其中
A
′
A'
A′是从
A
A
A去掉一些合取项后得到的。只要简化后的规则的误差率低于原规则的误差率,就保留其中悲观误差率最低的规则。重复规则剪枝步骤,直到规则的悲观误差不能再改进为止。由于某些规则在剪枝后会变得相同,因此必须丢弃重复规则
规则排序
产生规则集后,C4.5规则算法使用基于类的排序方案对提取的规则定序。越策同一个类的规则分到同一个子集中。计算每个子集的总描述长度,然后各类按照总描述长度有效到达排序。具有最小描述长度的类优先级最高。类的中描述长度等于
L
e
x
c
e
p
t
i
o
n
+
g
×
L
m
o
d
e
l
L_{exception}+g\times L_{model}
Lexception+g×Lmodel,
L
e
x
c
e
p
t
i
o
n
L_{exception}
Lexception是对误分类样例编码所需的比特位数,
L
m
o
d
e
l
L_{model}
Lmodel是对模型编码所需的比特位数,而
g
g
g是调节参数,默认为0.5.调节参数的值取决于模型中冗余属性的数量,如果模型含有很多冗余属性,那么调节参数的值会很小
6. 基于规则的分类器的特征
- 规则集的表达能力几乎等价于决策树。基于规则的分类器和决策树分类器都是对属性空间进行直线划分。如果基于规则的分类器允许一条记录触发多条规则的话,就可以构造一个更加复杂的决策边界
- 基于规则的分类器通畅被用来产生更易于解释的描述性模型
- 被很多基于规则的分类器(如RIPPER)所采用的基于类的规则排序方法非常适用于处理类分布不平衡的数据集