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

ops/2025/1/22 14:34:48/

一、基本概念

注:本博文所含流程图引用知乎博主 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/ops/152210.html

相关文章

MDX语言的字符串处理

MDX语言的字符串处理 引言 MDX&#xff08;Multidimensional Expressions&#xff09;是一种专门用于多维数据库查询和分析的语言&#xff0c;特别是在Microsoft SQL Server Analysis Services&#xff08;SSAS&#xff09;中使用广泛。MDX不仅用于查询多维数据&#xff0c;还…

网安快速入门之Windows命令

在Windows中 我们今天介绍几个命令&#xff1a; help copy dir cd type del ipconfig net netstat tasklist sc1. help 显示命令的帮助信息。或者显示Windows内置命令。 常用参数&#xff1a; <命令>&#xff1a;查看指定命令的帮助。 示例&#xff1a;help copy 显…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)

为进一步测试通过请求头传递token进行身份验证&#xff0c;在main.htm中增加layui的数据表格组件&#xff0c;并调用后台服务分页显示数据&#xff0c;后台分页查询数据接口如下所示&#xff08;测试时&#xff0c;直接将数据写死到代码中&#xff0c;没有查询数据库&#xff0…

去哪儿kafka优化案例

一、背景介绍 集群概况 去哪儿旅行当前KAFKA日志集群节点145台。单机配置&#xff1a;3TSSD盘&#xff0c;40核&#xff0c;128G内存。 业务背景 日志KAFKA集群承载了全司的APPCODE日志&#xff0c;比如我们常用的QTRACE日志&#xff0c;以及实时离线数仓数据。体量非常大。…

【25】Word:林涵-科普文章❗

目录 题目​ NO1.2.3 NO4.5.6 NO7.8 NO9.10 NO11.12 不连续选择&#xff1a;按住ctrl按键&#xff0c;不连续选择连续选择&#xff1a;按住shift按键&#xff0c;选择第一个&#xff0c;选择最后一个。中间部分全部被选择 题目 NO1.2.3 布局→纸张方向&#xff1a;横向…

使用Python爬虫获取1688网站item_get_company API接口的公司档案信息

一、引言 在当今的商业环境中&#xff0c;获取供应商的详细信息对于采购决策、市场分析和供应链管理至关重要。1688作为中国领先的B2B电子商务平台&#xff0c;提供了丰富的供应商档案信息。通过使用1688的item_get_company API接口&#xff0c;我们可以方便地获取这些信息。本…

【useTransition Hook】将某些状态更新标记为“过渡”,优化渲染性能

文章目录 引言语法参数返回值基本用法总结 引言 useTransition 是 React 中用于优化渲染性能的 Hook。它允许你将某些状态更新标记为“过渡”&#xff08;transition&#xff09;&#xff0c;从而在高优先级更新&#xff08;如用户输入&#xff09;发生时&#xff0c;低优先级…

【AI论文】GameFactory:利用生成式互动视频创造新游戏

摘要&#xff1a;生成式游戏引擎有望通过自主创建新内容并减轻手工工作量&#xff0c;从而彻底改变游戏开发领域。然而&#xff0c;现有的基于视频的游戏生成方法未能解决场景泛化的关键挑战&#xff0c;限制了它们仅适用于具有固定风格和场景的现有游戏。在本文中&#xff0c;…