在机器学习模型中建立信任的案例
全球道路上大约有12亿辆汽车。这是一个令人毛骨悚然的问题-您认为实际上有多少驾驶员了解车辆的内部运行情况?
正如您可能已经猜到的,答案只有少数几个人。我们不需要了解驾驶车辆的内部操作。因此,对于我们大多数人来说,这辆车是一个黑匣子,但它确实为驾驶员做好了工作。但是设计和制造车辆的人呢?他们需要彻底了解来龙去脉。
这正是我们使用
数据科学家不能不说自己使用了复杂的
在大多数数据科学项目中,我们需要建立可信赖且
请注意,我将讨论如何使用每个库来提高机器学习的可解释性。如果您想了解构建可解释模型的整个概念,建议查看以下文章:
用于构建可解释的机器学习模型的Python库
这是我们将在本文中讨论的6个Python库:5级
酸橙
夏普
黄砖
阿里比
清醒的
让我们开始!
1.使用ELI5解释机器学习模型
ELI5是“像我五岁一样解释”的首字母缩写。这个恰当命名的Python库具有解释大多数机器学习模型的功能。解释机器学习模型有两种主要方法:全局解释:查看模型的参数并在全局级别确定模型的工作方式
本地解释:查看单个预测并确定导致该预测的特征
对于全局解释,ELI5具有:
eli5 。show_weights (clf )#clf 是拟合的模型
对于本地解释,ELI5具有:
eli5 。show_predictions (clf,X_train.iloc [1],feature_names = list(X.columns))
#clf是拟合的模型
#X_train.iloc [1]是索引1处的记录
#feature_names是列名称/功能的列表
如我们所见,我们仅获得训练数据中第一条记录的预测:
ELI5库的亮点之一是它已经为流行的库提供了支持,例如scikit-learn,
我们也可以将ELI5用于文本数据!它有一个用于解释
2.使用LIME解释机器学习模型
考虑一下–您是否愿意从一个随机的人那里观看电影,如果有人推荐,可以观看它?没有权利?您将阅读著名电影评论家对电影的评价,然后做出决定。这是因为您信任电影评论家的意见。
同样,根据LIME的作者,用于构建机器学习模型的关键字是trust。
在机器学习模型上获得最佳预测不是最终目标,不是吗?最终目标是根据这些预测做出决策,而这正是人类参与的地方。人类/决策制定者需要信任模型和预测才能做出决策-尤其是在生死攸关的情况下,关注金钱。
LIME(本地可解释模型不可知的解释)背后的想法是提供做出预测的原因。以同一示例为例,如果机器学习模型预测电影将成为大片,则LIME会突出显示电影的特征,这将使它成为超级热门。诸如流派和演员之类的功能可能有助于电影的出色表现,而诸如放映时间,导演之类的其他功能可能会不利于它。
LIME的创建者概述了必须满足的四个基本解释标准:可解释的:根据目标人群的解释必须易于理解
局部保真度:解释应该能够解释模型对于单个预测的行为
与模型无关:该方法应能够解释任何模型
全局角度:在解释模型时应整体考虑
这些都是要遵循的极好的标准,我们一般可以将它们用于机器学习模型的可解释性。
使用LIME的语法是:
进口石灰
导入lime.lime_tabular
解释器= lime.lime_tabular.LimeTabularExplainer(np.array(X_train),feature_names,
class_names,categorical_features,mode)
#np.array(X_train):训练数据
#class_names:目标变量(用于回归),目标中的不同类
变量(用于回归)
#categorical_features:列出所有分类的列名
#模式:对于回归问题:“回归”,并且
对于分类问题,“分类
上面的示例适用于表格数据(仅数字或类别)。这是显示多类分类问题的输出的方式:
对于单个预测:
exp = explorer.explain_instance(数据行,预测功能)
exp.as_pyplot_figure()#破坏解释
#data_row:我们要预测的单个测试数据点
#predict_function:预测模型
我们也可以将LIME用于图像和文本数据:
解释器 = lime_image 。LimeImageExplainer ()
# 要么
解释器 = lime_image 。LimeTextExplainer()以下是可用于图像数据的功能列表:
使用文本数据和LIME:
要使用代码和示例全面了解LIME,可以参考以下两篇文章:
3.使用SHAP解释机器学习模型
“ SHapley Additive exPlanations” Python库(俗称SHAP库)是用于机器学习可解释性的最受欢迎的库之一。SHAP库以Shapley值为核心,旨在解释各个预测。
但是,等等– Shapley的价值观是什么?简而言之,Shapley值是从
我们不会在这里详细介绍这种技术,但是您可以参考这篇出色的文章,解释Shapley值的工作原理:
SHAP最好的部分是它为基于树的模型提供了一个特殊的模块。考虑到黑客马拉松和行业中基于树的模型的流行程度,即使考虑相关功能,该模块也可以进行快速计算。
这是如何将SHAP库用于单个预测的基本语法(
进口杂货
#需要在笔记本中加载JS可视化
shap.initjs()
#假设我们正在使用XGBoost
解释器= shap.TreeExplainer(xgb_model)
shap_values = explorer.shap_values(X_train)
shap.force_plot(explainer.expected_value,shap_values [i],features = X_train.loc [i],
feature_names = X_train.columns)
#i:个人记录的ID
尽管SHAP试图解释单个预测,但我们也可以使用它来解释全局预测:
shap.summary_plot(shap_values,features,feature_names)
#features:我们的自变量训练集
#feature_names:上述训练集中的列名列表
4.使用Yellowbrick解释机器学习模型
Yellowbrick库基于scikit-learn和
Yellowbrick使用“可视化工具”的概念。可视化工具是一组工具,可帮助我们考虑各个数据点来可视化数据中的功能。将其视为所有功能的仪表板。Yellowbrick提供的主要展示台是:等级特征:可视化单个特征及其与其他特征的相关性
RadViz Visualizer:可视化类之间的可分离性
平行坐标:可视化目标类相对于其他要素的分布
PCA投影:使用
流形可视化:使用流形学习(如
直接数据可视化/联合绘图可视化器:可视化各个要素与目标变量之间的关系
使用这些展示台是一个非常简单的4行过程。语法类似于我们在scikit-learn中使用转换器的方式。
例如:
从 yellowbrick.features 导入 JointPlotVisualizer
visualizer = 关节图可视化器(列= [ 'col1' , 'col2' ])
可视化器。fit_transform (X , y )
可视化工具。显示()
#col1和col2是我们要探讨的2列。
#X是自变量
#y是目标变量
5.使用Alibi解释机器学习模型
Alibi是一个开放源代码Python库,它基于实例的预测解释(在这种情况下,实例表示单个数据点)。该库由不同类型的解释程序组成,具体取决于我们处理的数据类型。这是创作者自己制作的便捷表格:
如您所见,该库基于不同的技术提供了不同类型的Explainer模型。尽管我们不会详细介绍它们,但需要注意的是该库是专门为黑盒模型设计的。本质上,您只需要最后使用模型预测即可使用该库。当我们不想篡改我们的机器学习模型的工作流程时,这特别有用。
安装Alibi会安装许多其他有用的库(作为其依赖项的一部分),例如scikit-learn,Pandas,
这是其中一个解释器的示例(由于我们已经在上面进行了探讨,因此请使用内核SHAP):
从alibi.explainers导入KernelShap
说明者 = KernelShap (prediction_function)
说明者。适合(X_train )
说明= explorer.explain(X_test)
#prediction_function:本predcition功能
#X_train:训练独立变量集
X_test:独立变量的测试集
6.使用Lucid解释机器学习模型
随着深度学习在整个行业中变得越来越主流,解释这些深度学习模型的需求变得迫在眉睫。但是,考虑到我们必须处理的大量功能,这可能会变得特别具有挑战性。
Lucid库旨在通过提供可视化神经网络的工具来填补这一空白。最好的部分?您无需任何预先设置即可可视化神经网络!
由一组研究人员开发并由志愿者维护,Lucid专门致力于使用神经网络和深度学习模型。它由Modelzoo组成,该组件已经预装了各种深度学习模型。
这是可视化神经元的方法(我们采用了Inceptionv1):
将lucid.modelzoo.vision_models导入为模型
从lucid.misc.io导入显示
导入lucid.optvis.objectives作为目标
将lucid.optvis.param导入为param
导入lucid.optvis.render作为渲染
导入lucid.optvis.transform作为转换
#加载模型
模型=模型.InceptionV1()
model.load_graphdef()
#可视化神经元
_ = render.render_vis(模型,层)
#layer可以是Inception模型中的任何层,例如con1d,conv2d,maxpool10等。
我们可以尝试使用不同的参数,例如使用转换后的数据,可视化特定通道的效果等。
到目前为止,它们仅与TensorFlow 1.0一起使用
尽管笔记本全面地介绍了每个示例,但仍没有像我们上面介绍的库那样丰富的文档来源
尽管有这些限制,Lucid还是一个出色的库,适合希望详细研究神经网络的学生和研究人员。考虑到神经网络和深度学习的普及,这个空间值得一看!
尾注
在这个领域中还有许多非常好的Python库,我恳请您探索它们。随着机器学习和深度学习在该行业中变得越来越主流,对可解释性的需求也随之增加。重要的是,将模型所做的预测传达给所有利益相关者,以便做出正确的决策。因此,这些工具和库是工业和研究中小时的需求。
如果您自己使用过上述工具,请在下面的评论部分中分享您的经验和反馈!