用Python实现9大回归算法详解——09. 决策树回归算法

news2024/12/27 2:14:21
1. 决策树回归的基本概念

决策树回归(Decision Tree Regression)是一种树状结构的回归模型,通过对数据集进行递归分割,将数据分成更小的子集,并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈值来最大化每次分裂后的目标函数增益,从而找到使误差最小化的模型。

2. 决策树回归的算法流程

(1)节点分裂

节点分裂的目标是最小化每个子节点中的均方误差(MSE),具体公式如下:

  • 从当前数据集中选择一个特征及其阈值,将数据集分割为两个子集。
  • 选择一个使得分裂后的两部分数据能够最大化目标函数增益的特征和阈值。

\text{MSE} = \frac{1}{N} \sum_{i=1}^{N} \left( y_i - \hat{y}_i \right)^2

其中:

  • y_i 是第 i 个样本的真实值。
  • \hat{y}_i 是第 i 个样本的预测值(子节点中的均值)。
  • N 是子节点中的样本数。

(2)树的构建

  • 递归地对每个子节点进行分裂,直到达到某个停止条件(如最大深度、最小样本数等)。
  • 每个叶节点的预测值为该节点中所有样本目标值的平均值。

叶节点的预测值公式:

\hat{y}_{\text{leaf}} = \frac{1}{N_{\text{leaf}}} \sum_{i=1}^{N_{\text{leaf}}} y_i

其中:

  • N_{\text{leaf}}​ 是叶节点中的样本数。
  • y_i 是叶节点中第 i 个样本的真实值。

(3)树的剪枝(可选):

  • 为了避免过拟合,可以使用剪枝技术,对已经生成的决策树进行剪枝,去掉那些对最终预测贡献较小的节点。
3. 决策树回归的数学表达

(1)均方误差(MSE)

\text{MSE} = \frac{1}{N} \sum_{i=1}^{N} \left( y_i - \hat{y}_i \right)^2

(2)叶节点的预测值

\hat{y}_{\text{leaf}} = \frac{1}{N_{\text{leaf}}} \sum_{i=1}^{N_{\text{leaf}}} y_i

(3)分裂节点的选择

对于特征j 和阈值 t,选择能够最小化分裂后的两个子节点的总 MSE 的分裂方式:

\text{Split} = \arg\min_{j, t} \left[ \frac{N_{\text{left}}}{N} \text{MSE}_{\text{left}} + \frac{N_{\text{right}}}{N} \text{MSE}_{\text{right}} \right]

其中:

  • \text{MSE}_{\text{left}} 和 \text{MSE}_{\text{right}}​ 分别是左子节点和右子节点的均方误差。
4. 决策树回归的优缺点

优点

  1. 易于理解和解释:决策树结构直观易懂,能够很容易地解释模型的决策过程。
  2. 处理非线性数据:决策树可以处理非线性数据,而不需要对数据进行特殊的处理。
  3. 无需特征缩放:决策树对数据的尺度不敏感,无需进行特征缩放。

缺点

  1. 容易过拟合:决策树容易生成复杂的模型,对训练数据拟合过度,从而降低对新数据的泛化能力。
  2. 不稳定性:小的扰动可能导致完全不同的树结构,因为树的分裂方式可能会对训练数据中的小变化产生较大影响。

5. 决策树回归案例

我们将通过一个具体的案例来展示如何使用决策树回归进行预测,并对结果进行详细分析。

5.1 数据加载与预处理

我们使用加利福尼亚州房价数据集(California Housing Dataset)进行回归预测。

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 加载加利福尼亚州房价数据集
housing = fetch_california_housing()
X, y = housing.data, housing.target

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

解释

  • 数据加载:我们选择加利福尼亚州房价数据集,该数据集包含加利福尼亚州的房屋特征数据,用于预测房屋的价格中位数。
  • 数据划分:将数据集划分为训练集和测试集,80% 的数据用于训练,20% 的数据用于测试。
5.2 模型训练与预测

我们使用 DecisionTreeRegressor 进行模型训练,并对测试集进行预测。

# 定义决策树回归模型
dtr = DecisionTreeRegressor(max_depth=5, random_state=42)

# 训练模型
dtr.fit(X_train, y_train)

# 对测试集进行预测
y_pred = dtr.predict(X_test)

解释

  • 模型定义DecisionTreeRegressor 是决策树回归的实现。我们设置 max_depth=5 来限制树的最大深度,以防止过拟合。
  • 模型训练:使用训练集数据进行模型训练,构建决策树模型。
  • 模型预测:训练完成后,使用模型对测试集进行预测,得到预测值。
5.3 模型评估与结果分析

我们使用均方误差(MSE)和决定系数(R^2)来评估模型的性能。

# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

 输出:

均方误差 (MSE): 0.5245146178314735
决定系数 (R²): 0.5997321244428706

解释

  • 均方误差 (MSE):模型的预测误差为 0.524,表明模型对测试集的预测有一定误差。
  • 决定系数 (R²):模型的 R^2 值为 0.599,说明模型能够解释 59.9% 的目标变量方差,模型拟合效果尚可。
5.4 决策树可视化

我们可以通过可视化决策树的结构,来更好地理解模型的决策过程。

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

plt.figure(figsize=(20,10))
plot_tree(dtr, filled=True, feature_names=housing.feature_names, rounded=True)
plt.show()

输出: 

可视化解释

  • 树结构:每个节点显示了用于分裂的数据特征、阈值、节点中的样本数量以及预测的目标值。
  • 颜色深浅:颜色表示了节点中目标值的均值,颜色越深表示预测值越高。
5.5 结果可视化

我们还可以通过绘制预测值与实际值的散点图,来进一步验证模型的表现。

# 绘制预测值与实际值的散点图
plt.scatter(y_test, y_pred, color="blue", alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel("Actual")
plt.ylabel("Predicted")
plt.title("Decision Tree Regression: Actual vs Predicted")
plt.show()

输出:

 

可视化解释

  • 散点图:横轴表示测试集的实际房价,纵轴表示模型预测的房价。每个点代表一个测试样本的预测结果。
  • 红色虚线:表示理想情况下,预测值应与实际值完全一致的参考线(即 y = x 的线)。
  • 分析:如果大多数散点分布在红色虚线附近,说明模型的预测效果较好。散点分布越集中,表示模型的预测准确性越高。反之,如果散点分布较为分散,特别是在远离红色虚线的区域,说明模型的预测误差较大。
5.6 参数调优

为了进一步提升模型性能,我们可以通过网格搜索(Grid Search)来调优决策树的超参数,如最大深度(max_depth)、最小分裂样本数(min_samples_split)等。

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'max_depth': [3, 5, 7, 10],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]
}

# 实例化决策树回归模型
dtr = DecisionTreeRegressor(random_state=42)

# 进行网格搜索
grid_search = GridSearchCV(estimator=dtr, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("最佳参数:", grid_search.best_params_)

解释

  • 参数选择:通过网格搜索,我们定义了多个超参数的组合,如 max_depthmin_samples_splitmin_samples_leaf,用于寻找最优的参数设置。
  • 交叉验证:使用 5 折交叉验证(cv=5)来评估每个参数组合的表现,从而选择最优的参数。
  • 输出最佳参数:模型训练完成后,输出最佳的参数组合,这些参数可以用于构建性能更优的模型。

6. 总结

决策树回归是一种简单且强大的回归模型,能够有效处理线性和非线性数据。它通过递归地分割数据集,找到使得均方误差最小化的分裂方式,最终生成一个树状的回归模型。尽管决策树回归易于理解和解释,但它也容易过拟合,尤其是在树的深度较大的情况下。因此,在应用时,通常需要通过剪枝或调优超参数来控制模型的复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos7.9系统安装cloudpods并使用ceph存储(二)

1.ceph安装 1.1 环境准备 配置hosts: $ vim /etc/hosts 10.121.x.x node01设置ssh无密码登录: # ssh-keygen -t rsa # ssh-copy-id -i /root/.ssh/id_rsa node01关闭selinux、firewalld # setenforce 0 # sed -i "s#SELINUXenforcing#SELINUXd…

国自然研究热点、“C位出圈”的类器官研究离不开细胞因子

前 言: 目前,类器官已从基础研究发展至药物开发和精准治疗。在疾病建模、药物开发、肿瘤研究、再生医学、精准医学等领域发展迅速。类器官与体内器官在功能和结构上的高度相似,使其广泛用于发育生物学和疾病建模。传统的2D细胞模型和模式动物…

k8s之Pod对象多种调度方式

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Redis数据库一文入门

Redis 是一个用于存储和管理数据的开源内存数据结构存储系统。它以其高性能和丰富的数据结构支持而闻名,是构建高效、可扩展应用程序的理想选择。本文将带你入门 Redis,并探讨其基本概念、安装步骤和一些常见的使用场景。 什么是 Redis? Re…

疯感工牌的风还是吹到了L4级无人驾驶

俗话说得好,打工人哪有不疯的? 最近你是不是也被“发疯工牌梗”刷屏了 一张张看似情绪稳定的工牌 以独特的方式展现了属于打工人自己的个性 这不,疯感工牌的风也吹到了无人驾驶 无人车也有了属于自己的时尚单品 看看它们都是如何介绍自己的&a…

Wot Design Uni:一个高颜值、轻量化的uni-app组件库,uni-app生态的新宠

一、介绍 wot-design-uni组件库基于vue3Typescript构建,参照wot design的设计规范进行开发,提供70高质量组件,支持暗黑模式、国际化和自定义主题,旨在给开发者提供统一的UI交互,同时提高研发的开发效率。 特性&#x…

新的网络钓鱼方法针对 Android 和 iPhone 用户

关注公众号网络研究观获取更多内容。 ESET 研究人员发现了一种针对 Android 和 iPhone 用户的不常见网络钓鱼活动。 他们分析了一起针对捷克某知名银行客户的网络钓鱼案例。 网络钓鱼流程 这种技术值得注意,因为它会从第三方网站安装钓鱼应用程序,而无…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件,不仅擅长构建交互式界面,更在数据可视化方面展现出了非凡的创意与实用性。今天,就让我们一起探索Axure设计的几款精美数据可视化大屏模板,感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

【大模型理论篇】基于3D可视化视角理解GPT

1. 背景介绍 先前我们通过多篇技术文章来分析大模型的原理,包括: 《Transformer原理及关键模块深入浅出》《GPT系列预训练模型原理讲解》、《大模型时代下Bert去哪啦》、《关于LLaMA 3.1 405B以及小模型的崛起》、《LLaMA3结构关键模块分析》、《强化学习…

JS基础进阶2-操作元素

目录 1.操作元素-修改DOM(文档对象模型)元素 1. 修改元素的文本内容 2. 修改元素的样式 3. 修改元素的属性 4. 修改元素的类名 5.修改body元素 2.修改自定义属性 2.1H5中设置自定义属性、 2.2使用JavaScript修改自定义属性 3.节点操作 3.1节点概…

不懂就问,换毛季猫咪疯狂掉毛怎么办?宠物浮毛该如何清理?

最近天气变热了,每天都30度以上,我家猫狂掉毛,床上、地板上堆积了不少。第一次养猫的我没见过这种阵仗,以为它生病了,连忙带它去看医生。医生告诉我,这是正常的猫咪换毛现象,我才放下心来。原来…

Python代码加密打包发布

本博客主要介绍: 1. 将python代码编译为so(win环境是pyd) 2.打包生成wheel文件,可以使用pip 进行安装 1. 项目结构 注意,__init__.py文件是必须的,内容可为空 2. example.py 里面是自己写的一些方法&am…

【hot100篇-python刷题记录】【滑动窗口最大值】

R6-子串篇 目录 Max Sort 单调队列法&#xff1a; Max 完了&#xff0c;我好像想到python的max class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:ret[]left,right0,kwhile right<len(nums):ret.append(max(nums[left:right]))ri…

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

在 PHP 的编程实践中多进程通常都是在 cli 脚本的模式下使用&#xff0c;我依稀还记得在多年以前为了实现从数据库导出千万级别的数据&#xff0c;第一次在 PHP 脚本中采用了多进程编程。在此之前我从未接触过多进程&#xff0c;只知道 PHP-FPM 进程管理器是多进程模型&#xf…

【技术方案】智慧城市大数据平台技术方案(Doc原件)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…

获发明专利加持,隆道加速推进企业级AI应用落地

近期&#xff0c;北京隆道网络科技有限公司研发的“基于供应链管理的AI采购业务分析装置及方法”获得国家发明专利授权。该项新专利的取得&#xff0c;证明了隆道在AI产业化应用中的技术前瞻性和创新性&#xff0c;也为隆道加速企业级AI应用落地提供了知识产权保障。 根据IBM发…

HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)

源码介绍 一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢&#xff0c;今天这篇博客就分享下前端代码如何实现HTMLCSSJavaScript制作七夕表白网页(含音乐自定义文字)。赶紧学会了&#xff0c;来制作属于我们程序员的浪…

【OpenCV】基础知识

目录 0 前言1 什么是OpenCV&#xff1f;1.1 OpenCV1.2 OpenCV-Python 2 在线英文文档3 新建项目4 图像读取4.1 读入图像4.2 显示图像4.3 保存图像4.4 Demo4.4.1 Demo14.4.2 Demo24.4.3 Demo3 5 ROI区域 0 前言 使用软件&#xff1a;Anaconda Pycharm VScode OpenCV环境&#…

vulmap No module named ‘thirdparty.urllib3.packages.six.moves‘

问题 今天安装vulmap是发现无论如何安装不了&#xff0c;pip那边明明已经安装好了 后来发现vulmap脚本也有这个东西&#xff0c;后面想了下 最后分析却发现不是pip那边&#xff0c;是vulmap的脚本的’thirdparty.urllib3.packages.six.moves’模块与我这边的pip有些模块冲突了…

“MongoDB AI应用计划 (MAAP)”正式全面推出

助企业弥合AI应用缺口&#xff0c;抢占创新发展制高点 在MongoDB&#xff0c;无论应用场景如何&#xff0c;出发点都是帮助客户解决应用和数据的问题。基于客户沟通与反馈&#xff0c;大多数企业和机构对生成式AI很感兴趣&#xff0c;但不确定如何将概念转化为生产力&#xff…