图片来源: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)
- 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经典论文回顾