IT评测·应用市场-qidao123.com
标题:
【大数据】关于呆板学习----------规则学习
[打印本页]
作者:
络腮胡菲菲
时间:
2025-1-24 12:22
标题:
【大数据】关于呆板学习----------规则学习
一、基本概念
注:本博文所含流程图引用知乎博主 deephub
1. 规则学习
规则学习是从数据中主动提取出能表示数据规律的规则的呆板学习方法。这些规则通常以 if-then 形式出现,可用于分类、猜测和决策等使命。比方:if (feature1 > 5) and (feature2 == 'value') then class = 'A'。
规则学习的优点在于规则具有较好的可解释性,易于理解和推理,适用于对可解释性要求较高的领域,如医疗、金融等。
二、序贯覆盖
1. 基本头脑
序贯覆盖是一种常见的规则学习策略,其焦点头脑是逐条天生规则,并在训练集上覆盖尽大概多的正例,同时尽量避免覆盖反例。具体步骤如下:
从空规则开始,不断添加条件,使规则能覆盖更多正例。
当规则覆盖了充足多的正例或达到肯定的性能指标时,将其添加到规则集中。
从训练集中移除该规则覆盖的正例,并重复上述步骤,直到满足终止条件(如达到预设的规则数量或性能要求)。
一、示例配景
这是一个判断“好瓜”的规则学习过程,通过对瓜的差别特征进行分析和筛选,来天生判断好瓜的规则。
二、具体内容
第一轮候选集
:
色泽 = 青绿(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: # 无法生成更优规则
break
rules.append(rule)
covered.update(get_covered_instances(rule, X)) # 获取该规则覆盖的实例
if performance < threshold: # 达到性能阈值
break
return rules
def rule_generator(X, y, covered):
best_rule = None
best_performance = 0
for 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 = rule
best_performance = performance
return best_rule, best_performance
def generate_rule(feature, threshold):
# 生成具体的 if-then 规则
rule = {'feature': feature, 'threshold': threshold}
return rule
def evaluate_rule(rule, X, y, covered):
correct = 0
total = 0
for i, x in enumerate(X):
if i in covered: # 跳过已覆盖的实例
continue
if satisfies_rule(x, rule): # 满足规则
total += 1
if y[i] == positive_class: # 假设 positive_class 是正类
correct += 1
if total == 0:
return 0
return correct / total
def satisfies_rule(x, rule):
# 判断实例 x 是否满足规则
if x[rule['feature']] > rule['threshold']:
return True
return False
def get_covered_instances(rule, X):
covered = []
for i, x in enumerate(X):
if satisfies_rule(x, rule):
covered.append(i)
return covered
复制代码
三、剪枝优化
1. 基本概念
为避免过拟合,对天生的规则进行剪枝操作,去除冗余或不太紧张的条件,以进步规则的泛化能力。剪枝可基于错误率、信息增益等指标。
一、左侧未剪枝的神经网络布局
包罗两个层 Layer i 和 Layer j,层与层之间以及层与后续的加法操作(由“+”表示)之间通过箭头连接,箭头上标注了 N,表示数据的维度或通道数等信息。
二、右侧剪枝后的神经网络布局
Layer i 变为 Pruned layer i,Layer j 变为 Pruned layer j,表示这两个层经过了剪枝操作。
剪枝后,层与层之间以及层与加法操作之间的连接箭头上标注了差别的维度信息,如 N_a、N_b、N_c。
此中存在一个警告标记(由“!”表示),旁边标注了 N_b ≠ N_c,这表明在剪枝后,原本应该在维度上匹配的地方出现了不匹配的情况,大概会导致后续计算或模型运行出现问题。
三、相干知识点
神经网络剪枝
:是一种用于减少神经网络模型的复杂度和计算量的技能。通过去除一些不紧张的连接(权重)或神经元,在不明显降低模型性能的条件下,使模型更加轻量化,进步推理速率和效率,同时减少内存占用。
剪枝后的影响
:如图片所示,剪枝大概会导致层与层之间的数据维度发生变化,如果不进行得当的处理惩罚(如调解网络布局、进行维度匹配等),大概会引发错误,影响模型的正常运行和性能。
一、Classic(经典流程)
train(训练)
:首先对原始的神经网络进行训练,图中用多个黄色方块表示网络的差别层和连接。
prune(剪枝)
:在训练后的网络基础上进行剪枝操作,去除一些不紧张的连接或神经元,得到一个精简后的网络布局。
fine-tune(微调)
:对剪枝后的网络进行微调,以恢复或进步网络的性能。
二、Lottery Ticket(彩票假说流程)
train(训练)
:与经典流程相同,先对原始网络进行训练。
prune(剪枝)
:进行剪枝操作。
rewind(回退)
:将剪枝后网络的权重回退到训练过程中的某个早期状态。
re-train(再训练)
:从回退的权重状态开始重新训练网络。
三、LR-Rewinding(另一种回退再训练流程)
train(训练)
:原始训练过程。
prune(剪枝)
:进行剪枝。
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_rule
return rule
class Rule:
def __init__(self):
self.conditions = []
def evaluate_rule(rule, X, y, covered):
correct = 0
total = 0
for i, x in enumerate(X):
if i in covered:
continue
if satisfies_rule(x, rule):
total += 1
if y[i] == positive_class:
correct += 1
if total == 0:
return 0
return correct / total
def satisfies_rule(x, rule):
for condition in rule.conditions:
if not check_condition(x, condition):
return False
return True
def check_condition(x, condition):
feature, threshold = condition
if x[feature] > threshold:
return True
return 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 关系,基于 parent 和 male 关系。
五、归纳逻辑程序计划(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, ClassifierMixin
class ILPClassifier(BaseEstimator, ClassifierMixin):
def __init__(self, max_rules=10):
self.max_rules = max_rules
self.rules = []
def fit(self, X, y):
for _ in range(self.max_rules):
rule = self.generate_rule(X, y) # 生成规则
if rule is None:
break
self.rules.append(rule)
X, y = self.remove_covered(X, y, rule) # 移除已覆盖的样本
return self
def generate_rule(self, X, y):
# 生成新规则,这里假设使用序贯覆盖和信息增益
best_rule = None
best_gain = 0
for 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 = rule
best_gain = gain
return best_rule
def 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_remain
return gain
def 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, y
def predict(self, X):
predictions = []
for x in X:
for rule in self.rules:
if satisfies_rule(x, rule):
predictions.append(positive_class)
break
else: # 未被任何规则覆盖
predictions.append(negative_class)
return np.array(predictions)
def entropy(y):
# 计算熵
classes = np.unique(y)
entropy_value = 0
for c in classes:
p = np.mean(y == c)
if p > 0:
entropy_value -= p * np.log2(p)
return entropy_value
class Rule:
def __init__(self, feature, threshold):
self.feature = feature
self.threshold = threshold
def satisfies_rule(x, rule):
if x[rule.feature] > rule.threshold:
return True
return False
复制代码
总结
规则学习通过序贯覆盖等策略天生规则,利用剪枝优化进步泛化能力,一阶规则学习和归纳逻辑程序计划可处理惩罚更复杂的逻辑关系。
注意事项
以上代码为示例,实际利用时必要根据具体的呆板学习框架和逻辑编程工具进行调解。
在利用 ILP 库(如 Aleph)时,需认识其语法和参数设置。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4