【精选优质专栏推荐】


每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

在这里插入图片描述

前言

从简单的线性回归到带惩罚项的技术(如 Lasso 和 Ridge),每种方法都为基于线性关系预测连续结果提供了宝贵的见解。在我们开始探索基于树的模型时,需要重申一点:我们的重点仍然是回归问题。虽然基于树的模型具有多功能性,但它们在处理、评估和优化结果方面,在分类任务和回归任务之间存在显著差异。

基于树的回归模型是机器学习中强大的工具,能够处理非线性关系和复杂的数据结构。在本文中,我们将介绍一系列基于树的模型,并重点分析它们的优缺点。随后,我们将通过一个实际示例,演示如何使用 sklearn 和 matplotlib 实现并可视化决策树。最后,我们将使用 dtreeviz 对可视化进行增强,该工具可以提供更为详细的洞察。

基于树的回归模型概览

基于树的模型具有不同的复杂度,每种模型都有其独特的功能,并适用于不同的场景。

为了更好地理解基于树的回归模型的范围,我们来看下图,它总结了几种流行的模型:

在这里插入图片描述

从最简单的决策树(CART)开始,我们可以看到它构建了一棵单独的树来捕捉数据的分裂。虽然方法直观,但容易出现过拟合现象,同时也为更复杂的模型奠定了基础。随着方法的发展,我们进入集成方法,如随机森林(Random Forest)和梯度提升机(Gradient Boosting Machines, GBM),甚至更高级的算法如 XGBoost、LightGBM 和 CatBoost,这些方法提供了越来越复杂的方式来处理数据、减少过拟合并提升预测精度。

线性模型假设特征与结果之间存在直接的线性关系,而基于树的模型则打破了这一假设,能够轻松捕捉非线性交互关系。这种非线性使基于树的模型能够发现数据中的复杂模式,在变量关系很少纯线性的实际应用中表现尤为强大。它们对异常值具有鲁棒性,并且对不同类型的数据具有灵活性,不要求特征进行严格的缩放。

然而,这种灵活性也带来了挑战,尤其是在模型复杂度增加时,容易出现过拟合和计算开销较大的问题。

使用 sklearn 和 matplotlib 可视化决策树

在上一节中,我们探讨了基于树的回归模型及其不同的复杂度。现在,我们将深入了解其中最简单但基础的模型之一——决策树。我们将使用 Ames 房价数据集来理解决策树在实践中的工作原理。

以下代码展示了如何导入必要的库、提取无缺失值的数值数据(为简化处理)、训练决策树模型,并使用 Matplotlib 结合 sklearn 内置的 plot_tree 函数可视化生成的树结构:

# 导入必要的库
import pandas as pd
from sklearn import tree
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split

# 加载所有无缺失值的数值特征
Ames = pd.read_csv('Ames.csv').select_dtypes(include=['int64', 'float64'])
Ames.dropna(axis=1, inplace=True)
X = Ames.drop('SalePrice', axis=1)
y = Ames['SalePrice']

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化并训练决策树
tree_model = DecisionTreeRegressor(max_depth=3)
tree_model.fit(X_train, y_train)

# 使用 sklearn 可视化决策树
plt.figure(figsize=(20, 10))
tree.plot_tree(tree_model, feature_names=X.columns, filled=True,
               impurity=False, rounded=True, precision=2, fontsize=12)

plt.show()

我们将 max_depth=3,以限制树的复杂度。该参数限制了树的最大深度,确保树不会生长得过深。通过这样做,我们可以使树结构更简单、易于可视化,有助于理解模型的基本结构和决策过程,而不会在过多细节中迷失。

下面是我们生成的决策树可视化结果:

在这里插入图片描述

这棵树展示了模型如何根据不同特征对数据进行分裂,以预测房屋的销售价格。树中的每个节点代表基于某个特征值的决策点,而叶节点则表示最终预测值。

理解分裂:

树为何会这样分裂?
决策树算法在每个节点对数据进行分裂,以最小化目标变量(此处为销售价格)的均方误差(MSE)。MSE 衡量预测值与实际值差异的平方平均值。通过选择能够降低 MSE 的分裂点,树试图将数据划分为在目标变量上尽可能同质的组。

哪些特征被用于分裂?
本树中用于分裂的特征包括 “OverallQual”、 “GrLivArea”、 “1stFlrSF” 和 “2ndFlrSF”。这些特征是基于它们在分裂数据时降低 MSE 的能力被选出的。分裂的阈值(如 OverallQual <= 7.5)在训练过程中确定,以优化数据点划分,使组内数据尽量同质。

分裂和箭头的解读
每个节点显示特征及阈值。例如,根节点基于 “OverallQual” 是否小于等于 7.5 进行分裂。

  • 指向左侧的箭头表示满足条件的数据点(如 OverallQual <= 7.5),
  • 指向右侧的箭头表示不满足条件的数据点(如 OverallQual > 7.5)。

后续分裂进一步细化数据,以优化预测,每次分裂均旨在降低组内 MSE。

分支的颜色编码
可视化中的分支采用从白色到深色的渐变表示每个节点的预测值。浅色表示预测值较低,深色表示预测值较高。颜色渐变有助于直观区分树中不同分支的预测值,理解销售价格的分布情况。

叶节点与最终预测
叶节点表示目标变量的最终预测值。每个叶节点显示预测销售价格(如 value = 118152.80)及落入该叶节点的样本数量(如 samples = 605)。这些值是该组所有数据点销售价格的平均值。

决策树模型直观且易于解释,是理解更复杂基于树模型的良好起点。然而,如前所述,其主要缺点是容易过拟合,尤其是树较深时。过拟合指模型捕捉了训练数据中的噪声,导致在未见数据上泛化能力下降。

使用 dtreeviz 的增强可视化

在前一部分,我们使用 matplotlib 和 sklearn 内置的 plot_tree 可视化决策树,以理解模型的决策过程。虽然这种方法概览清晰,但有更高级的工具可以提供增强可视化。

本节将使用 dtreeviz,这是一个提供决策树详细可视化的库。

以下代码展示了如何导入库、准备数据、训练决策树并使用 dtreeviz 可视化:

# 导入必要的库
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
import dtreeviz

# 加载所有无缺失值的数值特征
Ames = pd.read_csv('Ames.csv').select_dtypes(include=['int64', 'float64'])
Ames.dropna(axis=1, inplace=True)
X = Ames.drop('SalePrice', axis=1)
y = Ames['SalePrice']

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化并训练决策树
tree_model = DecisionTreeRegressor(max_depth=3)
tree_model.fit(X_train.values, y_train)

# 使用 dtreeviz 可视化决策树
viz = dtreeviz.model(tree_model, X_train, y_train,
               target_name='SalePrice', feature_names=X_train.columns.tolist())

# 在 Jupyter Notebook 中可直接查看:
# viz.view()  # 渲染并显示 SVG 可视化

# 在 PyCharm 中渲染并显示 SVG 图像:
v = viz.view()     # 渲染为 SVG 内部对象
v.show()           # 弹出窗口显示

下图展示了使用 dtreeviz(同样设置 max_depth=3)得到的增强可视化效果:

在这里插入图片描述

该可视化提供了更多信息和决策树的详细视图。每个节点的散点图帮助我们理解每次分裂的特征分布及其影响,对于理解复杂分裂和各特征的重要性尤其有用。树的分裂规则和决策边界与前面的可视化相同,因此得出的结论一致。

然而,dtreeviz 在树更深时,使可视化同质或聚类数据更加容易,提供了更清晰的图像,展示数据点如何根据分裂进行分组。

总结

在本文中,我们介绍了基于树的回归模型,重点讲解了决策树。我们首先概述了各种基于树的模型,分析了它们的优缺点。随后,使用 sklearn 和 matplotlib 可视化了决策树,以理解其基本结构和决策过程。最后,我们利用 dtreeviz 对可视化进行了增强,提供了更深入的洞察和更具交互性的模型视图。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐