【漫话机器学习系列】033.决策树回归(Decision Tree Regression)

news2025/1/6 7:15:00

决策树回归(Decision Tree Regression)

决策树回归是一种基于树状结构进行回归分析的监督学习方法。它将输入空间递归地划分为多个区域,并在每个区域内拟合一个简单的常数值,从而对目标变量进行预测。


决策树回归的原理

  1. 树的构建

    • 决策树以树的形式对数据进行划分。
    • 每次划分选择一个特征及其阈值,将数据集分为两个子集。
    • 目标是找到最佳划分,使得子集内的目标变量尽可能一致(即减少误差)。
  2. 划分准则
    通常采用均方误差(MSE, Mean Squared Error)作为划分的评价指标:

                                        MSE = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y})^2

    其中,y_i 是真实值,\hat{y}​ 是预测值。

  3. 停止条件

    • 达到最大树深度。
    • 叶节点的样本数少于预设值。
    • 划分后误差改善不足。
  4. 预测
    对于新输入数据,沿着决策树从根节点到叶节点,根据划分规则找到其对应的叶节点,返回叶节点中目标变量的均值作为预测值。


构建过程

  1. 根节点的初始化
    将所有数据视为一个整体,计算均值作为预测值,计算当前数据集的均方误差。

  2. 递归划分

    • 遍历每个特征及其所有可能的划分点,计算划分后的均方误差。
    • 选择能最大程度减少误差的特征及阈值进行划分。
  3. 停止划分

    • 当树的深度达到预设值。
    • 当叶节点的样本数小于预设阈值。
    • 当划分后误差改善不足。

优点

  1. 可解释性强
    决策树的结构直观清晰,易于可视化和理解。

  2. 非线性建模能力
    决策树能有效捕获数据中的非线性关系。

  3. 无需特征缩放
    决策树对特征的数值范围不敏感,不需要标准化或归一化。


缺点

  1. 易过拟合
    决策树在深度较大时可能会过拟合,导致泛化能力差。

  2. 对数据分布敏感
    对于小的样本噪声或异常值,可能会导致不稳定的划分。

  3. 无法捕获连续目标变量的平滑关系
    决策树只能在区域内拟合常数值,难以捕获目标变量的连续变化。


改进方法

  1. 剪枝(Pruning)

    • 预剪枝:设置树的最大深度、叶节点的最小样本数等参数,限制树的规模。
    • 后剪枝:先构建一棵完整的树,然后通过去掉不重要的分支来减少过拟合。
  2. 集成学习

    • 随机森林:构建多棵决策树并取平均值。
    • 梯度提升树(GBDT):通过串联多个决策树逐步减小误差。
    • 极端随机树(Extra Trees):进一步随机化特征和划分点选择,降低过拟合风险。

评价指标

  • 均方误差(MSE)

    MSE = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2
  • 平均绝对误差(MAE, Mean Absolute Error)

    MAE = \frac{1}{n} \sum_{i=1}^n |y_i - \hat{y}_i|
  • 决定系数(R2R^2R2)
    衡量模型对目标变量的解释程度:

    R^2 = 1 - \frac{\sum_{i=1}^n (y_i - \hat{y}_i)^2}{\sum_{i=1}^n (y_i - \bar{y})^2}

    其中 \bar{y} 是目标变量的均值。


代码实现

以下是使用 Python 中的 Scikit-learn 实现决策树回归的代码示例:

from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np

# 生成模拟数据
np.random.seed(0)
X = np.sort(np.random.rand(100, 1), axis=0)
y = np.sin(2 * np.pi * X).ravel() + np.random.randn(100) * 0.1

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

# 构建决策树回归模型
model = DecisionTreeRegressor(max_depth=4)
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评价模型
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error: {mse:.3f}")
print(f"R^2 Score: {r2:.3f}")

# 可视化结果
import matplotlib.pyplot as plt
plt.scatter(X_test, y_test, color="blue", label="True Values")
plt.scatter(X_test, y_pred, color="red", label="Predicted Values")
plt.legend()
plt.title("Decision Tree Regression")
plt.xlabel("X")
plt.ylabel("y")
plt.show()

输出结果

Mean Squared Error: 0.038
R^2 Score: 0.939

 


应用场景

  1. 房地产价格预测
    根据特征(面积、位置、房龄等)预测房价。

  2. 市场营销分析
    根据用户行为数据预测用户对产品的需求。

  3. 时间序列分析
    使用历史数据预测未来值。


总结

决策树回归是简单易用的回归模型,特别适合处理非线性和非参数问题。然而,单独使用决策树可能会过拟合或欠拟合,因此需要通过剪枝或集成方法进一步提升模型的鲁棒性和泛化能力。

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

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

相关文章

Vue3中使用 Vue Flow 流程图方法

效果图: 最近项目开发时有一个流程图的功能,需要做流程节点的展示,就搜到了 Vue Flow 这个插件,这个插件总得来说还可以,简单已使用,下边就总结一下使用的方法: Vue Flow官网:https…

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具)

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具) 核心代码完整代码在线示例地球中展示视频可以通过替换纹理的方式实现,但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。 三维视频融合技术将视频资源与三维…

Appllo学习

补充学习: Apollo管理多环境下的配置和踩坑实践 - 简书 Apollo-阿波罗配置中心超详细教程_apllo-CSDN博客 springboot本地local配置覆盖远程Apollo配置(含Apollo配置加载顺序说明)_本地覆盖apollo配置-CSDN博客 Apollo 配置中心详细教程 - 简书 (包含…

React18路由和Vue3路由进行对比

本文将深入比较 React 18 和 Vue 3 路由的不同之处,帮助你更好地理解如何在这两个框架中进行路由管理。希望能对于从 Vue 3 迁移到 React 的开发者,理解这些差异,帮助你更高效地切换框架和构建应用。 1. 路由配置 React 18 的路由配置 Rea…

Windows系统下载、部署Node.js与npm环境的方法

本文介绍在Windows电脑中,下载、安装并配置Node.js环境与npm包管理工具的方法。 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,其允许开发者使用JavaScript编写命令行工具和服务器端脚本。而npm(Node Package Manager)则…

浏览器选中文字样式

效果 学习 Chrome: 支持 ::selection。Firefox: 支持 :-moz-selection 和 ::selection。Safari: 支持 ::selection。Internet Explorer: 支持 :-ms-selection。Microsoft Edge: 支持 ::-ms-selection 和 ::selection。 代码 <!DOCTYPE html> <html lang"en&qu…

指代消解:自然语言处理中的核心任务与技术进展

目录 前言1. 指代消解的基本概念与分类1.1 回指与共指 2. 指代消解的技术方法2.1 端到端指代消解2.2 高阶推理模型2.3 基于BERT的模型 3. 事件共指消解&#xff1a;跨文档的挑战与进展3.1 联合模型3.2 语义嵌入模型&#xff08;EPASE&#xff09; 4. 应用场景与前景展望4.1 关键…

CDPHudi实战-集成spark

[一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do scp /opt/software/hudi-1.0.0/packaging/hudi-spark-bundle/target/hudi-spark3.4-bundle_2.12-1.0.0.jar cdp73-$i:/opt/cloudera/parcels/CDH/lib/spark3/jars/; done hudi-spark3.4-bu…

leetcode:面试题 17.01. 不用加号的加法(python3解法)

难度&#xff1a;简单 设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2 提示&#xff1a; a, b 均可能是负数或 0结果不会溢出 32 位整数 题解&#xff1a; class Solution:def add(self, a: int, b: int) -> int:sum_list [a…

设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用&#xff0c;尤其是在需要集成…

二维码文件在线管理系统-收费版

需求背景 如果大家想要在网上管理自己的文件&#xff0c;而且需要生成二维码&#xff0c;下面推荐【草料二维码】&#xff0c;这个系统很好。特别适合那些制造业&#xff0c;实体业的使用手册&#xff0c;你可以生成一个二维码&#xff0c;贴在设备上&#xff0c;然后这个二维码…

MySQL8安装与卸载

1.下载mysql MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压mysql安装包 解压到自己定义的目录&#xff0c;这里解压就是安装&#xff0c;解压后的路径不要有空格和中文。 3.配置环境变量 配置环境变量可以方便电脑在任何的路径…

数据挖掘——关联规则挖掘

数据挖掘——关联数据挖掘 关联数据挖掘关联规则关联规则挖掘问题&#xff1a;具体挖掘过程Apriori 产生关联规则 关联数据挖掘 关联分析用于发现隐藏在大型数据集中的令人感兴趣的联系&#xff0c;所发现的模式通常用关联规则或频繁项集的形式表示。 关联规则反映一个事物与…

【74HC192减法24/20/72进制】2022-5-17

缘由用74ls192设计一个72进制的减法计数器&#xff0c;需要有逻辑电路图-硬件开发-CSDN问答

Samsung手机首次主要采用竞对Micron LPDDR5内存

根据韩国媒体《韩国先驱报》&#xff08;The Korea Herald&#xff09;的报道&#xff0c;即将在1月底发布的三星 Galaxy S25 系列智能手机将首次主要使用美光科技&#xff08;Micron Technology&#xff09;提供的移动DRAM&#xff0c;而非三星自家的产品。这一消息对于三星的…

Linux驱动开发学习准备(Linux内核源码添加到工程-Workspace)

Linux内核源码添加到VsCode工程 下载Linux-4.9.88源码&#xff1a; 没有处理同名文件的压缩包&#xff1a; https://pan.baidu.com/s/1yjIBXmxG9pwP0aOhW8VAVQ?pwde9cv 已把同名文件中以大写命名的文件加上_2后缀的压缩包&#xff1a; https://pan.baidu.com/s/1RIRRUllYFn2…

leetcode题目(3)

目录 1.加一 2.二进制求和 3.x的平方根 4.爬楼梯 5.颜色分类 6.二叉树的中序遍历 1.加一 https://leetcode.cn/problems/plus-one/ class Solution { public:vector<int> plusOne(vector<int>& digits) {int n digits.size();for(int i n -1;i>0;-…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…

接受Header使用错Map类型,导致获取到的Header值不全

问题复现 在 Spring 中解析 Header 时&#xff0c;我们在多数场合中是直接按需解析的。例如&#xff0c;我们想使用一个名为 myHeaderName 的 Header&#xff0c;我们会书写代码如下&#xff1a;RequestMapping(path "/hi", method RequestMethod.GET) public Str…

GitHub的简单操作

引言 今天开始就要开始做项目了&#xff0c;上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…