图片来源:unsplash.com/@nbb_photos

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

这四个库都是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()

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

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()

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())

默认情况下,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)

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)

  1. 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)

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

留言 点赞 发个朋友圈

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

编译组:段昌蓉、梁晶晶
相关链接:
https://towardsdatascience.com/python-libraries-for-interpretable-machine-learning-c476a08ed2c7

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

推荐文章阅读

ACL2018论文集50篇解读
EMNLP2017论文集28篇论文解读
2018年AI三大顶会中国学术成果全链接
ACL2017 论文集:34篇解读干货全在这里
10篇AAAI2017经典论文回顾

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

读芯君爱你