决策回归树【原理/算例/决策回归树 VS 线性回归】

决策回归树

  • 1. 决策回归树原理
  • 2. 决策回归树算例
  • 3. 手动计算MSE和最优划分属性
  • 4. 决策回归树 VS 线性回归


1. 决策回归树原理


决策回归树,虽然叫做“回归”树,但是它的本质还是分类算法,只是分的类别多一点。

1. 回归树的裂分指标

  • 回归树种,节点的裂分指标是MSEMAE,但是最常用的是MSE
    MSE ( y , y ^ ) = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE}(y, \hat{y}) = \frac{1}{n} \sum\limits_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE(y,y^)=n1i=1n(yiy^i)2
    MAE ( y , y ^ ) = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \text{MAE}(y, \hat{y}) = \frac{1}{n} \sum\limits_{i=1}^{n} \left| y_i - \hat{y}_i \right| MAE(y,y^)=n1i=1nyiy^i
  • 其中 y i y_i yi 表示目标值, y ^ i \hat{y}_i y^i 是预测值,也是所有样本的目标值的均值。

2. 筛选最优划分属性的步骤

  • 就像之前学习的分类树一样,每一个节点,都有自己的MSE(熵),根据某一个属性进行划分,得到的子节点也有自己的MSE(熵),进而可以求得根据这一属性划分的子节点MSE带权加和(信息增益)。
  • 最优的划分属性,就是子节点MSE带权加和最小的那一个。

3. 叶子结点的值(预测值)

  • 对于回归树,叶子节点的值通常是该叶子节点内所有样本的目标变量值的平均值。

2. 决策回归树算例


1. 准备数据

import numpy as np
import matplotlib.pyplot as plt

# 造40个范围0到2pi的训练数据,并转化为列向量
X_train = np.linspace(0, 2 * np.pi, 40).reshape(-1, 1) # 训练数据
X_test = np.linspace(0, 2 * np.pi, 256).reshape(-1, 1) # 测试数据
# y 一个正弦波,余弦波,圆,目标值是二维的,y1 = sinx,y2 = cosx
y_train = np.concatenate([np.sin(X_train), np.cos(X_train)], axis=1) 
plt.figure(figsize=(4, 4))  # 横纵坐标比例相同
plt.scatter(y_train[:,0], y_train[:,1])

在这里插入图片描述

  • 我们希望习得一个模型,来拟合这个圆轨迹。上面的数据中,特征只有一个,二目标值有两个,是二维的。

2. 使用普通线性回归拟合

# 使用线性回归拟合
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

plt.scatter(y_pred[:, 0], y_pred[:, 1])

在这里插入图片描述

  • 效果非常不好,普通线性回归就是需要拟合出一条直线,但是我们希望得到是一个类圆的曲线。

3. 使用回归树拟合

from sklearn.tree import DecisionTreeRegressor

# 决策回归树
model = DecisionTreeRegressor(max_depth=3)  # 深度为3
model.fit(X_train, y_train) 

y_pred = model.predict(X_test)

plt.scatter(y_pred[:, 0], y_pred[:, 1])
plt.axis('equal') # 表示各轴横纵坐标相等

在这里插入图片描述

  • 可以看到,虽然拟合出的只有几个簇点,但是似乎已经有圆的样子了,我们试着再将深度放开点。
from sklearn.tree import DecisionTreeRegressor

# 决策回归树
model = DecisionTreeRegressor()  
model.fit(X_train, y_train) 

y_pred = model.predict(X_test)

plt.scatter(y_pred[:, 0], y_pred[:, 1])
plt.axis('equal') # 表示各轴横纵坐标相等
print(model.get_depth()) # 显示深度

"""
输出:
6
"""

在这里插入图片描述

  • 可以看到,这次拟合出的图形更像圆了,决策树的深度是6。

3. 将深度为3的决策树可视化

from sklearn import tree
import graphviz

dot_data = tree.export_graphviz(model, filled=True, rounded=True)

graph = graphviz.Source(dot_data)
graph.render('Account', format='png')

在这里插入图片描述

  • 上图回归树深度为3,叶子结点最多有23=8个,二上图得到的又恰巧是一颗满二叉树,所以习得的图像才有会8个簇点。
  • 如果我们默认将回归树分到底,可以看到得到的回归树深度是6,也就是说最多可能会有2^6个叶子结点,而我们的训练数据只有40个,这意味着回归数会将所有的训练数据分纯(这样一定会过拟合)。

3. 手动计算MSE和最优划分属性


1. 根节点MSE

# 求未分裂时的mse
((y_train - y_train.mean(axis=0))**2).mean() # 注意y是二维的,有两列

"""
输出:
0.4996875
"""

2. 计算最优划分属性

  • 由于本算例中属性只有一个,所以计算最优划分属性实际上就是计算该属性的最优划分点:
# 最佳裂分条件
lower_mse = 1   # 根节点的mse是0.5,这个初始值只要比0.5大就可以

best_split = {} # 最佳划分点:mse带权加和
for i in range(len(X_train) - 1):
    split = X_train[i:i+2].mean()
    
    cond = X_train <= split
    # 根据条件,得到左侧和右侧数据划分
    y_left = y_train[cond.reshape(-1)]      # 左节点
    y_right = y_train[(~cond).reshape(-1)]  # 右节点

    # 子节点MSE
    mse_left = ((y_left - y_left.mean(axis=0))**2).mean()
    mse_right = ((y_right - y_right.mean(axis=0))**2).mean()

    # 计算划分整体的mse
    p_left = cond.sum()/cond.size   # 左节点所占比重
    p_right = 1 - p_left            # 右节点所占比重
    mse = mse_left * p_left + mse_right * p_right

    if mse < lower_mse:
        lower_mse = mse
        best_split.clear()
        best_split[np.round(split, 3)] = mse

print('最佳划分点是:', best_split)

"""
输出:
最佳划分点是: {3.142: 0.3072588991283228}
"""

4. 决策回归树 VS 线性回归


1. 准备数据

import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn import tree
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
diabetes = datasets.load_diabetes() # 糖尿病数据
X = diabetes['data']
y = diabetes['target']
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state = 911)   

2. 线性回归

linear = LinearRegression()
linear.fit(X_train,y_train)

print('训练数据得分:', linear.score(X_train, y_train))
print('测试数据得分:', linear.score(X_test,y_test))
  • 输出:
训练数据得分: 0.5400326830930334
测试数据得分: 0.4139431540141

3. 决策树回归

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'STKaiti'
max_depth = np.arange(1,16)
score_train = []    # 训练集得分
score_test = []     # 测试集得分
# 遍历所有深度
for d in max_depth:
    model = DecisionTreeRegressor(max_depth = d)
    model.fit(X_train,y_train)
    score_train.append(model.score(X_train, y_train))
    score_test.append(model.score(X_test, y_test))

plt.plot(max_depth, score_train, 'g*-') # 绿线,随着深度增加,训练集的情况
plt.plot(max_depth,score_test,'ro-')    # 红线,随着深度增加,测试集的情况
plt.xlabel('max_depth',fontsize = 18)
plt.ylabel('Score',fontsize = 18)
plt.title('决策树准确率随着深度变化',pad = 20,fontsize = 20)
plt.legend(['训练数据得分', '测试数据得分'], fontsize = 18)
plt.savefig('./6-决策树回归糖尿病.png',dpi = 200)

在这里插入图片描述

  • 可以看到,决策回归树测试数据得分最高不过才2点几,在这个数据集上没有线性回归效果好。
  • 并且随着深度的提高,训练集的得分接近满分,但是测试集得分越来越差,这就是典型的过拟合。

此处的得分是R2值。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的智能鱼缸控制系统的Proteus仿真

文章目录 一、智能鱼缸控制系统1.题目要求2.思路2.1 主控2.2 传感器2.3 按键2.4 声光报警2.5 自动换水&#xff0c;喂食&#xff0c;供氧2.6 OLED显示2.7 电源部分2.8 远程终端 3.电路仿真3.1 未仿真时3.2 开始仿真&#xff0c;正常显示3.3 按下设置按键&#xff0c;进入阈值界…

【Python爬虫】Scrapy框架实战---百度首页热榜新闻

如何利用Scrapy框架实战提取百度首页热榜新闻的排名、标题和链接 一、安装Scrapy库 二、创建项目&#xff08;以BaiduSpider为例&#xff09; scrapy startproject BaiduSpider生成每个文件的功能&#xff1a; 二、 创建爬虫脚本&#xff08;爬虫名&#xff1a;news&#xff…

mysql-分析MVCC原理

一、MVCC简介 MVCC是一种用来解决读写冲读的无锁并发控制&#xff0c;也就是为事务分配单增长的时间戳&#xff0c;为每个修改保存一个版本&#xff0c;版本与事务时间戳关联&#xff0c;读操作只读该事务开始前的数据库的快照&#xff0c;所以MVCC可以为数据库解决一些问题。…

论文笔记:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

1. 挑战/问题&#xff08;Challenges/Issues&#xff09;&#xff1a; 这篇论文探讨了大型预训练语言模型在处理知识密集型自然语言处理&#xff08;NLP&#xff09;任务时面临的挑战。尽管这些模型在参数中存储了大量事实知识&#xff0c;并在微调后能够在下游NLP任务中取得很…

嵌入式硬件电子电路设计(六)LDO低压差线性稳压器全面详解

引言&#xff1a; LDO&#xff08;Low Dropout Regulator&#xff0c;低压差线性稳压器&#xff09;是一种常用的电源管理组件&#xff0c;用于提供稳定的输出电压&#xff0c;同时允许较小的输入电压与输出电压之间的差值。LDO广泛应用于各种电子设备中&#xff0c;特别是在对…

Spring:AOP面向切面案例讲解AOP核心概念

Spring的AOP&#xff0c;在不惊动(改动)原有设计(代码)的前提下&#xff0c;想给谁添加功能就给谁添加。这个也就是Spring的理念&#xff1a; 无入侵式/无侵入式 AOP中核心概念分别指的是什么? 连接点切入点通知通知类切面 下面以一个例子进行讲解&#xff0c;直接上代码&a…

禁止Chrome的自动升级

一、需求分析 因为用Chromeselenium做了网页自动化填写任务&#xff0c;如果Google Chrome浏览器自动升级&#xff0c;就会导致chromedriver加载失败&#xff0c;自动化任务失效&#xff0c;因此需要禁止Chrome浏览器的自动升级。 二、当前环境 三、实际配置 运行注册表编辑…

2024年wordpress、d-link等相关的多个cve漏洞poc

⚠️ 漏洞 ✅ CVE-2024-10914 在D-Link DNS-320、DNS-320LW、DNS-325和DNS-340L中发现的漏洞&#xff0c;版本直到20241028 GET /cgi-bin/account_mgr.cgi?cmdcgi_user_add&name%27;id;%27 HTTP/1.1✅ CVE-2024-11305 在Altenergy Power Control Software中发现的关键…

Spring框架特性及包下载(Java EE 学习笔记04)

1 Spring 5的新特性 Spring 5是Spring当前最新的版本&#xff0c;与历史版本对比&#xff0c;Spring 5对Spring核心框架进行了修订和更新&#xff0c;增加了很多新特性&#xff0c;如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上&#xff0c;所以Spri…

从搭建uni-app+vue3工程开始

技术栈 uni-app、vue3、typescript、vite、sass、uview-plus、pinia、axios 一、项目搭建 1、创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project2、安装sass npm install -D sass// 安装sass-loader&#xff0c;注意需要版本10&…

WPF中的登录界面

创建如下的目录结构&#xff1a; 2.在App.xaml.cs中设置为先登录验证之后再进入主页面 using Prism.Ioc; using System.Windows; using 校园访客系统.Views;namespace 校园访客系统 {/// <summary>/// Interaction logic for App.xaml/// </summary>public partia…

ros2学习日记_241124_ros相关链接

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

ETAS工具导入DBC生成Com协议栈

文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

如果在docker 容器中安装ros遇到的问题

1.在容器内部无法修改时间&#xff0c;需要在宿主机外边修改时钟。修改时钟&#xff1a; hwclock --systohc或者执行 date -s "2024-11-24 19:25:10"2.容器内部内置有opencv4.5版本&#xff0c;需要卸载&#xff0c;重新安装4.2.0版本。记录折腾好久的卸载过程。 …

排序(Java数据结构)

1. 排序的概念及引用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。(所有的排序都是默认从小到大排序) 稳定性&#xff1a;假定在待排序的记录序列中&#xff…

AutoDL安装docker问题

在AutoDL上租了卡&#xff0c;安装docker遇到一些问题&#xff1a; 1.执行 sudo docker run hello-world 报错 docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 解决方法 先查看docker有没有启动&#xff0c;…

ArcGIS定义投影与投影的区别(数据和底图不套合的原因和解决办法)

今天介绍一下ArcGIS中定义投影与投影的区别。 给大家解惑一下为什么经常出现自己的数据无法和底图套合的情况。 一 目录 1、ArcGIS定义投影与投影的概念区别 2、ArcGIS定义正确的坐标系 3、ArcGIS动态投影实现套合 4、ArcGIS地理坐标系转投影坐标系&#xff08;错误做法&am…

ChatGPT 桌面版发布了,如何安装?

本章教程教大家如何进行安装。 一、下载安装包 官网地址地址&#xff1a;https://openai.com/chatgpt/desktop/ 支持Windows和MacOS操作系统 二、安装步骤 Windows用户下载之后&#xff0c;会有一个exe安装包&#xff0c;点击运行安装即可。 注意事项&#xff0c;如果Windows操…

鸿蒙开发——根据背景图片来构建特定颜色的蒙版

效果图如下(文字部分马赛克处理)&#xff1a; 最近突然发现网易云和QQ音乐这些图片上方的蒙版颜色不是固定的&#xff0c;而是跟着图片内容走的&#xff0c;想看看能不能在鸿蒙实现&#xff0c;最后凭借俺寻思之力寻思出了一套流程(有bug&#xff0c;有时候蒙版直接透明了&…