神经网络规则提取方法
ruleex的Python项目详细描述
规则
rulex是一个实现规则提取算法的python包。 现在,有三种算法可用(hypinv、ann-dt和deepred)。 所有这些算法都稍加修改。特别是,提取的规则 存储在具有决策节点的树结构中,决策节点可以具有任何形式,例如, 轴平行或线性拆分。一般决策树的实现,即 包含任何类型决策节点的树,还包括一些方便的 操作。
下面的描述只提供了对代码(类, 函数及其参数)。关于实现背后理论的更多细节 我的硕士论文可以拿到。
树
此子包包含通用决策树的实现,即, 具有任意决策节点的决策树。也可以使用 所谓的决策图,每个节点可以有多个传入边。
类规则
rule是描述树内决策节点的抽象类。 此类的对象至少存储以下参数:
- true_branch和false_branch:指向下一个节点的指针或无指针。
- class_set:节点表示的类集合(在树中 此集合应遵循包含方式的顺序)
- class_hits:包含每个类的样本数的列表。
- num_true和num_false:重定向到的样本数 分别是真分支和假分支。
需要重写的方法是:
- 求值规则:求值规则,即,如果满足规则的条件,则返回true。
- 全部评估:评估样本列表(使用numpy优化决策过程)。
- 到字符串:将节点打印到字符串。
- 复制:将新实例作为当前对象的副本返回。
扩展init方法来存储特定节点的一些其他关键值也很方便。
实现的子类是AxisRule和LinearRule表示 轴平行和线性拆分节点。还实现了leaf- 树的叶节点。
但是,在树结构中可以实现类规则的其他子类 leaf应该始终属于leaf类,因为在ruletree类中实现的算法 依赖于该属性。
类规则树
这个子包的主要类。它表示一般决策树。
这个类没有封装。操作起来相当自由。它的实施 有两个紫色的。第一个是存储有关tee的一般信息,例如
- 根节点,
- 课程数量,
- 输入值的数目。
第二个目的是在树结构上实现一些简单的操作。
- 静态方法
- ruletree中的rt.half_(类数):创建与 课程数量。此树基于第一个值进行分类 大于0.5。
- load(filename):从pickle文件加载ruletree对象。
- 评价
- rt.eval_one(x):评估一个样本。
- rt.eval_all(x,all_nodes=none,prevs=none):计算存储在列表x中的所有样本。 当参数所有的节点和prev都被传递时,方法不需要 执行递归调用及其更快的速度(它也适用于具有这些 参数)。
- 复制、保存和打印
- rt.copy():对树进行深度复制。
- 保存(文件名):将规则树保存到pickle文件中。
- rt.to_string():打印规则树。注意这个的计算复杂性 当树很大时起作用。
- rt.print_expanded_rules():打印所有r规则,即每条路径 根节点到叶节点,就好像用节点条件的结合规则一样。
- rt.view_graph():返回graphviz有向图。它还可以将其显示并存储为PDF格式。
吸气剂
- rt.get_all_nodes():返回决策图包含的所有开始节点 带右根。
- rt.get_precedent_dict():返回节点与其前任列表之间的映射。
- rt.get_all_expanded_rules():返回开始的图中所有路径的列表 在rt.root中以叶节点结束。
- rt.get_thresholds():对于具有轴规则的树,返回所有阈值 对于每个属性
- rt.get_rule_index_dict(x):返回节点和索引之间的映射 在评估期间访问节点的样本x的数量。
- rt.get_stats():返回规则树的某些选定属性: 规则数、节点数、使用的索引数 通过树(仅支持AxisRule和LinearRule) 所有规则长度的总和,使用的索引的总和 在每个规则中。
- 图形运算
- rt.replace_leaf_with_set(leaf_class_set,replacing_rule,all_nodes=none,prevs=none):全部替换 通过替换规则使类集等于叶类集的叶。
- rt.replace_rule(matching_rule,replacement,prev_entries=none):用替换替换匹配的_rule。
如果上一个条目是pressent,则它不会递归地寻找匹配的规则。
在图表中。(提示:
prev_entries=prevs\[匹配规则]
) - rt.delete_node(node,branch,all_nodes,prevs):删除图形结构中的节点 并用参数指定的分支替换它。
- rt.fill_class_sets():根据叶类集填充类集。 在具有类集{1}和{0,3}lead的分支中具有两个叶的节点将具有 类集合{0,1,3}。
- rt.fill_hits(x,labels,remove_redundat=false):填充所有节点中的类点击 在图中,通过使用样本的真标签计算样本x。如果删除多余的 如果为true,则删除未填充的节点。
<李氏支票
- rt.check_none_inside_tree():如果某个分支中只有叶节点没有叶节点,则返回true。
- rt.check_one_evaluation():检查图形是否仅将每个样本求值到一个类。
- rt.graph_max_indegree(all_nodes=none,return_all=false):返回最大索引 发生在图表中。如果return_all为true,则返回节点与其索引之间的映射。
- 条件修剪
- rt.fill_hits with remove_redundat=true选项。
- rt.delete_interval_redundancy():删除导致 是由从rt.root到它的路径中的前一个节点的条件强制的。
- rt.delete_class_redundacy():删除 导致相同结果(分类)的规则树结构。
- remove_unvisited(visited_rules):删除参数中指定的其他节点。
- rt.remove_unvisited_edges(all_nodes,prevs):删除num_true或num_false等于零的节点。
- rt.prune_using_hits(min_split_fraction=0.0,min_rule_samples=1,all_nodes=none):
移除类命中总数小于最小规则样本的所有节点
max(num-true/num-false,num-false/num-true)<;min-拆分分数
构建规则树
建立dt的标准方法是在研究所有可能的分裂和 使其分区中杂质的加权和最小化。 该算法的主要概念是在按功能构建模块中实现的 根据规则生成规则
必需的参数是
- rule_list:规则列表,例如,具有AxisRule类的对象
- 数据:训练样本输入列表
- 标签:训练样本的标签列表
警告:不要将此功能用于超过100个可能的节点。它是 一般和未优化。如果你想在标准dt中使用sklearn,然后 通过ulits模块中的sklearnt_to_ruletree函数转换结果。 (甚至可以设置ann-dt算法以标准方式构建dt并对其进行优化)
实用程序.py
此模块的主要原因是dt的其他模型与ruletree类之间的转换。
sklearnt_to_ruletree将sklearn模型转换为ruletree对象。也有可能 添加一些额外的修剪设置,如min_split_fraction(请参阅rt.prune_using_hits)。
pybliquedt_to_ruletree和train_oc1假设一个包pyblique。 它们生成一个具有线性分割的规则树。
芦丁.py
此模块需要安装rpy2和r-project。它提供训练C5.0dt的功能 并将其转换为RuleTree对象。
ann-dt方法(anndt子包)
这种方法与标准的dt构建非常相似,但是在每个节点上 如果有足够的样本,如果没有,则通过采样输入空间生成新样本 取神经网络的输出。也有其他杂质函数,因为 nn为样本提供连续输出,而不仅仅是标签。
主要功能是anndt(model_fun,x,params,measureClass=none,stat_test=none,sampler=none,init_restrictions=none):, 其中参数为:
- model\u fun是一个函数,调用时返回样本列表的nn输出。
- x培训样本列表。
- 测量类杂质测量的类别(定义在模块测量中)。
- 统计检验使用的统计检验函数(有些函数在模块统计检验中定义)。
- 采样器在模块sampling中定义的采样器的子类,其中实现了一些示例。 注意为您的数据设置或实现这个类。
- 初始限制输入的最小值和最大值列表。
- 参数附加参数字典主要参数有:
- 最小采样数:用于创建新节点的最小采样数。 此值用于生成满足条件的许多新样本。
- min_train:创建新节点的最小序列样本数。如果 训练样本的数目较低,正在生成当前子树站点。
- 最大深度:生成dt的最大深度。
- 最小分割分数:其中一个停止条件有关详细信息,请参见rt.prune_using_hits。
- varbose:varbose的一个级别
- 0:未打印任何内容:
- 1:打印了一些信息。
模块度量值.py
在这个模块中,定义了抽象类measureoptimized。它代表抽象 使用ann-dt搜索最优分割。类的主要方法 是查找分割
也有实现的子类measureoptimized:
- 基尼测度:表示基于基尼指数杂质的训练算法。
- 熵测度:表示基于熵杂质的训练算法。
- fidelity gain:表示基于保真度增益的训练算法。逼真度 收益被定义为错误分类样本的百分比 各部门上课。
- 方差测量:此杂质只能用于二进制分类。 它计算方差作为杂质测量。
模块采样.py
这个模块定义了一个抽象类sampler及其两个子类normalsampler和伯努马尔采样器。 必须重写两个抽象方法:
- get_default_params(self,x):设置采样器所需参数的方法。
- generate_x(self,train_x,number,restrictions):生成样本的方法。 对于它的生成,有当前节点和限制的可用训练样本 由输入空间和以前的节点定义。
normalsampler为随机分布的数据定义采样类。它是 方便地使用一些统计测试来确定数据是否正常 已分发。
在伯努利和正态分布相乘的情况下进行采样。 这将导致值为零或正态分布。 因此,伯努利分布有三个参数:p(概率 零值的出现);sigma和mu为正态分布。
深红色方法(深红色子包装)
一种使用神经网络所有层激活的方法。算法采用 所有训练样本激活。从最后一层开始。它建造DT 根据上次激活对样本进行分类。那么对于每个节点 dt用于对节点的条件是否成立进行分类。之后 节点被这个dt替换。重复此过程,直到第一层 达到。用树替换节点可得到决策图。
主要功能是深红色(层激活,参数)。 层激活是具有维数的张量(层x样本x激活)。 参数params指定主要方法的所有设置:
- 初始序列参数:用于 通过sklearn软件包训练初始dt。
- dt_train_params:用于 由SKLEARN软件包提供的初始日期以外的培训。
- 先构建:如果为true,则在最后一次激活else时构建dt 使用拆分为0.5的树(请参阅RuleTree类中的Half_RuleTree方法)。
- varbose:varbose的一个级别
- 0:显示或打印凹痕。
- 1:打印主加工信息。
- 2:打印子树的附加信息。
- 3:每个步骤的图形都是以PDF格式生成的,并附带结果。
函数deepred返回有关进程的附加信息 提取的规则树。
多层感知器的张量流模型 激活包含在model.py包中。它的名字是deepredfcnet。
hypinv方法(hypinv子包)
hypinv处理由nn(通常是分类器)定义的决策边界。 决策边界是分类变化的输入空间的一部分。 方法如下。首先,找出错误的分类点。然后, 在决策边界上找到该点的闭合点。一种新的线性 split作为一个垂直于这些点之间的线的超平面 与边界上的点相交。规则是在表单中创建的 具有线性分割的决策树。建筑是通过选择最好的 以杂质的方式在每一步分裂,只考虑产生的线性分裂。
有三种方法可以找到决策的最接近点 边界。这些方法是:
- 用进化算法在决策边界上生成均匀分布的点,
- nn的反演,然后沿边界滑动,
- 修改成本函数。
它们的使用取决于输入的维度。之间的界限 这三种方法大约是60000。所以,我n维60以下的一代 边界上的点可以是有效的,但对于尺寸500不是,其中 建议使用修改后的成本函数。
此方法仅用于高维空间的数据,因此 不支持对决策边界上的点进行进化搜索。
主要功能是hypinv(model,x,params=dict(),input_range=none)
- model具有子类netforhypinv(在模块hypinv.model中)的对象。 它还确定是否使用修改后的损耗。
- x培训样本列表(仅输入)。
- 输入范围输入空间的范围,例如,[[0,255]表示i in range(dimensions)] 如果未定义,则通过获取训练样本属性的最大值和最小值来设置该算法。
- params指定主要方法的所有设置:
- 最大规则将创建的最大线性拆分数。
- 最大深度生成树的最大深度。
- 阈值保真度如果保真度超过此值,则算法停止并返回当前规则树。
- 使用"训练"点如果为真,则在"其他"训练集中搜索分类错误的点 该算法对输入空间进行均匀采样,找出分类点 nn和当前规则树的不同。
- 最大滑动步数滑动过程中的最大步数。
- gtrain_params用于 优化修正成本函数。
函数hypinv返回有关进程的附加信息以及 提取的规则树。
未来工作
我注意到最近没有尝试扩展决策树(dts)。 尽管,hypinv规则提取方法是使用线性分割 并在其他方法或dts失败的情况下取得了很好的效果。 因此,具有线性(斜)分裂的dt是非常有前途的方向 关于研究。然而,一般的线性分裂很难解释。因此,一个新的 方法应具有以下属性:
- 类的良好分离-它与DTS的属性相同
- 组合中的属性数较少
其思想是定义参数函数并通过其优化找到所需的 线性组合的属性。然而,简单的迭代优化将 不要导致设置第二个属性所需的某些属性零。