一提到回归,可能很多人第一时间脑海里想到的就是线性回归模型,的确,线性回归器可以说是非常常用的模型了。线性回归模型广泛应用于各种领域,如经济学、金融学、社会科学、工程学等。它可以用于预测、因果分析、趋势分析等。线性回归模型是一种广泛应用于统计学和机器学习中的预测模型,它用于描述一个或多个自变量(特征)与因变量(目标变量)之间的线性关系。线性回归模型的目标是找到一条直线(在简单线性回归中)或一个超平面(在多元线性回归中),使得该直线或超平面能够最好地拟合数据点,从而进行预测。
1. 简单线性回归
简单线性回归是线性回归的最基本形式,它只涉及一个自变量和一个因变量。其数学模型可以表示为:
y=β0+β1x+ϵy=β0+β1x+ϵ
其中:
-
yy 是因变量(目标变量)。
-
xx 是自变量(特征)。
-
β0β0 是截距(intercept),表示当 x=0x=0 时 yy 的值。
-
β1β1 是斜率(slope),表示 xx 每增加一个单位, yy 的变化量。
-
ϵϵ 是误差项,表示模型无法解释的随机误差。
简单线性回归的目标是通过最小化误差项的平方和(即最小二乘法)来估计 β0β0 和 β1β1。
2. 多元线性回归
多元线性回归是简单线性回归的扩展,它涉及多个自变量。其数学模型可以表示为:
y=β0+β1x1+β2x2+⋯+βpxp+ϵy=β0+β1x1+β2x2+⋯+βpxp+ϵ
其中:
-
yy 是因变量(目标变量)。
-
x1,x2,…,xpx1,x2,…,xp 是 pp 个自变量(特征)。
-
β0β0 是截距(intercept)。
-
β1,β2,…,βpβ1,β2,…,βp 是各自变量的系数,表示各自变量对因变量的影响。
-
ϵϵ 是误差项。
多元线性回归的目标同样是通过最小化误差项的平方和来估计 β0,β1,β2,…,βpβ0,β1,β2,…,βp。
3. 模型假设
线性回归模型基于以下几个关键假设:
-
线性关系:自变量和因变量之间存在线性关系。
-
独立性:误差项之间相互独立。
-
同方差性:误差项的方差在所有自变量取值处是恒定的(即方差齐性)。
-
正态性:误差项服从正态分布。
4. 模型评估
线性回归模型的性能通常通过以下几个指标进行评估:
-
R²(决定系数):表示模型解释的方差占总方差的比例,取值范围为0到1,越接近1表示模型拟合效果越好。
-
均方误差(MSE):表示预测值与实际值之间差异的平方的平均值,越小表示模型拟合效果越好。
-
均方根误差(RMSE):MSE的平方根,与因变量的单位相同,便于解释。
-
调整R²:在多元线性回归中,考虑到自变量数量的增加,调整R²对模型的复杂度进行了惩罚。
这里结合最近实际开发项目的需要,我们想要抛开传统经典的线性回归器,基于树模型来开发构建回归模型,决策树(Decision Tree)是一种常用的机器学习模型,特别适用于分类和回归任务。它通过树状结构来表示决策规则,从根节点到叶节点的每一条路径都对应一个决策序列。决策树模型易于理解和解释,能够处理数值型和类别型数据,并且在特征选择和模型解释方面具有优势。
1. 决策树的结构
决策树由以下几种类型的节点组成:
-
根节点:树的起点,包含所有数据样本。
-
内部节点:表示一个特征或属性,每个内部节点都有一个分裂规则,用于将数据分成不同的子集。
-
叶节点:表示最终的决策或预测结果。
-
分支:连接节点之间的路径,表示决策规则。
2. 决策树的构建过程
构建决策树的过程通常包括以下几个步骤:
2.1 选择最佳分裂特征
在每个内部节点,选择一个特征进行分裂,使得分裂后的子节点尽可能“纯”(即子节点中的样本尽可能属于同一类别或具有相似的数值)。常用的分裂准则包括:
-
信息增益(Information Gain):用于分类问题,基于信息熵的减少量。
-
基尼不纯度(Gini Impurity):用于分类问题,衡量一个数据集的混乱程度。
-
均方误差(MSE):用于回归问题,衡量预测值与实际值之间的差异。
2.2 递归分裂
选择最佳分裂特征后,将数据集分成多个子集,并在每个子集上递归地重复上述过程,直到满足停止条件。常见的停止条件包括:
-
达到预设的最大深度。
-
节点中的样本数小于预设的最小样本数。
-
节点中的样本属于同一类别(对于分类问题)或具有相似的数值(对于回归问题)。
2.3 剪枝
为了避免过拟合,决策树通常需要进行剪枝(Pruning)。剪枝可以通过以下两种方式进行:
-
预剪枝:在树的构建过程中,提前停止分裂。
-
后剪枝:在树构建完成后,移除一些子树,以减少模型的复杂度。
3. 决策树的优缺点
3.1 优点
-
易于理解和解释:决策树的结构直观,易于解释和可视化。
-
能够处理数值型和类别型数据:决策树可以处理不同类型的特征。
-
不需要特征缩放:决策树不受特征缩放的影响。
-
能够处理缺失值:决策树可以处理特征中的缺失值。
3.2 缺点
-
容易过拟合:决策树容易生成过于复杂的模型,导致过拟合。
-
不稳定:数据的小变化可能导致生成完全不同的树。
-
偏向于多值特征:决策树倾向于选择具有更多值的特征进行分裂。
借助于sklearn我们可以非常快地落地实现,实例实现如下所示:
import os
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
# 加载数据集
df = pd.read_csv("data.csv").select_dtypes(include=["int64", "float64"])
df.dropna(axis=1, inplace=True)
# 分离特征数据和标签
X = df.drop("label", axis=1)
y = df["label"]
# 随机划分数据集
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)
# 树状结构绘制
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()
结果如下所示:
树中的每个节点都包含一个特征和一个阈值。指向左侧的箭头表示满足条件的数据点(例如,总体质量<=7.5),而指向右侧的箭头表示不满足条件的数据点(例如,总体质量>7.5)。
后续分割进一步分割数据以细化预测,每次分割的目的是减少MSE。可视化中的分支按颜色从白色到较深的阴影进行编码,以指示每个节点处的预测值。较浅的颜色表示较低的预测值,而较深的阴影表示较高的预测值。这种颜色梯度有助于在视觉上区分整个树的预测分布。
上面我们使用matplotlib和内置的sklearn.Tree.plot_tree方法实现了树状层级结构的可视化
。
接下来我们想要进一步基于专有的可视化模块dtreeviz来实现更加细腻的可视化展示。
dtreeviz
是一个用于可视化决策树模型的 Python 库,它能够帮助用户更直观地理解决策树的结构和决策过程。通过 dtreeviz
,用户可以生成各种类型的图表,包括树状图、特征重要性图、单个样本的决策路径图等。这些图表有助于解释模型的决策逻辑,提高模型的可解释性。
1. 安装
dtreeviz
可以通过 pip 安装:
pip install dtreeviz
2. 主要功能
dtreeviz
提供了多种可视化功能,以下是一些主要的功能:
2.1 决策树可视化
dtreeviz
可以生成决策树的树状图,展示树的结构和每个节点的分裂规则。这对于理解模型的决策过程非常有帮助。
from dtreeviz.trees import dtreeviz
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 训练决策树模型
clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X, y)
# 可视化决策树
viz = dtreeviz(clf,
X_train=X,
y_train=y,
target_name='species',
feature_names=iris.feature_names,
class_names=list(iris.target_names))
viz.view()
2.2 特征重要性可视化
dtreeviz
可以生成特征重要性图,展示每个特征对模型决策的贡献程度。
from dtreeviz.trees import tree_feature_importance
# 可视化特征重要性
tree_feature_importance(clf, iris.feature_names)
2.3 单个样本的决策路径可视化
dtreeviz
可以生成单个样本的决策路径图,展示该样本在决策树中的具体路径和每个节点的决策规则。
from dtreeviz.trees import dtreeviz
# 选择一个样本
sample = X[0]
# 可视化单个样本的决策路径
viz = dtreeviz(clf,
X_train=X,
y_train=y,
target_name='species',
feature_names=iris.feature_names,
class_names=list(iris.target_names),
X=sample)
viz.view()
2.4 回归树可视化
dtreeviz
也支持回归树的可视化,展示回归树的结构和每个节点的预测值。
from sklearn.datasets import load_boston
from sklearn.tree import DecisionTreeRegressor
# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target
# 训练回归树模型
reg = DecisionTreeRegressor(max_depth=3)
reg.fit(X, y)
# 可视化回归树
viz = dtreeviz(reg,
X_train=X,
y_train=y,
target_name='price',
feature_names=boston.feature_names)
viz.view()
3. 自定义可视化
dtreeviz
提供了丰富的参数选项,用户可以根据需要自定义可视化的样式和内容。例如,可以调整树的深度、节点的大小、颜色等。
viz = dtreeviz(clf,
X_train=X,
y_train=y,
target_name='species',
feature_names=iris.feature_names,
class_names=list(iris.target_names),
scale=1.5, # 调整树的大小
colors={'classes': ['#FF0000', '#00FF00', '#0000FF']}) # 自定义颜色
viz.view()
dtreeviz
是一个强大的工具,能够帮助用户直观地理解决策树模型的结构和决策过程。通过生成各种类型的图表,dtreeviz
提高了模型的可解释性,使得用户能够更好地理解和解释模型的决策逻辑。无论是分类树还是回归树,dtreeviz
都提供了丰富的可视化功能,并且支持自定义选项,满足不同用户的需求。
基于此我们可以使用dtreeviz模块来实现上述模型的可视化,实例实现如下:
# 随机划分数据集
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="label",
feature_names=X_train.columns.tolist(),
)
# 可视化
v = viz.view()
v.show()
可视化结果如下:
每个节点的散点图有助于我们了解每个分割的特征分布和影响,这对于理解复杂分割和不同特征的重要性特别有用。树在与我们第一次看到的相同的规则和决策边界上分裂,得到相同的结论。然而,dtreeviz使得随着树的加深,可以更容易地可视化同质或聚集的数据,从而更清楚地了解数据点如何基于拆分进行分组。
树回归模型(如决策树回归、随机森林回归、梯度提升树回归等)相较于线性回归模型具有一些显著的优势,这些优势使得树回归模型在某些情况下更为适用:
1. 处理非线性关系
线性回归模型假设自变量和因变量之间存在线性关系,而树回归模型能够自然地处理非线性关系。树回归模型通过递归地将数据分割成不同的子集,并在每个子集上进行预测,从而捕捉到复杂的非线性模式。
2. 处理多维特征
树回归模型能够处理多维特征,并且不需要对特征进行预处理(如标准化或归一化)。线性回归模型在处理多维特征时,通常需要对特征进行缩放,以避免某些特征对模型的影响过大。
3. 特征选择
树回归模型在构建过程中会自动进行特征选择,选择对目标变量影响最大的特征进行分裂。这使得树回归模型在处理高维数据时具有优势,能够识别出重要的特征,减少模型的复杂度。
4. 处理缺失值
树回归模型能够自然地处理特征中的缺失值,不需要对缺失值进行填充或删除。线性回归模型通常需要对缺失值进行处理,否则会影响模型的性能。
5. 模型的可解释性
虽然树回归模型的可解释性不如线性回归模型直观,但通过可视化树结构,用户仍然可以理解模型的决策过程。树回归模型的决策路径清晰,易于解释,特别是在单个样本的决策路径可视化方面。
6. 鲁棒性
树回归模型对异常值和噪声具有一定的鲁棒性。树回归模型通过递归分割数据,能够减少异常值对模型的影响。线性回归模型对异常值较为敏感,异常值可能会显著影响模型的参数估计。
7. 集成方法
树回归模型可以通过集成方法(如随机森林、梯度提升树)进一步提高模型的性能和稳定性。集成方法通过组合多个树模型,能够减少模型的方差,提高泛化能力。线性回归模型通常不具备这种集成能力。
8. 处理类别型特征
树回归模型能够直接处理类别型特征,不需要对类别型特征进行编码(如独热编码)。线性回归模型通常需要对类别型特征进行编码,否则无法处理。
9. 模型复杂度控制
树回归模型可以通过设置树的深度、最小样本分割数等参数来控制模型的复杂度,避免过拟合。线性回归模型通常需要通过正则化方法(如L1、L2正则化)来控制模型的复杂度。
10. 并行化
树回归模型在训练过程中可以进行并行化处理,特别是在随机森林等集成方法中,能够显著提高训练速度。线性回归模型的训练过程通常难以并行化。
树回归模型相较于线性回归模型在处理非线性关系、多维特征、缺失值、类别型特征等方面具有显著优势。此外,树回归模型通过集成方法能够进一步提高模型的性能和稳定性。然而,树回归模型的可解释性通常不如线性回归模型直观,且在某些情况下可能更容易过拟合。所以在实际项目开发过程中,到底那种模型真正适合自己的数据场景,需要自己探索分析,结合一些先验的经验我们可以少走一些弯路达到提高效率的目的,本文也是从实验性质的角度出发,探索树状模型构建回归模型的可行性,感兴趣的话也都可以基于自己的数据实例进行尝试。
标签:dtreeviz,模型,树状,可视化,线性,回归,决策树 From: https://blog.csdn.net/Together_CZ/article/details/142492646