在本教程中,将探讨如何使用PartialDependenceDisplay
对象来绘制部分依赖图,而无需重新计算部分依赖。将展示如何绘制部分依赖图,并如何使用可视化API快速自定义图表。
本文遵循BSD-3-Clause许可证。
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.inspection import PartialDependenceDisplay
from sklearn.neural_network import MLPRegressor
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeRegressor
首先,在糖尿病数据集上训练一个决策树和一个多层感知器(MLP)模型。
diabetes = load_diabetes()
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
y = diabetes.target
tree = DecisionTreeRegressor()
mlp = make_pipeline(StandardScaler(), MLPRegressor(hidden_layer_sizes=(100, 100), tol=1e-2, max_iter=500, random_state=0))
tree.fit(X, y)
mlp.fit(X, y)
为决策树绘制“年龄”和“体重指数(BMI)”这两个特征的部分依赖曲线。使用from_estimator
方法时,预期会绘制两条曲线。
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_title("Decision Tree")
tree_disp = PartialDependenceDisplay.from_estimator(tree, X, ["age", "bmi"], ax=ax)
对于多层感知器,也可以绘制部分依赖曲线。在这种情况下,传递line_kw
参数给from_estimator
方法,以改变曲线的颜色。
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_title("Multi-layer Perceptron")
mlp_disp = PartialDependenceDisplay.from_estimator(mlp, X, ["age", "bmi"], ax=ax, line_kw={"color": "red"})
tree_disp
和mlp_disp
对象包含了重新创建部分依赖曲线所需的所有计算信息。这意味着可以轻松地创建额外的图表,而无需重新计算曲线。
一种绘制曲线的方法是将它们放置在同一个图表中,每个模型的曲线在每一行。首先,创建一个包含两行一列的图表。然后将这两个轴传递给tree_disp
和mlp_disp
的plot
函数。给定的轴将被绘图函数用来绘制部分依赖图。结果图表将决策树的部分依赖曲线放置在第一行,多层感知器的部分依赖曲线放置在第二行。
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
tree_disp.plot(ax=ax1)
ax1.set_title("Decision Tree")
mlp_disp.plot(ax=ax2, line_kw={"color": "red"})
ax2.set_title("Multi-layer Perceptron")
另一种比较曲线的方法是将它们叠加在一起绘制。在这里,创建一个一行两列的图表。轴作为列表传递到plot
函数中,这将在同一个轴上绘制每个模型的部分依赖曲线。轴列表的长度必须等于绘制的图表数量。
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 6))
tree_disp.plot(ax=[ax1, ax2], line_kw={"label": "Decision Tree"})
mlp_disp.plot(ax=[ax1, ax2], line_kw={"label": "Multi-layer Perceptron", "color": "red"})
ax1.legend()
ax2.legend()
在这里,在同一轴上绘制单个特征“年龄”的部分依赖曲线。在这种情况下,tree_disp.axes_
传递到第二个plot
函数中。
tree_disp = PartialDependenceDisplay.from_estimator(tree, X, ["age"])
mlp_disp = PartialDependenceDisplay.from_estimator(mlp, X, ["age"], ax=tree_disp.axes_, line_kw={"color": "red"})