啊喇靁 發表於 2025-6-11 09:23:00

规则学习:让机器学习像人类一样思考的可解释之路

<p>在机器学习领域,<strong>规则学习</strong>是一颗独特的明珠--它不像深度学习那样神秘,而是用人类可读的<strong>"如果-那么"</strong>规则来做出决策。</p>
<p>想象一下医生通过一系列症状判断疾病,或者风控系统根据用户行为拒绝贷款,<strong>规则学习</strong>的魅力正在于这种<strong>透明可解释性</strong>。</p>
<h1 id="1-基本概念">1. 基本概念</h1>
<p><strong>规则学习</strong>的目标是从数据中提取出一系列的规则,这些规则能够帮助我们对新的数据进行分类或预测。</p>
<p>这些规则通常以 <strong>IF 条件 THEN 结论</strong> 的形式出现,比如“如果天气是晴朗的,那么心情是愉快的”。</p>
<p>在机器学习中,这些规则是从标记好的训练数据中学习得到的,通过分析数据中的特征和标签之间的关系,算法能够找出一些有用的规则来描述数据的模式。</p>
<p>这种白盒模型特别适合高风险场景(如医疗、金融),因为:</p>
<ul>
<li>决策过程透明可追溯</li>
<li>无需特征缩放(直接处理原始数据)</li>
<li>天然处理混合类型数据(数值+类别)</li>
</ul>
<h1 id="2-序贯覆盖规则是如何产生的">2. 序贯覆盖:规则是如何产生的</h1>
<p><strong>序贯覆盖</strong>是一种常见的产生规则的方式。</p>
<p>它的<strong>基本原理</strong>是这样的:假设我们有一堆数据,算法会先找出一个能够覆盖(即匹配)部分数据的规则;</p>
<p>然后将这部分数据从训练集中移除,再继续寻找下一个规则,直到所有的数据都被覆盖或者满足某种停止条件。</p>
<p>举个简单的例子,假设我们有一组关于动物的数据,特征包括<strong>“有毛发”</strong>,<strong>“会飞”</strong>,<strong>“生活在水中”</strong>等,标签是<strong>“哺乳动物”</strong>,<strong>“鸟类”</strong>,<strong>“鱼类”</strong>。</p>
<p><strong>序贯覆盖</strong>算法首先会找出一个规则,比如<strong>“如果动物有毛发,那么它是哺乳动物”</strong>,这个规则会覆盖掉一部分数据(比如猫、狗等)。</p>
<p>然后,算法会从剩下的数据中继续寻找规则,比如<strong>“如果动物会飞,那么它是鸟类”</strong>,以此类推,直到所有的数据都被合适的规则覆盖。</p>
<h1 id="3-剪枝给规则-瘦身">3. 剪枝:给规则 "瘦身"</h1>
<p>在规则学习中,生成的规则可能会非常复杂,包含很多条件,这就可能导致<strong>过拟合</strong>,即规则在训练数据上表现很好,但在新的数据上表现很差。</p>
<p>为了避免这种情况,我们需要对规则进行<strong>剪枝优化</strong>。</p>
<p>剪枝有多种算法,这里介绍一种业界使用较多,也是一种非常著名的规则剪枝算法:<code>RIPPER</code>(<code>Repeated Incremental Pruning to Produce Error Reduction</code>)。</p>
<h2 id="31-ripper简介">3.1. RIPPER简介</h2>
<p><code>RIPPER</code>的<strong>核心思想</strong>是通过反复地增加和修剪规则来减少错误率。</p>
<p>具体来说,<code>RIPPER</code>算法分为两个阶段:<strong>生长阶段</strong>和<strong>修剪阶段</strong>。</p>
<ol>
<li><strong>生长阶段</strong>:从一个空规则开始,逐步添加条件,每次添加的条件都是能够最大程度地减少错误率的条件。这个过程会一直持续,直到规则不能再减少错误率为止。</li>
<li><strong>修剪阶段</strong>:在生长阶段得到的规则可能过于复杂,所以需要进行修剪。<code>RIPPER</code>算法会尝试去掉一些条件,看看去掉这些条件后是否能够减少错误率。如果去掉某个条件后错误率没有增加,那么这个条件就会被去掉。</li>
</ol>
<h2 id="32-ripper代码示例">3.2. RIPPER代码示例</h2>
<p><code>scikit-learn</code>库本身没有直接实现<code>RIPPER</code>算法,下面的代码使用<code>sklearn</code>的决策树模拟<code>RIPPER</code>剪枝效果。</p>
<pre><code class="language-python"># 使用sklearn决策树模拟RIPPER剪枝效果
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# 加载乳腺癌数据集
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3)

# 模拟RIPPER的剪枝控制
ripper_model = DecisionTreeClassifier(
    max_depth=3,# 限制规则长度
    min_samples_split=10,# 防止过拟合
    ccp_alpha=0.02,# 剪枝强度
)

ripper_model.fit(X_train, y_train)
print(f"验证集准确率: {ripper_model.score(X_val, y_val):.2f}")

# 可视化第一条规则
from sklearn.tree import export_text

print(export_text(ripper_model, feature_names=data.feature_names[:30]))

## 输出结果:
'''
验证集准确率: 0.94
|--- worst area &lt;= 868.20
|   |--- worst concave points &lt;= 0.16
|   |   |--- class: 1 (良性)
|   |--- worst concave points &gt;0.16
|   |   |--- class: 0 (恶性)
|--- worst area &gt;868.20
|   |--- class: 0 (恶性)
'''
</code></pre>
<p>这个示例使用了<code>scikit-learn</code>库中自带的乳腺癌数据集,其中<code>30%</code>数据作为验证集,用于剪枝时的性能评估。</p>
<p>使用<code>DecisionTreeClassifier</code>类来模拟<code>RIPPER</code>的核心思想,其中参数含义如下:</p>
<ul>
<li><code>max_depth=3</code> → 限制规则条件数不超过3个(防止过复杂规则)</li>
<li><code>min_samples_split=10</code> → 要求每个规则至少覆盖10个样本(保证规则泛化性)</li>
<li><code>ccp_alpha=0.02</code> → 剪枝强度(值越大剪枝越激进)</li>
</ul>
<p>最后,输出的结果也对应<code>RIPPER</code>的风格(即<code>"IF-THEN"</code>规则)。</p>
<h1 id="4-一阶规则学习跨越特征的限制">4. 一阶规则学习:跨越特征的限制</h1>
<p>当普通规则(<strong>命题规则</strong>)无法表达复杂关系时,<strong>一阶规则学习</strong>闪亮登场。</p>
<p><strong>一阶规则学习</strong>是一种更高级的规则学习方法,它允许规则中包含变量和谓词,而不仅仅是简单的属性值,</p>
<p>这意味着它可以处理更复杂的数据结构和关系。</p>
<p>下面的描述可以帮助我们理解<strong>命题规则</strong>与<strong>一阶规则学习</strong>的区别。</p>
<pre><code class="language-plain"># 命题规则 vs 一阶规则
命题规则: IF 年龄&gt;30 AND 存款&gt;50000 THEN 批准贷款

一阶规则:
   IF 用户(A) AND 亲属(B,A) AND 信用良好(B)
   THEN 批准贷款(A)# A、B是变量
</code></pre>
<p><strong>一阶规则学习</strong>的常用算法包括:<code>FOIL</code>(First Order Inductive Learner)和<code>TILDE</code>(Top-Down Induction of Logical Decision Trees)等。</p>
<p>这些算法的基本思路是通过递归地划分数据,生成包含变量和谓词的规则。</p>
<p>一阶规则学习的算法在<code>scikit-learn</code>库中也没有包含,需要安装额外的库,比如PyKEEN或者Aleph系统。</p>
<p>这里就不演示了。</p>
<h1 id="5-总结">5. 总结</h1>
<p>总之,<strong>规则学习</strong>作为一种非常实用的机器学习方法,它通过生成易于理解的规则来帮助我们对数据进行分类和预测。</p>
<p>不过,尽管<strong>规则学习</strong>有独特优势,仍需注意:</p>
<ol>
<li><strong>规则冲突</strong>:多个规则触发时需定义优先级</li>
<li><strong>连续特征</strong>:需要离散化处理(如等宽分箱)</li>
<li><strong>大数据场景</strong>:学习效率低于神经网络</li>
</ol>
<p>实际应用时,常将<strong>规则学习</strong>与其他技术结合。</p>
<p><strong>规则学习</strong>如同一座桥梁,连接了机器学习的精确性与人类思维的透明性。</p>
<p>在<strong>AI可解释性</strong>日益重要的今天,掌握这项技术意味着既能构建强大模型,又能清晰解释每个决策背后的逻辑。</p><br><br>
来源:https://www.cnblogs.com/wang_yb/p/18923254
頁: [1]
查看完整版本: 规则学习:让机器学习像人类一样思考的可解释之路