【大数据】关于机器学习----------规则学习

news/2025/1/22 10:19:53/

一、基本概念

注:本博文所含流程图引用知乎博主 deephub

1. 规则学习
  • 规则学习是从数据中自动提取出能表示数据规律的规则的机器学习方法。这些规则通常以 if-then 形式出现,可用于分类、预测和决策等任务。例如:if (feature1 > 5) and (feature2 == 'value') then class = 'A'
  • 规则学习的优点在于规则具有较好的可解释性,易于理解和推理,适用于对可解释性要求较高的领域,如医疗、金融等。

二、序贯覆盖

1. 基本思想
  • 序贯覆盖是一种常见的规则学习策略,其核心思想是逐条生成规则,并在训练集上覆盖尽可能多的正例,同时尽量避免覆盖反例。具体步骤如下:
    1. 从空规则开始,不断添加条件,使规则能覆盖更多正例。
    2. 当规则覆盖了足够多的正例或达到一定的性能指标时,将其添加到规则集中。
    3. 从训练集中移除该规则覆盖的正例,并重复上述步骤,直到满足终止条件(如达到预设的规则数量或性能要求)。

一、示例背景

  • 这是一个判断“好瓜”的规则学习过程,通过对瓜的不同特征进行分析和筛选,来生成判断好瓜的规则。
    在这里插入图片描述

二、具体内容

  • 第一轮候选集
    • 色泽 = 青绿(2/4):表示在所有样本中,色泽为青绿的瓜有2个是好瓜,总共有4个色泽为青绿的瓜。
    • 色泽 = 乌黑(3/4):色泽为乌黑的瓜有3个是好瓜,共4个乌黑的瓜。
    • 根蒂 = 蜷缩(3/5):根蒂蜷缩的瓜有3个是好瓜,总共有5个根蒂蜷缩的瓜。
    • 敲声 = 浊响(4/6):敲声为浊响的瓜有4个是好瓜,共6个敲声浊响的瓜。
    • 纹理 = 清晰(4/6):纹理清晰的瓜有4个是好瓜,共6个纹理清晰的瓜。
    • 脐部 = 凹陷(3/4):脐部凹陷的瓜有3个是好瓜,共4个脐部凹陷的瓜。
    • 触感 = 硬滑(3/6):触感硬滑的瓜有3个是好瓜,共6个触感硬滑的瓜。
  • 第二轮候选集
    • 根蒂 = 蜷缩(2/2):在经过第一轮筛选后,根蒂蜷缩的瓜中,有2个是好瓜,且此时只剩下2个根蒂蜷缩的瓜。
    • 敲声 = 沉闷(1/1):敲声沉闷的瓜有1个是好瓜,此时只有1个敲声沉闷的瓜。
    • 纹理 = 稍糊(1/1):纹理稍糊的瓜有1个是好瓜,此时只有1个纹理稍糊的瓜。
    • 脐部 = 凹陷(2/2):脐部凹陷的瓜有2个是好瓜,此时只有2个脐部凹陷的瓜。
    • 触感 = 硬滑(2/2):触感硬滑的瓜有2个是好瓜,此时只有2个触感硬滑的瓜。

三、最终规则

经过两轮之后产生单条规则:好瓜 ←(色泽 = 乌黑)∧(根蒂 = 蜷缩),即当瓜的色泽为乌黑且根蒂蜷缩时,判断为好瓜。

四、相关知识点

  • 此示例涉及到机器学习中的规则学习,特别是序贯覆盖策略。序贯覆盖是一种规则学习方法,它逐条生成规则,在每一轮中选择一个最优的规则条件,使得该规则能覆盖尽可能多的正例(好瓜),同时尽量少地覆盖反例(非好瓜)。
  • 在这个过程中,通过计算每个特征值对应的正例覆盖率(如色泽 = 青绿的正例覆盖率为2/4),来选择最优的特征和特征值组合,逐步构建规则。第一轮候选集是基于原始的所有特征和特征值,第二轮候选集是在第一轮的基础上,进一步筛选出与第一轮中某个特征值组合后能更好地覆盖正例的其他特征值。
2. 代码示例
def sequential_cover(X, y, rule_generator):rules = []covered = set()while True:rule, performance = rule_generator(X, y, covered)if rule is None:  # 无法生成更优规则breakrules.append(rule)covered.update(get_covered_instances(rule, X))  # 获取该规则覆盖的实例if performance < threshold:  # 达到性能阈值breakreturn rulesdef rule_generator(X, y, covered):best_rule = Nonebest_performance = 0for feature in features:for threshold in thresholds:rule = generate_rule(feature, threshold)  # 生成可能的规则performance = evaluate_rule(rule, X, y, covered)  # 评估规则性能if performance > best_performance:best_rule = rulebest_performance = performancereturn best_rule, best_performancedef generate_rule(feature, threshold):# 生成具体的 if-then 规则rule = {'feature': feature, 'threshold': threshold}return ruledef evaluate_rule(rule, X, y, covered):correct = 0total = 0for i, x in enumerate(X):if i in covered:  # 跳过已覆盖的实例continueif satisfies_rule(x, rule):  # 满足规则total += 1if y[i] == positive_class:  # 假设 positive_class 是正类correct += 1if total == 0:return 0return correct / totaldef satisfies_rule(x, rule):# 判断实例 x 是否满足规则if x[rule['feature']] > rule['threshold']:return Truereturn Falsedef get_covered_instances(rule, X):covered = []for i, x in enumerate(X):if satisfies_rule(x, rule):covered.append(i)return covered

三、剪枝优化

1. 基本概念
  • 为避免过拟合,对生成的规则进行剪枝操作,去除冗余或不太重要的条件,以提高规则的泛化能力。剪枝可基于错误率、信息增益等指标。

一、左侧未剪枝的神经网络结构

  • 包含两个层 Layer iLayer j,层与层之间以及层与后续的加法操作(由“+”表示)之间通过箭头连接,箭头上标注了 N,表示数据的维度或通道数等信息。

二、右侧剪枝后的神经网络结构

  • Layer i 变为 Pruned layer iLayer j 变为 Pruned layer j,表示这两个层经过了剪枝操作。
  • 剪枝后,层与层之间以及层与加法操作之间的连接箭头上标注了不同的维度信息,如 N_aN_bN_c
  • 其中存在一个警告标志(由“!”表示),旁边标注了 N_b ≠ N_c,这表明在剪枝后,原本应该在维度上匹配的地方出现了不匹配的情况,可能会导致后续计算或模型运行出现问题。

三、相关知识点

  • 神经网络剪枝:是一种用于减少神经网络模型的复杂度和计算量的技术。通过去除一些不重要的连接(权重)或神经元,在不显著降低模型性能的前提下,使模型更加轻量化,提高推理速度和效率,同时减少内存占用。
  • 剪枝后的影响:如图片所示,剪枝可能会导致层与层之间的数据维度发生变化,如果不进行适当的处理(如调整网络结构、进行维度匹配等),可能会引发错误,影响模型的正常运行和性能。

图片原作者知乎博主deephub

在这里插入图片描述
在这里插入图片描述

一、Classic(经典流程)

  1. train(训练):首先对原始的神经网络进行训练,图中用多个黄色方块表示网络的不同层和连接。
  2. prune(剪枝):在训练后的网络基础上进行剪枝操作,去除一些不重要的连接或神经元,得到一个精简后的网络结构。
  3. fine-tune(微调):对剪枝后的网络进行微调,以恢复或提高网络的性能。

二、Lottery Ticket(彩票假说流程)

  1. train(训练):与经典流程相同,先对原始网络进行训练。
  2. prune(剪枝):进行剪枝操作。
  3. rewind(回退):将剪枝后网络的权重回退到训练过程中的某个早期状态。
  4. re-train(再训练):从回退的权重状态开始重新训练网络。

三、LR-Rewinding(另一种回退再训练流程)

  1. train(训练):原始训练过程。
  2. prune(剪枝):进行剪枝。
  3. re-train(再训练):直接对剪枝后的网络进行再训练,但可能采用了与Lottery Ticket流程中不同的再训练方式或策略。

四、相关知识点

  • 神经网络剪枝:目的是减少模型的复杂度和计算量,同时尽量保持模型的性能。通过去除冗余的连接或神经元,使模型更加轻量化,有利于在资源受限的设备上部署和运行。
  • 彩票假说(Lottery Ticket Hypothesis):该假说认为在一个大型的随机初始化的神经网络中,存在一个子网络(即“中奖彩票”),如果在训练初期就将其分离出来,它可以在与原始网络相似的训练时间内达到与原始网络相当的性能。上述Lottery Ticket流程就是基于这一假说,通过回退权重并重新训练来寻找这样的子网络。
  • 模型微调(Fine-tuning):在剪枝后,由于网络结构发生了变化,可能会影响模型的性能,因此需要进行微调来适应新的结构,使模型能够更好地工作。

在这里插入图片描述

在这里插入图片描述

2. 错误率剪枝示例
def prune_rule(rule, X, y):original_performance = evaluate_rule(rule, X, y, set())for condition in rule.conditions:pruned_rule = rule.copy()pruned_rule.conditions.remove(condition)pruned_performance = evaluate_rule(pruned_rule, X, y, set())if pruned_performance >= original_performance:rule = pruned_rulereturn ruleclass Rule:def __init__(self):self.conditions = []def evaluate_rule(rule, X, y, covered):correct = 0total = 0for i, x in enumerate(X):if i in covered:continueif satisfies_rule(x, rule):total += 1if y[i] == positive_class:correct += 1if total == 0:return 0return correct / totaldef satisfies_rule(x, rule):for condition in rule.conditions:if not check_condition(x, condition):return Falsereturn Truedef check_condition(x, condition):feature, threshold = conditionif x[feature] > threshold:return Truereturn False

四、一阶规则学习

1. 基本概念
  • 一阶规则学习处理具有变量的规则,比命题规则学习更具表达能力。它涉及逻辑变量、谓词和量词,能够表达更复杂的关系。例如:for all x, if Parent(x, y) and Male(y) then Father(y, x)
2. 代码示例(使用 ILP 库,如 Aleph
# 首先需要安装 Aleph 库
# 以下是一个简单的使用示例,假设已有背景知识和正、反例数据文件
aleph -F learn_file
  • learn_file 包含如下内容:
:- set(i).
:- modeh(1,father(+person,-person)).
:- modeb(1,parent(+person,-person)).
:- modeb(1,male(+person)).father(X,Y) :- parent(X,Y), male(Y).
  • 上述代码定义了一个简单的 ILP 规则,使用 Aleph 系统,定义了一个学习任务:学习 father 关系,基于 parentmale 关系。

五、归纳逻辑程序设计(ILP)

1. 基本概念
  • ILP 结合了逻辑编程和归纳学习,旨在从数据中学习逻辑程序。它使用一阶逻辑表示知识,学习目标是找到一个逻辑程序,能从背景知识和训练数据中推导出观察结果。
2. 相关数学公式(基于信息增益)
  • 对于规则 (r) 和训练集 (D),信息增益 (IG) 公式可表示为:
    (IG(r, D) = Entropy(D) - p_{cover} Entropy(D_{cover}) - (1 - p_{cover}) Entropy(D - D_{cover}))
  • 其中 (Entropy(D)) 是数据集 (D) 的熵,(p_{cover}) 是规则 (r) 覆盖的样本比例,(D_{cover}) 是被 (r) 覆盖的数据集。
3. 代码示例(使用 scikit-learn 风格的伪代码)
from sklearn.base import BaseEstimator, ClassifierMixinclass ILPClassifier(BaseEstimator, ClassifierMixin):def __init__(self, max_rules=10):self.max_rules = max_rulesself.rules = []def fit(self, X, y):for _ in range(self.max_rules):rule = self.generate_rule(X, y)  # 生成规则if rule is None:breakself.rules.append(rule)X, y = self.remove_covered(X, y, rule)  # 移除已覆盖的样本return selfdef generate_rule(self, X, y):# 生成新规则,这里假设使用序贯覆盖和信息增益best_rule = Nonebest_gain = 0for feature in features:for threshold in thresholds:rule = Rule(feature, threshold)gain = self.calculate_information_gain(rule, X, y)if gain > best_gain:best_rule = rulebest_gain = gainreturn best_ruledef calculate_information_gain(self, rule, X, y):# 计算信息增益p_cover = self.rule_coverage(rule, X)entropy_before = entropy(y)entropy_cover = entropy(y[self.rule_covers(rule, X)])entropy_remain = entropy(y[~self.rule_covers(rule, X)])gain = entropy_before - p_cover * entropy_cover - (1 - p_cover) * entropy_remainreturn gaindef rule_coverage(self, rule, X):# 计算规则覆盖的样本covered = []for i, x in enumerate(X):if satisfies_rule(x, rule):covered.append(i)return np.array(covered)def remove_covered(self, X, y, rule):covered = self.rule_coverage(rule, X)X = np.delete(X, covered, axis=0)y = np.delete(y, covered)return X, ydef predict(self, X):predictions = []for x in X:for rule in self.rules:if satisfies_rule(x, rule):predictions.append(positive_class)breakelse:  # 未被任何规则覆盖predictions.append(negative_class)return np.array(predictions)def entropy(y):# 计算熵classes = np.unique(y)entropy_value = 0for c in classes:p = np.mean(y == c)if p > 0:entropy_value -= p * np.log2(p)return entropy_valueclass Rule:def __init__(self, feature, threshold):self.feature = featureself.threshold = thresholddef satisfies_rule(x, rule):if x[rule.feature] > rule.threshold:return Truereturn False

总结

  • 规则学习通过序贯覆盖等策略生成规则,使用剪枝优化提高泛化能力,一阶规则学习和归纳逻辑程序设计可处理更复杂的逻辑关系。

注意事项

  • 以上代码为示例,实际使用时需要根据具体的机器学习框架和逻辑编程工具进行调整。
  • 在使用 ILP 库(如 Aleph)时,需熟悉其语法和参数设置。

在这里插入图片描述


http://www.ppmy.cn/news/1565196.html

相关文章

如何运行第一个Tomcat HttpServlet 程序

怀旧网个人博客网站地址&#xff1a;怀旧网&#xff0c;博客详情&#xff1a;如何运行第一个Tomcat HttpServlet 程序 1、编写一个 Servlet 类 创建一个包 在创建一个类--继承HttpServlet 爆红&#xff1a;原因&#xff0c;没有导入所依赖的包 altenter 选着add macen 选着第…

自动化标注平台开源,基于 yolov8标注平台可本地部署

yolov8标注平台本地部署&#xff08;docker部署&#xff09;&#xff0c;已调通yolov8模型自动预标注功能。 下面开始背景知识…… 1&#xff09;数据标注为什么在人工智能时代如此重要&#xff1f; 数据标注在人工智能时代如此重要&#xff0c;原因如下&#xff1a; 为机器…

tcpdump 精准分析vxlan网络

一、相关概念 ​ VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN协议的一种扩展。VXLAN的…

PyQt5 超详细入门级教程上篇

PyQt5 超详细入门级教程 上篇&#xff1a;1-3部分&#xff1a;PyQt5基础与常用控件 第1部分&#xff1a;初识 PyQt5 和安装 1.1 什么是 PyQt5&#xff1f; PyQt5 是 Python 的图形用户界面 (GUI) 框架&#xff0c;它基于强大的 Qt 库。Qt 是一个跨平台的 C 框架&#xff0c;用…

七.网络模型

最小(支撑)树问题 最小部分树求解&#xff1a; 破圈法&#xff1a;任取一圈&#xff0c;去掉圈中最长边&#xff0c;直到无圈&#xff1b; 加边法&#xff1a;取图G的n个孤立点&#xff5b;v1&#xff0c;v2&#xff0c;…&#xff0c; vn }作为一个支撑图&#xff0c;从最短…

低代码运维与管理服务

文章目录 前言一、服务内容二、服务范围三、服务流程四、服务交付件五、责任矩阵六、验收标准 前言 随着云计算技术的发展&#xff0c;数字化转型是企业的必然选择&#xff0c;企业需要实现广泛的连接并走向开放&#xff0c;传统集成工具无法满足当前企业面临的数字化转型诉求…

nuxt3项目打包部署到服务器后配置端口号和开启https

nuxt3打包后的项目部署相对于一般vite打包的静态文件部署要稍微麻烦一些&#xff0c;还有一个主要的问题是开发环境配置的.env环境变量在打包后部署时获取不到&#xff0c;具体的解决方案可以参考我之前文章 nuxt3项目打包后获取.env设置的环境变量无效的解决办法。 这里使用的…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…