使用InterprateML构建玻璃盒模型
玻璃盒模型是对用户透明的模型。在玻璃盒模型中,所有的特征和模型参数对用户来说都是已知的。他们也知道模型用来得出预测结果和结论的标准。
这就提供了完全的透明度。人们可以知道模型在幕后是如何工作和运作的。在生产环境中,玻璃盒模型更加稳健,容易适应。
传统上,许多机器学习工程师一直在建立黑盒模型。然而,在黑盒模型中,用户不知道模型的内部工作原理。因此,用户无法理解这些模型,而盲目地接受模型。
黑箱模型隐藏了使用这些模型的实际风险。玻璃盒模型是更好的选择,它让你充分接触到模型。
本教程将同时建立一个黑盒模型和一个玻璃盒模型。首先,我们将使用InterpretMl建立一个玻璃箱。InterpretMl的方法和属性可以解释模型做出的每一个决定。
先决条件
要继续学习本教程,你需要具备以下条件。
- 具备[Python编程]技能。
- 知道如何[建立机器学习模型。]
- 知道如何[使用Sckit-learn库。]
- 知道如何运行[谷歌Colab笔记本。]
玻璃盒模型的优势
玻璃盒模型有以下优点。
- 帮助数据科学家和机器学习工程师了解模型的行为。
- 玻璃盒模型可以很容易地进行调试。
- 玻璃盒更准确;模型做出的预测结果是准确的,可以信赖。
- 它们的训练和使用都很简单。
- 在企业中采用时,可以减少风险。这是因为企业利益相关者清楚地了解模型的工作原理。这有助于尽量减少风险的发生。
安装InterpretMl
为了使用InterpretMl,我们需要安装它。让我们用下面的代码来安装它。
! pip install interpret
现在我们已经安装了InterpretMl,让我们开始使用我们的数据集。
探索数据集
我们需要导入探索性数据分析包来处理我们的数据集。这些包用于数据分析和操作。
import pandas as pd
import numpy as np
我们将使用一个从不同银行收集的数据集。该数据集包含关于银行客户的各种信息。例如,它预测了一个银行客户是否会订阅每月的银行付款。
下面是该数据集的一个片段。

要获得本教程中使用的完整数据集,请点击这里,然后使用下面的代码段来加载数据集。
df = pd.read_csv("/content/bank-full.csv",sep=';')
下面的代码片断使我们能够看到我们的数据集的结构。
df.head()
该结构如下图所示。

我们还需要对我们的数据集进行格式化。数据集应该有相同的数据类型,以便在模型训练期间保持统一。添加这个代码片断来显示类型。
df.dtypes
输出如下图所示。

从上面的图片来看,数据集是不统一的。例如,我们有int64 和object ,我们需要将所有的数据类型转换成int64 。int64 很容易被模型读取,因为它们是数字。object 是类别或组。
将object 转换为int64 的过程被称为分类编码(categorical encoding)。
为了转换我们的数据类型,运行这段代码。
df1 = pd.DataFrame({col: df[col].astype('category').cat.codes for col in df}, index=df.index)
在上面的代码中,cat.codes ,为我们的数据集中的类别或组分配数字。要看到结果,请运行这段代码。
df1.head()
输出显示如下。

从上面的图片中,我们可以看到,我们的数据集被转换成了数字值。现在我们的数据集被适当地格式化了,我们可以开始建立模型。
黑盒模型
我们将从建立一个黑盒模型开始。但是,首先,让我们导入机器学习包。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split,cross_val_score
让我们看看我们已经导入了什么。
LogisticRegression:这是用来训练我们黑盒分类模型的算法。
train_test_split:它将把数据集分成一个训练集和一个测试集。
cross_val_score:将用于计算机器学习模型的准确性分数。
标签和特征
特征是我们数据集中的X variable 。这代表了所有的输入列,将在模型训练中使用。
Xfeatures = df1[['age', 'job', 'marital', 'education', 'default', 'balance', 'housing','loan', 'contact', 'day', 'month', 'duration', 'campaign', 'pdays', 'previous', 'poutcome']]
标签是我们数据集中的y variable 。这代表了预测阶段的输出列。
ylabels = df1['y']
分割数据集
要分割数据集,请运行这个命令。
x_train,x_test,y_train,y_test = train_test_split(Xfeatures,ylabels,test_size=0.3,random_state=7)
数据集将使用test_size=0.3 。数据集的70% 将用于训练,30% 用于测试。
我们将使用LogisticRegression 算法建立模型。
lr_model = LogisticRegression()
lr_model.fit(x_train,y_train)
我们将该算法初始化为LogisticRegression() 。然后我们将模型拟合到我们的数据集中。fit 方法使模型能够从x_train 和y_train 中学习。该模型可以获得足够的知识来进行预测。
模型的准确度得分
我们使用以下代码计算准确率得分。
lr_model.score(x_test,y_test)
结果显示如下。
0.8905927455028015
准确率得分是89.05927455028015% 。
这是一个黑箱模型,它没有向用户解释它是如何达到这个准确率分数的。此外,它也没有显示对这个准确率分数有贡献的特征。
由于这些原因,我们需要一个玻璃盒模型来帮助解决这个问题。
玻璃盒模型
如前所述,我们将使用InterpretMl来建立一个玻璃盒模型。使用下面的代码片段来导入InterpretMl。
import interpret
我们将使用ExplainableBoostingClassifier 算法来建立玻璃盒模型。这个算法是一个内置的InterpretMl算法,可以建立一个透明的模型。
ExplainableBoostingClassifier 有一个技术和算法的组合。这建立了一个高效的模型和准确的模型。它也大大改善了模型的性能。
使用下面的片段来导入ExplainableBoostingClassifier.
from interpret.glassbox import ExplainableBoostingClassifier
我们现在可以初始化该算法,并将其适合于我们的训练集。
ebm = ExplainableBoostingClassifier()
ebm.fit(x_train,y_train)
如下图所示,这个过程将训练并建立我们的玻璃盒模型。

我们现在可以计算出我们模型的准确度分数。
ebm.score(x_test,y_test)
准确率得分如下所示。
0.9081391919787674
准确率得分是90.81391919787674% 。与黑盒模型的准确率相比,准确率更高。
进行预测
我们将使用下面的数据样本来预测,使用该模型。
ex1 = x_test.iloc[8]
这段代码将选择我们测试集中的9th 行。
print(ebm.predict([ex1]))
print(ebm.predict_proba([ex1]))
ebm.predict 方法将打印预测结果,而ebm.predict_proba 将打印下面的预测概率。
[0]
[[0.93202639 0.06797361]]
预测结果是0 ,表明客户不会订阅每月的银行付款。预测概率是0.93202639 ,发生的概率非常高。
由于这是一个玻璃盒模型,我们可以用InterpretMl来解释为什么模型会做出这个预测。它还向我们展示了哪些特征对准确率得分的贡献。
解释模型的结果
我们现在可以探索用于解释的方法和属性。
dir(interpret)
这将向我们展示所有的方法和属性,如下图所示。

从上面的图片来看,InterpretMl有不同的方法和属性。我们最感兴趣的是show 方法。这个方法将使我们清楚地看到我们的模型所做的任何决定的所有促成因素。
让我们导入show 方法。
from interpret import show
我们有两种技术来解释模型的结果:全局解释和局部解释。全局解释解释了任何模型的整体结构和行为。局部解释解释了模型所做的个别预测或分类。它比全局解释更具体。
全局解释
要进行全局解释,请运行这段代码。
ebm_global = ebm.explain_global()
explain_global() 方法被用来解释模型。要在用户界面上看到解释,请运行这段代码。
show(ebm_global)
show 方法将显示一个用户界面,如下图所示。

上面的图片给出了每个特征的总体重要性的总结。这些特征是根据其重要程度排列的。duration 特征的重要性最高。它对模型的准确度得分和预测结果贡献很大,而education 特征的贡献最小。
本地解释
要进行局部解释,请运行此代码。
ebm_local = ebm.explain_local(x_test,y_test)
ebm.explain_local 方法将对预测结果进行解释。要显示一个用户界面,请运行这段代码。
show(ebm_local)
该界面如下所示。

特征被分组为对预测结果有贡献的特征和对预测结果有反对意见的特征。对预测结果有贡献的特征用颜色表示orange 。另一方面,那些反对预测的特征是用颜色表示的blue 。使用用户界面,用户现在可以知道每个特征所扮演的角色。这导致了更加透明的模型,人们可以很容易地理解。
总结
在本教程中,我们已经学会了如何建立一个黑盒模型和一个玻璃盒模型。我们还讨论了玻璃盒模型的优点,以及为什么它们比黑盒更受欢迎。
在建立了这两个模型后,我们比较了一下结果,看看哪个更好。最后,使用InterpretMl,我们解释了我们的黑箱模型,让用户对模型的工作有了详细了解。
玻璃盒模型总是更好的选择,用户可以很容易地信任它们。这减少了在生产中使用该模型时的风险。