学习使用LIME的模型解释

391 阅读10分钟

使用LIME进行模型解释

模型解释可以找出一个模型在预测阶段做出某些决定的原因。这可以确保我们有一个公平、负责任和透明的模型。

在模型解释中,我们试图回答这个问题;为什么我们应该相信这个模型?为什么模型会做出这个结论?使用模型解释,我们也许能够解释模型在做什么,为什么它要做出预测。

这有助于参与的利益相关者和终端用户了解模型的工作原理。这使得用户有信任和信心使用这些模型来解决关键任务的现实世界问题。

这些问题对自驾车模型和健康系统模型等事项有帮助。它们对社会和商业有很大的影响,因为它们是生死攸关的问题。

在本教程中,我们将建立一个简单的机器学习模型,然后使用LIME来解释我们的模型。

前提条件

要完成这篇文章,读者应该。

  • 安装有[Python]。
  • 对[Python编程]有一定的了解。
  • 熟悉[机器学习建模。]
  • 熟悉[谷歌合作笔记本。]

简介

模型解释在今天的机器学习构建中产生了巨大的影响。通过解释,我们可以建立一个更强大、更准确、最值得信赖的模型。

这就是为什么模型解释很重要的几个原因。

模型解释的重要性

  • 它可以检测到模型中的错误和漏洞--模型很容易出现错误和漏洞。这些可能是由于人为的错误或废弃的软件依赖性。模型解释可以调试这些错误并解决它们。
  • 它在模型训练期间检测到偏见 - 当我们有不平衡的数据时就会出现偏见。这是当我们没有正确地分割我们的数据集。模型解释确保我们的数据集是很平衡的,以避免任何偏见。
  • 了解模型的可靠性 - 一个可靠的模型是能够给出一致的结果。通过模型解释,我们将能够知道我们是否可以相信一个模型的预测结果。
  • 为了提高模型的性能和概括性--模型解释增加了模型的准确性得分。这确保它有更高的机会做出正确的预测。
  • 在预测过程中识别错误的分类--模型解释分析了预测结果。它使用不同的技术来识别错误和正确的预测。这确保只有正确的预测被接受。

在模型解释中,我们有不同的方法和技术使用。它们取决于使用的算法类型,机器学习问题的类型,以及这些问题的复杂性。

模型解释方法和技术

这些模型方法和技术如下。

特定模型的方法

这种技术只针对某些模型,可能无法应用于其他机器学习模型。它检查一个模型内的具体特征和属性。

它还检查它们如何影响模型的一般功能。

本地或全局范围方法

局部范围用于单个预测,并解释为什么一个模型做出了单个预测。全局范围超出了单个预测的范围,它解释了模型的一般行为。

在本教程中,我们将使用虹膜数据集建立一个简单的分类模型。该模型根据用户的输入对花种进行分类。

从那里,我们将使用LIME来解释这个模型。

让我们开始建立我们的模型。

导入探索性数据分析包

这些包用于数据分析和操作。我们使用Pandas来加载我们的数据集。Numpy对我们的数据集进行数学和科学计算。

import pandas as pd
import numpy as np

让我们使用Pandas来加载我们的数据集。

df = pd.read_csv("iris-dataset.csv")

让我们检查一下数据集的结构。

df.head()

输出如下所示。

Dataset structure

这表明,我们的模型有以下几列。sepal_width,petal_length,petal_width, 和species 。这些列在进行预测时被用作输入。

创建特征

特征是数据集中的关键属性,在模型训练中被用作输入。在模型训练过程中,特征被模型用于模式识别。

X = df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]

创建标签

标签是模型试图预测的目标变量。在这种情况下,我们的标签是species 列,模型试图预测某一特定花卉的种类。

Y = df['species']

让我们使输出是唯一的,这确保我们可以减少模型的偏差。

class_names = Y.unique()

模型的建立

我们将导入建立我们的机器学习模型所需的所有软件包,如下图所示。

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

在上面的代码中,我们导入了以下内容。

LogisticRegression

这是一种Scikit-learn算法。它用于解决分类问题。

准确率_score

这是用来计算我们的模型在预测过程中的准确性分数。准确率分数越高,我们的模型在预测方面就越好。

训练_测试_拆分

这个方法用于将我们的数据集分成两组。第一组用于训练我们的模型,第二组用于测试模型。

现在让我们来分割我们的数据集。

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.30, random_state=7)

在上面的代码中,我们指定分割比例为0.30 。这意味着70% 的数据集将被用来训练我们的模型,而30% 来测试同一个模型。

现在,让我们看看训练值。训练值是花的长度和宽度。这些尺寸是特定于花的种类的。

这些花的种类是:virginicasetosaversicolor 。它们的长度和宽度显示在下面的图片中,存储在一个数组中。

Flower sizes

让我们检查一下我们的训练集中的可用数据点。

X_train.shape

输出如下图所示。

(105, 4)

这表明在训练集中总共有105 个花种和4 列。

接下来,让我们使用逻辑回归来建立和训练我们的模型。

使用逻辑回归进行模型训练

我们首先初始化LogisticRegression() 方法。这个算法是在训练我们的模型时使用的。

model_logreg = LogisticRegression()

初始化我们的模型后,我们将把模型拟合到数据集中。我们使用训练数据集来拟合我们的模型。该模型使用这个数据集来识别加强预测分析的模式。

在训练阶段,模型通过学习获得知识并储存起来。它最终使用这些存储的知识来进行预测。

model_logreg.fit(X_train, Y_train)

在训练阶段,该模型对其参数进行微调。然后,它输出具有最佳参数的模型。

微调后的模型将被用于给出最佳解决方案,如下图所示。

Model output

让我们使用测试数据集来测试我们的模型。

模型测试

这确保我们评估模型的质量和性能。它还能确保我们没有一个有偏见的模型。

model_logreg.predict(X_test)

该模型被用来预测在测试集中发现的数据点实例。预测输出如下所示。

Testing output

为了评估这个预测,我们需要计算这个模型的准确度得分。

计算准确率得分

准确率得分显示了我们的模型所做的正确预测的数量。我们把它表示为一个百分比。

准确率得分越高,模型的预测效果越好。

准确率得分的计算方法如下。

accuracy_score(Y_test,model_logreg.predict(X_test))

输出结果如下所示。

0.8888888888888888

当我们把准确度分数转换成百分比时,它变成了88.89% 。这表明我们的模型有一个88.89% 的机会做出准确的预测。

进行单一预测

单一预测包括使用数据集中的单一数据点来进行预测。让我们使用数据集中的一个数据点。

ex_specie = np.array(X_test.iloc[8]).reshape(1,-1)

我们使用X_test.iloc() 方法来提取我们数据集中的第8行。这第8行是我们的模型将用来进行单一预测的内容。

然后我们使用reshape(1,-1) ,以确保我们有一列预测结果。现在让我们用这一列来进行预测。

model_logreg.predict(ex_specie)

预测结果如下所示。

array(['setosa'], dtype=object)

预测结果是setosa ,根据我们的测试数据集,这是真的。

根据我们的模型,这些是预测的结果,但是我们应该盲目地相信这些结果吗?或者,我们应该试着去了解这个模型是如何得出这个结论的?

这就是为什么我们需要使用模型解释技术来验证这些结果,增加我们对模型的信任。这可以确保我们知道这个模型是如何工作的,以及它的可靠性水平。

让我们用LIME开始我们的模型解释。

用LIME解释模型

LIME代表本地可解释的模型预知性解释,它涵盖了一个本地范围。局部范围用于个别预测。它解释了为什么模型做出了一个单一的预测,并且简单易懂地做到了这一点。

为了使用LIME,我们首先需要安装它。

我们使用以下命令来安装LIME。

!pip install lime

LIME有不同的方法用于解释。这取决于作为输入的数据的类型。

它们包括。

  • 表格式数据解释技术。
  • 文本数据解释技术。
  • 图像数据解释技术。

在本教程中,我们将使用表格式数据。表格式数据是一种以行和列组织的数据类型。

让我们导入LIME和表格式数据解释技术。

import lime
import lime.lime_tabular

现在让我们为上面的预测创建一个解释器。解释器将解释为什么模型会做出这个预测。

在上面的例子中,模型预测第8行是setosa

解释器的实例如下。

LIME 解释器

explainer = lime.lime_tabular.LimeTabularExplainer(X_train.values, feature_names=feature_names, class_names=class_names, discretize_continuous=True)

在上面的代码中,我们必须指定我们所处理的是哪种LIME解释。在这种情况下,我们将其指定为lime_tabular.LimeTabularExplainer

我们还需要传递X_train.values,feature_names, 和class_names 作为参数。这使得LIME能够理解输入数据集中的模式。通过这样做,它可以验证预测的结果。

应用LIME解释器

让我们把这个解释器应用于数据集的第8行。

exp = explainer.explain_instance(X_test.iloc[8],model_logreg.predict_proba,num_features=4,top_labels=1)

在上面的代码中,我们已经指定了我们希望LIME解释其预测的行,即X_test.iloc[8] 。我们还通过model_logreg ,这是逻辑回归模型。

然后LIME可以使用predict_proba 来验证预测结果。predict_proba 将提供该实例的预测概率。

最后我们指定数据集中的特征和标签为num_features=4top_labels=1 。现在让我们看看这个解释器的结果。

显示解释器的结果

要看到解释器的结果,请运行这个命令。

exp.show_in_notebook(show_table=True, show_all=False)

这使我们能够在我们的笔记本中看到结果。

我们可以看到LIME给出了如下的预测概率。

  • Setosa的概率为0.88。
  • versicolor,概率为0.12。
  • virginica,概率为0.0。

这表明Setosa的概率较高,为0.88,这使它成为正确的预测结果。图像的中间部分提供了必须实现的规则,从而使预测结果为Setosa。

这些规则如下。

  • 花瓣长度 >= 1.50
  • 萼片宽度>3.30
  • 萼片长度<=5.10

根据图像的右侧,所有这些规则都得到满足。图片的右侧给出了我们输入特征的尺寸。

使用这种视觉表现,我们可以看到我们的模型做出了正确的预测。这表明我们现在可以信任这个模型。

总结

在本教程中,我们已经学会了使用LIME进行模型解释。我们从建立我们的简单模型开始,然后用这个模型来解释模型解释的概念。

我们还遵循了机器学习的所有阶段,得出了一个模型。该模型能够预测花种的类型。

最后,我们用LIME来解释和说明模型的预测结果。我们能够理解模型的功能。这使用户在使用这些模型时能够信任它们。