可解释回归#

在本笔记本中,我们将拟合回归可解释增强机 (EBM)、LinearRegression 和 RegressionTree 模型。拟合完成后,我们将利用它们的透明盒特性来理解其全局解释和局部解释。

本笔记本可在 GitHub 上的我们的 示例文件夹 中找到。

# install interpret if not already installed
try:
    import interpret
except ModuleNotFoundError:
    !pip install --quiet interpret scikit-learn
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from interpret import show
from interpret.perf import RegressionPerf

from interpret import set_visualize_provider
from interpret.provider import InlineProvider
set_visualize_provider(InlineProvider())

dataset = fetch_california_housing()
X = dataset.data
y = dataset.target
names = dataset.feature_names

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)

探索数据集

from interpret import show
from interpret.data import Marginal

marginal = Marginal(names).explain_data(X_train, y_train, name='Train Data')
show(marginal)

训练可解释增强机 (EBM)

from interpret.glassbox import ExplainableBoostingRegressor, LinearRegression, RegressionTree

ebm = ExplainableBoostingRegressor(names, interactions=3)
ebm.fit(X_train, y_train)
ExplainableBoostingRegressor(feature_names=['MedInc', 'HouseAge', 'AveRooms',
                                            'AveBedrms', 'Population',
                                            'AveOccup', 'Latitude',
                                            'Longitude'],
                             interactions=3)
在 Jupyter 环境中,请重新运行此单元格以显示 HTML 表示形式或信任此笔记本。
在 GitHub 上,HTML 表示形式无法渲染,请尝试使用 nbviewer.org 加载此页面。

EBMs 是透明盒模型,因此我们可以对其进行编辑

# post-process monotonize the MedInc feature
ebm.monotonize("MedInc", increasing=True)
ExplainableBoostingRegressor(feature_names=['MedInc', 'HouseAge', 'AveRooms',
                                            'AveBedrms', 'Population',
                                            'AveOccup', 'Latitude',
                                            'Longitude'],
                             interactions=3)
在 Jupyter 环境中,请重新运行此单元格以显示 HTML 表示形式或信任此笔记本。
在 GitHub 上,HTML 表示形式无法渲染,请尝试使用 nbviewer.org 加载此页面。

全局解释:模型整体学到了什么

ebm_global = ebm.explain_global(name='EBM')
show(ebm_global)

局部解释:如何对单个预测进行解释

ebm_local = ebm.explain_local(X_test[:5], y_test[:5], name='EBM')
show(ebm_local, 0)

评估 EBM 性能

ebm_perf = RegressionPerf(ebm, names).explain_perf(X_test, y_test, name='EBM')
show(ebm_perf)

让我们测试其他一些可解释模型

from interpret.glassbox import LinearRegression, RegressionTree

lr = LinearRegression(names)
lr.fit(X_train, y_train)

rt = RegressionTree(names, random_state=seed)
rt.fit(X_train, y_train)
<interpret.glassbox._decisiontree.RegressionTree at 0x7f2375bfffd0>

使用仪表板比较性能

lr_perf = RegressionPerf(lr, names).explain_perf(X_test, y_test, name='Linear Regression')
show(lr_perf)
rt_perf = RegressionPerf(rt, names).explain_perf(X_test, y_test, name='Regression Tree')
show(rt_perf)

透明盒:我们所有的模型都具有全局解释和局部解释

lr_global = lr.explain_global(name='Linear Regression')
show(lr_global)
rt_global = rt.explain_global(name='Regression Tree')
show(rt_global)