使用局部依赖进行高级绘图

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你完成绘制多个特征的局部依赖曲线的过程。局部依赖曲线用于在保持所有其他特征不变的情况下,分析一个特征对机器学习模型预测结果的影响。本教程将演示如何在糖尿病数据集上为决策树和多层感知器绘制局部依赖曲线。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49238{{"使用局部依赖进行高级绘图"}} end

在糖尿病数据集上训练模型

在这一步中,我们将在糖尿病数据集上训练一个决策树和一个多层感知器。

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)的局部依赖曲线。对于两个特征,PartialDependenceDisplay.from_estimator 期望绘制两条曲线。这里的绘图函数使用 ax 定义的空间放置一个包含两个子图的网格。

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 传递给 PartialDependenceDisplay.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"}
)

一起绘制两个模型的局部依赖关系

在这一步中,我们将在同一张图上绘制两个模型的局部依赖曲线。

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
tree_disp.plot(ax=ax1)
ax1.set_title("决策树")
mlp_disp.plot(ax=ax2, line_kw={"color": "red"})
ax2.set_title("多层感知器")

另一种比较曲线的方法是将它们绘制在彼此之上。在这里,我们创建一个一行两列的图形。轴作为列表传递给 PartialDependenceDisplay.plot 函数,该函数将在同一轴上绘制每个模型的局部依赖曲线。轴列表的长度必须等于绘制的图的数量。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 6))
tree_disp.plot(ax=[ax1, ax2], line_kw={"label": "决策树"})
mlp_disp.plot(
    ax=[ax1, ax2], line_kw={"label": "多层感知器", "color": "red"}
)
ax1.legend()
ax2.legend()

tree_disp.axes_ 是一个 numpy 数组,包含用于绘制局部依赖图的轴。这可以传递给 mlp_disp,以产生将图绘制在彼此之上的相同效果。此外,mlp_disp.figure_ 存储图形,这允许在调用 plot 后调整图形大小。在这种情况下,tree_disp.axes_ 有两个维度,因此 plot 只会在最左边的图上显示 y 标签和 y 刻度。

tree_disp.plot(line_kw={"label": "决策树"})
mlp_disp.plot(
    line_kw={"label": "多层感知器", "color": "red"}, ax=tree_disp.axes_
)
tree_disp.figure_.set_size_inches(10, 6)
tree_disp.axes_[0, 0].legend()
tree_disp.axes_[0, 1].legend()
plt.show()

绘制单个特征的局部依赖关系

在这一步中,我们将在同一坐标轴上绘制单个特征“年龄”的局部依赖曲线。在这种情况下,tree_disp.axes_ 被传递给第二个绘图函数。

tree_disp = PartialDependenceDisplay.from_estimator(tree, X, ["age"])
mlp_disp = PartialDependenceDisplay.from_estimator(
    mlp, X, ["age"], ax=tree_disp.axes_, line_kw={"color": "red"}
)

总结

本教程展示了如何使用 PartialDependenceDisplay 对象绘制多个特征的局部依赖曲线。首先,我们在糖尿病数据集上训练了一个决策树和一个多层感知器。然后,我们绘制了决策树和多层感知器针对两个特征的局部依赖曲线。接下来,我们在同一张图上绘制了两个模型的局部依赖曲线。最后,我们在同一坐标轴上绘制了单个特征的局部依赖曲线。