PRISM-Python 中的规则一个简单的 Python 规则感应系统
欢迎来到雲闪世界.PRISM 是一种现有算法(尽管我确实创建了一个 Python 实现),PRISM 相对简单,但在机器学习中,有时最复杂的解决方案效果最好,有时最简单的解决方案效果最好。然而,当我们希望建立可解释的模型时,简单性会带来很大的好处。
PRISM 是一种规则归纳工具。也就是说,它创建一组规则来根据其他特征预测目标特征。
规则在机器学习中至少有几个非常重要的用途。一是预测。与决策树、线性回归、GAM、ikNN、加性决策树、决策表和少数其他工具类似,它们可以提供可解释的分类模型。
规则也可以简单地用作理解数据的一种技术。事实上,即使没有标签,它们也可以以无监督的方式使用,创建一组规则来预测每个特征之间的区别(依次将表中的每个特征视为目标列),这可以突出显示数据中的任何强模式。
还有其他用于在 Python 中创建规则的工具,包括非常强大的imodels 库。但是,创建一组既准确又易于理解的规则仍然具有挑战性。规则感应系统通常无法创建合理准确的模型,或者,如果可以,也只能通过创建许多规则和包含许多术语的规则来实现。例如,以下规则:
如果颜色 =’蓝色’ 并且高度 < 3.4 并且宽度 > 3.2 并且长度 > 33.21 并且温度 > 33.2 并且温度 < 44.2 并且宽度 < 5.1 并且重量 > 554.0 并且 … 那么…
如果规则包含超过五到十个术语,它们就会变得难以遵循。如果术语足够多,规则最终可能会变得无法解释。如果规则集包含的规则数量超过中等数量,整个规则集就会变得难以遵循(如果每条规则都包含许多术语,情况就更是如此)。
PRISM 规则
PRISM 是一个规则归纳系统,由 Chendrowska 首次提出,并在《数据挖掘原理》中进行了描述。
PRISM 支持生成规则,既可以作为描述模型:描述表中的模式(以特征之间的关联形式);也可以作为预测模型。它通常会生成一组非常简洁、清晰的可解释规则。
作为一个预测模型,它提供了所谓的全局和局部解释(在可解释人工智能(XAI)中使用的术语中)。也就是说,它是完全可解释的,既可以理解整个模型,也可以理解单个预测。
测试多个规则感应系统后,我经常发现 PRISM 生成的规则集最简洁。不过,没有一个系统始终表现最佳,通常需要尝试一些规则感应工具。
生成的规则采用析取范式(AND 的 OR),每个单独的规则都是一个或多个项的 AND,每个项的形式为特征 = 值,其中某个值位于该特征的值集合中。例如:生成的规则可能采用以下形式:
目标值“蓝色”的规则:
- 如果 feat_A = ‘hot’ 并且 feat_C = ‘round’ 那么 ‘blue’
- 如果 feat_A = ‘warm’ 并且 feat_C = ‘square’ 那么 ‘blue’
目标值“red”的规则:
- 如果 feat_A = ‘冷’ 并且 feat_C = ‘三角形’ 那么 ‘红色’
- 如果 feat_A = ‘cool’ 并且 feat_C = ‘triangular’ 那么 ‘red’
该算法严格适用于 X 和 Y 列中的分类特征。因此,此实现将自动对所有数字列进行分箱以支持该算法。默认情况下,使用三个等计数分箱(代表特征的低、中、高值),但这可以通过 nbins 参数进行配置(可以使用更多或更少的分箱)。
PRISM 算法
对于本节,我们假设使用 PRISM 作为预测模型,具体来说是作为分类器。
该算法的工作原理是为目标列中的每个类创建一组规则。例如,如果在 Iris 数据集上执行,其中目标列中有三个值(Setosa、Versicolour 和 Virginica),那么将有一组与 Setosa 相关的规则、一组与 Versicolour 相关的规则和一组与 Virginica 相关的规则。
生成的规则应以“先触发规则”的方式读取,因此所有规则都以合理的顺序生成和呈现(从与每个目标类别最相关到最不相关)。例如,检查与 Setosa 相关的规则集,我们将有一组预测鸢尾花是否为 Setosa 的规则,这些规则将按预测性从高到低的顺序排列。其他两个类别的规则集也是如此。
生成规则
我们将在此描述 PRISM 用于为一个类别生成一组规则的算法。假设我们即将使用 Iris 数据集为 Setosa 类别生成规则。
首先,PRISM 会找到可用来预测目标值的最佳规则。Setosa 的第一条规则会预测尽可能多的 Setosa 记录。也就是说,我们会在其他特征的某个子集中找到唯一值集,这些值集最能预测记录何时会是 Setosa。这是 Setosa 的第一条规则。
但是,第一条规则不会涵盖所有 Setosa 记录,因此我们创建了额外的规则来涵盖 Setosa 的剩余行(或尽可能多的行)。
当发现每个规则时,将删除与该规则匹配的行,并找到下一个规则来最好地描述该目标值的剩余行。
每个规则可以有任意数量的术语。
对于目标列中的每个其他值,我们再次从完整数据集开始,在发现规则时删除行,并生成其他规则来解释此目标类值的剩余行。因此,在找到 Setosa 的规则后,PRISM 将生成 Versicolour 的规则,然后生成 Virginica 的规则。
覆盖范围和支持
此实现通过输出与每个规则相关的统计数据增强了数据挖掘原理中描述的算法,因为许多导出的规则可能比其他导出的规则更相关,或者相反,其重要性大大降低。
此外,跟踪有关每条规则的简单统计数据允许提供参数来指定每条规则的最小覆盖率(该规则适用的训练数据中的最小行数);以及最小支持度(目标类别与与规则匹配的行的期望值匹配的最小概率)。这些有助于减少噪音(额外的规则只会给模型的描述或预测能力增加很小的价值),但可能会导致某些目标类别的规则很少或没有规则,可能无法覆盖一个或多个目标列值的所有行。在这些情况下,用户可能希望调整这些参数。
与决策树的比较
决策树是最常见的可解释模型之一,很可能是最常见的。当足够小时,它们可以合理地解释,可能与任何模型类型一样可解释,并且它们对于许多问题(当然不是全部)都可以相当准确。然而,它们作为可解释模型确实有局限性,而 PRISM 的设计就是为了解决这个问题。
决策树并非专门为可解释性而设计的;决策树的一个方便属性就是它们具有可解释性。例如,它们通常会变得比容易理解的要大得多,并且经常会出现重复的子树,因为与特征的关系必须在树中重复多次才能被正确捕获。
此外,单个预测的决策路径可能包含与最终预测无关甚至具有误导性的节点,从而进一步降低可压缩性。
Cendrowska 的论文提供了一些无法用树轻易表示的简单规则集的示例。例如:
- 规则 1:如果 a = 1 并且 b = 1,则 class = 1
- 规则 2:如果 c = 1 并且 d = 1,则 class = 1
这些导致了一棵令人惊讶的复杂树。事实上,这是一种导致决策树过于复杂的常见模式:“有两个(底层)规则没有共同的属性,这种情况在实践中很可能经常发生” [3]
规则通常可以生成比决策树更易于解释的模型(尽管反之亦然),并且对于任何需要可解释模型的项目来说,规则都非常有用。而且,如果目标不是构建预测模型,而是理解数据,那么使用多个模型可能有利于捕获数据的不同元素。
安装
该项目由一个Python 文件组成,可以使用以下命令下载并包含在任何项目中:
从prism_rules导入PrismRules
使用 sklearn 的 Wine 数据集的示例
github 页面提供了两个示例笔记本,提供了使用该工具的简单但全面的示例。不过,该工具非常简单。要使用该工具生成规则,只需创建一个 PrismRules 对象并使用数据集调用 get_prism_rules(),指定目标列:
import pandas as pd from sklearn.datasets import load_winedata = datasets.load_wine() df = pd.DataFrame(data.data, columns=data.feature_names) df['Y'] = data['target'] display(df.head())prism = PrismRules() _ = prism.get_prism_rules(df, 'Y')
结果
该数据集在目标列中有三个值,因此将生成三组规则:
................................................................ Target: 00 ................................................................proline = High AND alcohol = HighSupport: the target has value: '0' for 100.000% of the 39 rows matching the rule Coverage: the rule matches: 39 out of 59 rows for target value: 0. This is:66.102% of total rows for target value: 021.910% of total rows in dataproline = High AND alcalinity_of_ash = LowSupport: The target has value: '0' for 100.000% of the 10 remaining rows matching the rule Coverage: The rule matches: 10 out of 20 rows remaining for target value: '0'. This is:50.000% of remaining rows for target value: '0'16.949% of total rows for target value: 05.618% of total rows in data0................................................................ Target: 1 ................................................................ color_intensity = Low AND alcohol = LowSupport: the target has value: '1' for 100.000% of the 46 rows matching the rule Coverage: the rule matches: 46 out of 71 rows for target value: 1. This is:64.789% of total rows for target value: 125.843% of total rows in datacolor_intensity = LowSupport: The target has value: '1' for 78.571% of the 11 remaining rows matching the rule Coverage: The rule matches: 11 out of 25 rows remaining for target value: '1'. This is:44.000% of remaining rows for target value: '1'15.493% of total rows for target value: 16.180% of total rows in data................................................................ Target: 2 ................................................................ flavanoids = Low AND color_intensity = MedSupport: the target has value: '2' for 100.000% of the 16 rows matching the rule Coverage: the rule matches: 16 out of 48 rows for target value: 2. This is:33.333% of total rows for target value: 28.989% of total rows in dataflavanoids = Low AND alcohol = HighSupport: The target has value: '2' for 100.000% of the 10 remaining rows matching the rule Coverage: The rule matches: 10 out of 32 rows remaining for target value: '2'. This is:31.250% of remaining rows for target value: '2'20.833% of total rows for target value: 25.618% of total rows in dataflavanoids = Low AND color_intensity = High AND hue = LowSupport: The target has value: '2' for 100.000% of the 21 remaining rows matching the rule Coverage: The rule matches: 21 out of 22 rows remaining for target value: '2'. This is:95.455% of remaining rows for target value: '2'43.750% of total rows for target value: 211.798% of total rows in data
对于每条规则,我们都可以看到支持和覆盖。
支持度表示有多少行支持该规则;即:在可以应用该规则的行中,有多少行是正确的。这里的第一条规则是:
proline = High AND alcohol = HighAND alcohol = HighSupport: the target has value: '0' for 100.000% of the 39 rows matching the rule
这表明,在脯氨酸 = 高(特征脯氨酸具有高数值)且酒精度为高(特征酒精具有高数值)的 39 行中,其中 100% 的目标为 0。
覆盖率表示规则覆盖了多少行。对于第一条规则,覆盖率是:
Coverage: the rule matches: 39 out of 59 rows for target value: 0. This is:matches: 39 out of 59 rows for target value: 0. This is:66.102% of total rows for target value: 021.910% of total rows in data
这表示行数和数据行百分比的覆盖率。
生成预测的示例
为了创建预测,我们只需调用 predict() 并传递具有与用于拟合模型的数据框相同特征的数据框(尽管可以选择省略目标列,如本例所示)。
y_pred = prism.predict(df.drop(columns=['Y']))'是' ]))
这样,PRISM 规则可以等效地用于任何其他预测模型,例如决策树、随机森林、XGBoost 等。
但是,在生成预测时,某些行可能不符合任何规则。在这种情况下,默认情况下,将使用训练期间目标列中最常见的值(可以通过访问 prism.default_target 看到)。predict() 方法还支持参数 leave_unknown。如果将其设置为 True,则任何不符合任何规则的记录都将设置为“无预测”。在这种情况下,即使原始目标列是数字,预测也将以字符串类型返回。
示例笔记本中提供了更多示例。
数值数据示例
在此示例中,我们使用 sklearn 的 make_classification() 方法创建数值数据(目标列除外),然后将其分箱。这将使用每个数值特征三个分箱的默认值。
x, y = make_classification(n_samples=1000, 1000, n_features=20, n_informative=2,n_redundant=2,n_repeated=0,n_classes=2,n_clusters_per_class=1,class_sep=2,flip_y=0, random_state=0)df = pd.DataFrame(x) df['Y'] = y prism = PrismRules() _ = prism.get_prism_rules(df, 'Y')
结果
每列的数据被分为低、中、高三个值。结果是每个目标类别的一组规则。
Target: 00 1 = HighSupport: the target has value: '0' for 100.000% of the 333 rows matching the rule Coverage: the rule matches: 333 out of 500 rows for target value: 0. This is:66.600% of total rows for target value: 033.300% of total rows in data15 = Low AND 4 = MedSupport: The target has value: '0' for 100.000% of the 63 remaining rows matching the rule Coverage: The rule matches: 63 out of 167 rows remaining for target value: '0'. This is:37.725% of remaining rows for target value: '0'12.600% of total rows for target value: 06.300% of total rows in data4 = High AND 1 = MedSupport: The target has value: '0' for 100.000% of the 47 remaining rows matching the rule Coverage: The rule matches: 47 out of 104 rows remaining for target value: '0'. This is:45.192% of remaining rows for target value: '0'9.400% of total rows for target value: 04.700% of total rows in data
《数据挖掘原理》一书中的示例
此示例是在 github 页面上的一个示例笔记本中提供的。
PRISM 制定了三条规则:
- 如果眼泪 = 1 那么目标=3
- 如果 astig = 1 并且 tears = 2 并且 specRX = 2 那么 Target=2
- 如果 astig = 2 且 tears = 2 AND specRX =1 那么 Target =1
执行时间处理时间
该算法通常能够在几秒或几分钟内生成一组规则,但如果需要减少算法的执行时间,可以使用数据样本代替完整数据集。该算法通常在数据样本上效果很好,因为模型寻找的是一般模式而不是例外,并且这些模式将存在于任何足够大的样本中。
github 页面上提供了有关调整模型的进一步说明。
结论
不幸的是,目前可用的可解释预测模型相对较少。此外,没有一个可解释模型对所有数据集都足够准确或足够可解释。因此,在可解释性很重要的地方,值得测试多个可解释模型,包括决策树、其他规则归纳工具、GAM、ikNN、加法决策树和 PRISM 规则。
PRISM 规则通常会生成清晰、可解释的规则,并且通常具有较高的准确度,尽管这会因项目而异。虽然与其他预测模型类似,但需要进行一些调整。
感谢关注雲闪世界。(亚马逊aws和谷歌GCP服务协助解决云计算及产业相关解决方案)
订阅频道(https://t.me/awsgoogvps_Host)
TG交流群(t.me/awsgoogvpsHost)d