RIPPER算法

基于规则的分类器

基于规则的分类器是使用一组"if...then..."规则来对记录进行分类的技术。

  • 决策树使用分而治之的探索法
  • 规则学习算法使用了一种称为独立而治之的探索法

规则算法总的来说是先创建规则,且尽可能的包括类中的所有实例,然后再将覆盖了的实例删除,继续寻找规则。

规则增长策略:

  1. 随着规则的增加,更多的数据子集会被分离,直到整个数据集都被覆盖,不再有案例被保留。
  2. 模型的规则用析取范式 R =(r1 ∨ r2 ∨ ••• ∨ rk)表示,其中R称作规则集,ri 是分类规则或析取项。

过程描述:

这个过程包括确定训练数据中覆盖一个案例子集的规则,然后再从剩余的数据中分离出该分区。随着规则的增加,更多的数据子集会被分离,直到整个数据集都被覆盖,不再有案例残留

待会儿详细解释

对比决策树

独立而治之和决策树的分而治之区别很小,决策树的每个决策节点会受到过去决策历史的影响,而规则学习不存在这样的沿袭。

最明显的特征:规则比决策树简洁,因为决策树往往有非常多的叶子节点

举个例子对比一下:
在这里插入图片描述
这是一个判断下雨的决策树

  • 从叶子节点到根节点的路径就是规则,如果将规则减少一点(路径减少)就形成了分类规则
  1. 决策树一共有5个叶子节点,对应5条路径,即5条规则
  2. 观察规则,发现规则判断非常严格,一对一的对应的关系,其实没必要
  3. 于是对规则进行删减
  4. 你会发现,决策树永远要先对outlook进行判断,其实没必要,对应windy来说,直接判断windy就能得到结果,那么outlook就是冗余的
  5. 还有humidity,已经判断是sunny那么humidity判断一种情况,另外一种情况就不用判断,那么normal就是冗余的。(前提是二分类)

你可以这么理解,规则就是经过修剪后的决策树

特点

  1. 规则集的表达能力几乎等价于决策树,与决策树一样可以用互斥和穷举的规则集来表示
  2. 基于规则分类器和决策树分类器都对属性空间进行直线划分,并将类指派到每个划分
  3. 基于规则的分类器通常被用来产生更易于解释的描述性模型,而模型的性能却可与决策树分类器相媲美。
  4. 不需要顾及层次结构

二分类问题:

  • 选定 一个正类,一个负类,正类学习分类规则,负类为缺省值
  • RIPPER算法选择以多数类作为默认类,并为预测少数类学习规则

多分类问题:

  • 按类出现频率的大小对所有的类进行排序
  • 从出现频率最小的类开始学习规则,其余的类暂时看成负类

举个例子:

设(y1,y2,…,yc)是排序后的类,其中y1是最不频繁的类,yc是最频繁的类。第一次迭代中,把属于y1的样例标记为正例,而把其他类的样例标记为反例,使用顺序覆盖算法产生区分正例和反例的规则。接下来,RIPPER提取区分y2和其他类的规则。重复该过程,直到剩下类yc,此时yc作为默认类。充分体现独立而治之的思想。

Ripper算法

  1. 如果一个数据项内的属性值满足规则中的条件,则它被该规则所覆盖
  2. 对于一个规则的结果(分类的目标),那些属于这个分类结果的数据项称为主动数据项,不属于这个结果的数据项称为被动数据项

实现过程如下:

  1. 把不属于规则的数据项,随机的分为两个子集-增长集和缩减集
  2. 规则的扩张。开始时把规则的条件置空,接下来加入公式的条件(if-else判断条件),如此反复的向规则中加入条件,使信息增益达到最大(分类效果最优),直到规则覆盖了数据集中的所有的数据项。
    • 此过程中,加入规则时采用信息增益FOIL为判定条件,此阶段是尽可能多的加入加入规则,保证所有数据都被覆盖
  3. 规则缩减(剪枝)。依次删除规则中最后一个条件,使得增益函数最大,重复执行直到增益函数无法增大为止,得到这条规则。
    • 选择度量公式,删减规则,尽可能规则的条件数量最小

概念定义

书本定义:
在这里插入图片描述
为了建立基于规则的分类器,需要提取一组规则来识别数据集的属性和类标号之间的关键联系

如何提取?

一般采取直接方法,直接从数据中提取分类规则,直接方法把属性空间分为较小的子空间,以便于属于一个子空间的所有记录可以使用一个分类规则进行分类,即一个属性子空间训练一个分类规则(类似于决策树划分之后的子树,然后基于子树再进行划分)

规则增长

规则增长的意思,不断的形成分类规则对进行划分。

最普通的解决方法:暴力穷举,这招万能!

考虑一下几个问题:

  1. 目标是提取一个分类规则,该规则覆盖训练集中的大量正例,没有或仅覆盖少量反例。
  2. 由于搜索空间呈指数大小,要找到一个最佳的规则的计算开销很大。

如何解决?

通过以一种贪心的方式来增长规则以解决指数搜索问题。它产生一个初始规则r,并不断对该规则求精,直到满足某种终止条件为止。然后修剪该规则,以改进它的泛化误差。

合取项增减规则:

在规则的增长过程中,需要一种评估度量来确定应该添加(或删除)哪个合取项。准确率就是一个很明显的选择,因为它明确地给出了被规则正确分类的训练样例的比例。

FOIL信息增益度

规则的支持度计数对应于它所覆盖的正例数。

假设规则r : A→+覆盖 p 0 p_0 p0个正例和 n 0 n_0 n0个反例。增加新的合取项B,扩展后的规则r’ : (A∧B)→+覆盖 p 1 p_1 p1个正例和 n 1 n_1 n1个反例。
F O I L G a i n = p 1 ∗ ( l o g 2 p 1 p 1 + p 2 − l o g 2 p 0 p 0 + n 0 ) FOILGain = p_1 * (log_2\frac{p_1}{p_1+p_2}-log_2\frac{p_0}{p_0+n_0}) FOILGain=p1(log2p1+p2p1log2p0+n0p0)

注意:

  • 由于该度量与 p 1 p1 p1 p 1 p 1 + n 1 \frac{p1}{p1+n1} p1+n1p1成正比,因此它更倾向于选择那些高支持度计数和高准确率的规则。
  • RIPPER算法使用FOIL信息增益来选择最佳合取项添加到规则前件中。
  • 当规则开始覆盖反例时,停止添加合取项。

规则剪枝

新规则根据其在确认集上的性能进行减枝。

计算下面的度量来确定规则是否需要减枝: v = ( p − n ) ( p + n ) v=\frac{(p-n)}{(p+n)} v=(p+n)(pn),其中p和n分别是被规则覆盖的确认集中的正例和反例数目

注意:

  1. 关于规则在确认集上的准确率,该度量v是单调的。
  2. 如果减枝后该度量v增加,那么就去掉该合取项。
  3. 减枝是从最后添加的合取项开始的。

例如:

给定规则ABCD→y,RIPPER算法先检查D是否应该减枝,然后是CD、BCD等。尽管原来的规则仅覆盖正例,但是减枝后的规则可能会覆盖训练集中的一些反例。

MDL准则

MAP

提出最小描述长度(MDL)的目的是为了根据信息论中的基本概念来解释极大后验假设(MAP)。
P ( h ∣ D ) = P ( D ∣ h ) P ( h ) P ( D ) \begin{gather*} P(h|D) =\frac{P(D|h)P(h)}{P(D)} \end{gather*} P(hD)=P(D)P(Dh)P(h)

在许多学习场景中,学习器考虑候选假设集合H并在其中寻找给定数据D时,可能性最大的假设h(或者存在多个这样的假设时选择其中之一)。这样的具有最大可能性的假设h被称为极大后验(maximum a posteriori, MAP)假设。

MAP最大可能性假设:
h M A P = a r g m a x h ∈ H P ( h ∣ D ) = a r g m a x h ∈ H P ( D ∣ h ) P ( h ) P ( D ) = a r g m a x h ∈ H P ( D ∣ h ) P ( h ) \begin{align} h_{MAP} &= \boldsymbol{argmax_{h\in H}} P(h|D) \\ &=\boldsymbol{argmax_{h\in H}}\frac{P(D|h)P(h)}{P(D)} \\ &= \boldsymbol{argmax_{h\in H}}P(D|h)P(h) \end{align} hMAP=argmaxhHP(hD)=argmaxhHP(D)P(Dh)P(h)=argmaxhHP(Dh)P(h)

在最后一步,去掉了P(D),因为它不依赖于h。

最优编码

假设想要为随机传送的消息设计一个编码,其中遇到消息 i 的概率是 P i Pi Pi
香农 已经证明最优编码(使得期望消息长度最短的编码)对消息 i 的编码长度为 − l o g 2 P i -log_2P_i log2Pi

极大后验假设所满足的等式,可以等价地表示为使以2为底的对数的负值最小化:
h M A P = a r g m a x h ∈ H − l o g 2 P ( D ∣ h ) − l o g 2 P ( h ) h_{MAP} = \boldsymbol{argmax_{ h \in H}}-log_2P(D|h)-log_2P(h) hMAP=argmaxhHlog2P(Dh)log2P(h)

  1. 公式中第一项对应的是——在给定假设 h 时,训练数据 D 的描述长度。也即是发送者和接收者都知道假设 h 时描述数据 D 的最优编码。

  2. 公式中第二项对应的是——在假设空间 H 的最优编码下 h 的描述长度。

至此,可以看出:最小描述长度准则默认选用使这两个描述长度的和最小化的假设 h。

  • 训练数据
    为了尽量降低编码长度,我们假设发送者和接收者都知道每一个训练数据的特征信息,所以特征信息就不用编码传送。而每一个训练数据的分类结果必须传送吗?答案是N0,因为我们还要讲假设 h 编码传送。如果训练数据的分类结果label 和通过假设 h 预测出的结果一致,那么我们就不需要传送这个数据的标签信息。只有当训练数据预测出错时,才需要将正确的标签信息传送。

  • 假设
    假设 h 必须编码传送。并且 h 越复杂, 编码长度越大。如若不明白,可以假设学习器是决策树,对树的编码方法随着决策树节点和边的增长而增加。

其中对训练数据的编码和对假设的编码分别记为 C1 和 C2。

至此可以看出,当 C1 和 C2 分别选取MDL准则中对应的最佳编码方式时训练数据和假设的编码长度之和最小。所选的假设 h 也就是 极大后验假设。

  • 总结
    从上面的分析可以看出,MDL准则,实际上是假设复杂性(模型复杂度)和假设产生错误的数量之间对的一个折中。MDL 倾向于选择一个产生少量错误而且较短的假设,而不是能完美分类你和训练数据的较长的假设。

特点:

  1. MDL准则,可以用于处理数据过拟合的问题
  2. MDL不能说明所有情况下短假设最好

优化规则集

对于规则集中的每一条规则
1. 考虑能不能替换规则
2. 能替换规则,重新编辑规则(增加/减少)
3. 比较替换前后规则集
4. 选择最小化的MDL规则集,即最优规则集

总结:

RIPPER算法可以笼统的理解为一个三步过程:生长,修剪,优化。

生长:

生长过程利用分而治之技术,对规则贪婪地添加条件,直到该规则能完全划分出一个数据子集或者没有属性用于分割。

修剪:

与决策树类似,信息增益准则可用于确定下一个分割的属性,当增加一个特指的规则而熵值不再减少时,该规则需要立即修剪。

优化:

重复第一步和第二步,直到达到一个停止准则,然后,使用各种探索法对整套的规则进行优化。

在这里插入图片描述
请添加图片描述
算法效率:
在这里插入图片描述

在这里插入图片描述

  • 分类错误率低,效率搞,时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)级别
  • 不被噪声影响
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ripper算法是一种决策树归纳算法,可以用于分类任务。以下是一个简单的Ripper算法的Python实现: ```python import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score class Ripper: def __init__(self, max_rules=100, max_iter=100): self.max_rules = max_rules self.max_iter = max_iter self.rules = [] self.rule_scores = [] self.rule_classes = [] self.default_class = None def fit(self, X, y): self.default_class = np.bincount(y).argmax() for _ in range(self.max_iter): X_subset, y_subset = self.sample(X, y) rule, score, classes = self.generate_rule(X_subset, y_subset) if rule is None: break self.rules.append(rule) self.rule_scores.append(score) self.rule_classes.append(classes) if len(self.rules) >= self.max_rules: break def predict(self, X): y_pred = np.full(X.shape[0], self.default_class) for rule, classes in zip(self.rules, self.rule_classes): mask = rule.predict(X) == 1 y_pred[mask] = classes return y_pred def sample(self, X, y): sample_size = np.random.randint(X.shape[0]) + 1 indices = np.random.choice(X.shape[0], sample_size, replace=False) return X[indices], y[indices] def generate_rule(self, X, y): classes, counts = np.unique(y, return_counts=True) if len(classes) == 1: return None, 1.0, classes[0] rule = DecisionTreeClassifier(max_depth=1) rule.fit(X, y) score = accuracy_score(y, rule.predict(X)) if score == 0.0: return None, 0.0, self.default_class return rule, score, classes ``` 这个实现中,`fit`函数用于训练模型,`predict`函数用于进行预测。`generate_rule`函数用于生成规则,`sample`函数用于从样本中随机选取一部分样本,用于生成规则。在`fit`函数中,可以看到我们循环进行规则生成,直到达到最大规则数或者无法生成更多规则为止。每次生成规则后,我们将其加入规则列表中。在`predict`函数中,我们遍历规则列表,对于每个规则,如果样本符合规则,就将其分类为对应的类别。如果样本不符合任何规则,则将其分类为默认类别。 需要注意的是,这个实现中并没有进行任何剪枝,因此可能会出现过拟合的情况。如果需要更好的泛化性能,可以考虑添加剪枝算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值