入门#
安装
Interpret 支持在 Windows、Mac 和 Linux 系统上使用 Python 3.5+ 版本。
pip install interpret
conda install -c conda-forge interpret
git clone interpretml/interpret.git && cd interpret/scripts && make install
InterpretML 支持训练可解释模型(玻璃盒模型)以及解释现有机器学习管道(黑盒模型)。我们以 UCI 成人收入分类数据集为例,介绍这两种用法。
下载和准备数据
首先,我们将数据加载到标准的 pandas DataFrame 或 numpy 数组中,并创建一个训练/测试集划分。使用 InterpretML 处理数据无需特殊的预处理步骤。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from interpret import set_visualize_provider
from interpret.provider import InlineProvider
set_visualize_provider(InlineProvider())
df = pd.read_csv(
"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data",
header=None)
df.columns = [
"Age", "WorkClass", "fnlwgt", "Education", "EducationNum",
"MaritalStatus", "Occupation", "Relationship", "Race", "Gender",
"CapitalGain", "CapitalLoss", "HoursPerWeek", "NativeCountry", "Income"
]
X = df.iloc[:, :-1]
y = (df.iloc[:, -1] == " >50K").astype(int)
seed = 42
np.random.seed(seed)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=seed)
训练玻璃盒模型
玻璃盒模型被设计成完全可解释的,并且通常能提供与最先进方法相似的准确性。
InterpretML 允许您使用熟悉的 scikit-learn 接口训练许多最新的玻璃盒模型。
from interpret.glassbox import ExplainableBoostingClassifier
ebm = ExplainableBoostingClassifier()
ebm.fit(X_train, y_train)
ExplainableBoostingClassifier()在 Jupyter 环境中,请重新运行此单元格以显示 HTML 表示或信任该笔记本。
在 GitHub 上,HTML 表示无法渲染,请尝试使用 nbviewer.org 加载此页面。
ExplainableBoostingClassifier()
解释玻璃盒模型
玻璃盒模型可以在全局(整体行为)和局部(个体预测)层面提供解释。
全局解释有助于理解模型认为重要的因素,以及识别其决策过程中的潜在缺陷(例如,种族偏见)。
此处嵌入的内嵌可视化与笔记本中生成的可视化完全相同。
对于此全局解释,初始摘要页面显示了整体上最重要的特征。您可以使用下拉菜单搜索、筛选并选择单个特征以深入查看细节。
尝试查看“年龄”特征,了解高收入的概率如何随年龄变化;或者查看“种族”或“性别”特征,观察模型可能存在的潜在偏见。
from interpret import show
show(ebm.explain_global())
局部解释显示了单个预测是如何生成的。对于玻璃盒模型,这些解释是精确的——它们完美地描述了模型如何做出决策。
这些解释有助于向最终用户描述哪些因素对预测影响最大。例如,在下面的局部解释“2”中,高收入的概率为 0.93,这很大程度上是由于资本利得(CapitalGains)特征具有较高的值。
此处显示的值是 EBM 生成的对数几率 (log-odds) 分数,这些分数被相加并通过 logistic 链接函数得到最终预测,就像逻辑回归一样。
show(ebm.explain_local(X_test[:5], y_test[:5]), 0)
构建黑盒管道
黑盒可解释性方法可以从任何机器学习管道中提取解释。这包括模型集成、预处理步骤以及深度神经网络等复杂模型。
我们首先训练一个随机森林模型,该模型先经过主成分分析进行预处理。
from sklearn.ensemble import RandomForestClassifier
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
# We have to transform categorical variables to use sklearn models
X = pd.get_dummies(X, prefix_sep='.').astype(float)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=seed)
#Blackbox system can include preprocessing, not just a classifier!
pca = PCA()
rf = RandomForestClassifier(random_state=seed)
blackbox_model = Pipeline([('pca', pca), ('rf', rf)])
blackbox_model.fit(X_train, y_train)
Pipeline(steps=[('pca', PCA()), ('rf', RandomForestClassifier(random_state=42))])在 Jupyter 环境中,请重新运行此单元格以显示 HTML 表示或信任该笔记本。
在 GitHub 上,HTML 表示无法渲染,请尝试使用 nbviewer.org 加载此页面。
Pipeline(steps=[('pca', PCA()), ('rf', RandomForestClassifier(random_state=42))])
PCA()
RandomForestClassifier(random_state=42)
解释黑盒模型
进行黑盒可解释性分析所需的全部是一个来自目标机器学习管道的预测函数。
黑盒可解释性方法通常通过反复扰动输入数据并将其输入管道,然后观察最终预测如何变化来工作。
因此,全局解释和局部解释都是近似的,有时可能不准确。在高风险环境中使用结果时请务必谨慎。
from interpret.blackbox import LimeTabular
from interpret import show
lime = LimeTabular(blackbox_model, X_train, random_state=seed)
show(lime.explain_local(X_test[:5], y_test[:5]), 0)