增强ML模型的可解释性,让这4个库大显身手吧!


640?wx_fmt=jpeg


全文共4242字,预计学习时长8分钟


增强ML模型的可解释性,让这4个库大显身手吧!_第1张图片

图片来源:unsplash.com/@nbb_photos


随着人们对人工智能的偏见越来越明显,企业需要对模型做出的预测与模型本身做出解释——这一点越来越重要。幸运的是,越来越多的Python库正得以开发出来解决这一问题。接下来,本文将简要介绍四个用于解读与解释机器学习模型的python软件包。


增强ML模型的可解释性,让这4个库大显身手吧!_第2张图片


这四个库都是pip可安装的,具有良好的文件编制,强调可视化解读。


1. yellowbrick


传送门:https://www.scikit-yb.org/en/latest/quickstart.html


这个库本质上是scikit-learn学习库的扩展,并为机器学习模型提供了一些极其有用且好看的可视化。可视化工具对象、核心接口都是scikit-learn模拟估算器。如果你习惯于使用scikit-learn学习库,那么就一定不会对yellowbrick的工作流程感到陌生。


获得的可视化包括模型选择、特征重要性与模型性能分析。


下面来举几个简单的例子。


库可以通过pip安装。


 
   

pip install yellowbrick


为说明一些特性,我们将使用一个被称为葡萄酒识别集的scikit-learn数据集。


传送门:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_wine.html#sklearn.datasets.load_wine


这个数据集有13个特性和3个目标类,可直接从scikit-learn学习库加载。在下方代码中,我们导入数据集并将其转化为数据帧。数据可以直接在分类器中使用,不需要任何额外预处理。

 
   

import pandas as pd

from sklearn import datasets

wine_data = datasets.load_wine()

df_wine = pd.DataFrame(wine_data.data,columns=wine_data.feature_names)

df_wine['target'] = pd.Series(wine_data.target)


我们还使用scikit-learn进一步将数据集拆分为测试集与训练集。

 
   

from sklearn.model_selection import train_test_split


X = df_wine.drop(['target'], axis=1)

y = df_wine['target']


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)


接下来,使用Yellowbricks可视化工具观察数据集中各特性的相关性。

 
   

from yellowbrick.features import Rank2D

import matplotlib.pyplot as plt


visualizer = Rank2D(algorithm="pearson",  size=(1080, 720))

visualizer.fit_transform(X_train)

visualizer.poof()


增强ML模型的可解释性,让这4个库大显身手吧!_第3张图片


现在安装一个随机森林分类器,并使用另一可视化工具评估其性能。


 
   

from yellowbrick.classifier import ClassificationReport

from sklearn.ensemble import RandomForestClassifier


model =  RandomForestClassifier()

visualizer = ClassificationReport(model, size=(1080, 720))


visualizer.fit(X_train, y_train)

visualizer.score(X_test, y_test)

visualizer.poof()


增强ML模型的可解释性,让这4个库大显身手吧!_第4张图片


2. ELI5


传送门:https://eli5.readthedocs.io/en/latest/


ELI5是另一个可视化库,可用于调试机器学习模型并解释模型所做出的预测。它可用于最常见的 Python机器学习库,如scikit-learn、 XGBoost 和 Keras。


下面使用ELI5检查上方训练后模型的特征重要性。

 
   

import eli5


eli5.show_weights(model, feature_names = X.columns.tolist())


增强ML模型的可解释性,让这4个库大显身手吧!_第5张图片


默认情况下,show_weights方法使用gain计算权重,但也可通过添加importance_type argument 指定其他类型。


也可以用show_prediction检查单独预测的原因。

 
   

from eli5 import show_prediction


show_prediction(model, X_train.iloc[1], feature_names = X.columns.tolist(),

                 show_feature_values=True)


增强ML模型的可解释性,让这4个库大显身手吧!_第6张图片


3. LIME


传送门:https://github.com/marcotcr/lime


LIME(局部可解释模型-不可知论解释)是一个用于解释机器学习算法所做出的预测的软件包。Lime支持各种分类器对单个预测的解释,并内置支持scikit-learn。


下面使用Line解释一些上方已训练模型所做出的预测。


Lime可以通过pip安装。

 
   

pip install lime


首先,建立一个解释器。这将训练数据集看做一个数组,包含模型中使用的特性的名称,和目标变量中类的名称。

 
   

import lime.lime_tabular


explainer = lime.lime_tabular.LimeTabularExplainer(X_train.values,

feature_names=X_train.columns.values.tolist(),                                        class_names=y_train.unique())


接下来,创建一个lambda函数,该函数使用模型对数据样本进行预测,这借鉴于Lime上一个优秀且更加深入的教程(https://www.guru99.com/scikit-learn-tutorial.html)。

 
   

predict_fn = lambda x: model.predict_proba(x).astype(float)


接下来,使用解释器解释所选取示例的预测,结果如下所示。Lime生成可视化,显示这些特性导致这一特定预测结果的过程。


 
   

exp = explainer.explain_instance(X_test.values[0], predict_fn, num_features=6)

exp.show_in_notebook(show_all=False)


640?wx_fmt=png


4. MLxtend


传送门:http://rasbt.github.io/mlxtend/


该库包含很多用于机器学习的辅助函数。这其中包括stacking 和投票分类器、 模型评估、特征提取、编程和制图。


使用MLxtend将voting 分类器的决策边界与其组成分类器进行比较。


同样,MLxtend也能通过pip安装。

 
   

pip install mlxtend


输入内容如下所示。

 
   

from mlxtend.plotting import plot_decision_regions

from mlxtend.classifier import EnsembleVoteClassifier

import matplotlib.gridspec as gridspec

import itertools


from sklearn import model_selection

from sklearn.linear_model import LogisticRegression

from sklearn.naive_bayes import GaussianNB

from sklearn.ensemble import RandomForestClassifier


以下可视化只能一次处理两个特性,因此首先创建一个包含proline 和color_intensity的数组。笔者之所以选择这两个特性,是因为它们在之前使用ELI5观察的特性中具有最高的权重。

 
   

X_train_ml = X_train[['proline', 'color_intensity']].values

y_train_ml = y_train.values


接下来,创建分类器,将它们与训练数据相匹配,并使用MLxtend对决策边界进行可视化。代码下方为输出结果。

 
   

clf1 = LogisticRegression(random_state=1)

clf2 = RandomForestClassifier(random_state=1)

clf3 = GaussianNB()

eclf = EnsembleVoteClassifier(clfs=[clf1, clf2, clf3], weights=[1,1,1])


value=1.5

width=0.75


gs = gridspec.GridSpec(2,2)


fig = plt.figure(figsize=(10,8))


labels = ['Logistic Regression', 'Random Forest', 'Naive Bayes', 'Ensemble']


for clf, lab, grd in zip([clf1, clf2, clf3, eclf],

                         labels,

                         itertools.product([0, 1], repeat=2)):


    clf.fit(X_train_ml, y_train_ml)

    ax = plt.subplot(gs[grd[0], grd[1]])

    fig = plot_decision_regions(X=X_train_ml, y=y_train_ml, clf=clf)    plt.title(lab)


增强ML模型的可解释性,让这4个库大显身手吧!_第7张图片


除了本文介绍的这些之外,还有篇极好的文章中包含很多有用的库,可供你尝试:https://skymind.ai/wiki/python-ai


640?wx_fmt=jpeg

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货


编译组:段昌蓉、梁晶晶

相关链接:

https://towardsdatascience.com/python-libraries-for-interpretable-machine-learning-c476a08ed2c7


如需转载,请后台留言,遵守转载规范


推荐文章阅读


ACL2018论文集50篇解读

EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术成果全链接

ACL2017 论文集:34篇解读干货全在这里

10篇AAAI2017经典论文回顾


长按识别二维码可添加关注

读芯君爱你


你可能感兴趣的:(增强ML模型的可解释性,让这4个库大显身手吧!)