分类与回归树(classification and regression tree,CART)之回归_1984年分类与回归树的提出-程序员宅基地

技术标签: 分类与回归树  机器学习&深度学习  CART  回归树  

分类与回归树(classification and regression tree,CART)之回归

写在前面: 因为正在看提升树,所以又去看了李航老师《统计学习方法》的CART算法的回归部分,看完莫名想起了本科导师的名言:国内人写书,喜欢简单问题复杂化,复杂问题超级复杂化。可能是我境界不够,我不明白两个for循环的事情为何会叙述的如此复杂。。复杂到你可能得花费一些时间去思考他想表达什么,复杂到你看了一遍不知道他在讲什么。这篇博客我将用几句简短的话来叙述CART做回归时的方法,如果你没看懂那就是我的失败。。
这篇博客主要从以下几个方面来介绍:

  1. CART回归基本原理
  2. sklearn中CART实践

一、CART回归基本原理

分类与回归树CART是由Loe Breiman等人在1984年提出的,自提出后被广泛的应用。看这名字也知道CART既能用于分类也能用于回归,关于分类我们这里就不介绍了,因为和前面博客介绍的决策树相比较,CART除了把选择最优特征的方法从信息增益(率)换成了基尼指数,其他的没啥不同。这篇博客主要介绍CART用户回归任务。

下面我将用几句话来介绍CART的核心思想,主要讲CART是如何构造一棵树的,力求做到让人一下就看明白。
在这里插入图片描述
上面这个过程,相信一下就能看明白。但是这里会产生个问题:我们上面讲了要计算切分后的误差,那么这个误差怎么计算?
这个误差用的是均方误差来计算的,均方误差的话真实值是知道的,那么预测值是什么?在揭晓预测值之前先来形式化的定义下,不然不好描述。假设特征 j j j和切分点为 s s s,把样本划分为两部分 R 1 R_1 R1 R 2 R_2 R2,每部分的预测值分别为 c 1 c_1 c1 c 2 c_2 c2,则均方误差(损失函数)为:
(1) ∑ x i ∈ R 1 ( y i − c 1 ) 2 + ∑ x i ∈ R 2 ( y i − c 2 ) 2 \sum_{x_i \in R_1}(y_i - c_1)^2 + \sum_{x_i \in R_2}(y_i - c_2)^2 \tag{1} xiR1(yic1)2+xiR2(yic2)2(1)
我们的目标是要求 c 1 c_1 c1 c 2 c_2 c2使得(1)式最小,也就是我们的优化目标为:
(2) min ⁡ j , s [ min ⁡ c 1 ∑ x i ∈ R 1 ( y i − c 1 ) 2 + min ⁡ c 2 ∑ x i ∈ R 2 ( y i − c 2 ) 2 ] \min_{j,s}[\min_{c_1}\sum_{x_i \in R_1}(y_i - c_1)^2 + \min_{c_2}\sum_{x_i \in R_2}(y_i - c_2)^2] \tag{2} j,smin[c1minxiR1(yic1)2+c2minxiR2(yic2)2](2)

我们来看下这个优化目标,先看下 min ⁡ j , s \min_{j,s} minj,s里面的式子,也就是
(3) min ⁡ c 1 ∑ x i ∈ R 1 ( y i − c 1 ) 2 + min ⁡ c 2 ∑ x i ∈ R 2 ( y i − c 2 ) 2 \min_{c_1}\sum_{x_i \in R_1}(y_i - c_1)^2 + \min_{c_2}\sum_{x_i \in R_2}(y_i - c_2)^2\tag{3} c1minxiR1(yic1)2+c2minxiR2(yic2)2(3)
因为是个加法,只要分别求两项的最小值即可,提到求最小值,那肯定就是来一波求导了,就拿 ∑ x i ∈ R 1 ( y i − c 1 ) 2 \sum_{x_i \in R_1}(y_i - c_1)^2 xiR1(yic1)2来求吧,这个求导过程很简单就不写了,求出来:
(4) c 1 = 1 N 1 ∑ x i ∈ R 1 y i c_1 = \frac{1}{N_1}\sum_{x_i \in R_1}y_i \tag{4} c1=N11xiR1yi(4)
同理:
(5) c 2 = 1 N 2 ∑ x i ∈ R 2 y i c_2 = \frac{1}{N_2}\sum_{x_i \in R_2}y_i \tag{5} c2=N21xiR2yi(5)
里面的最小值知道了,外层的 min ⁡ j , s \min_{j,s} minj,s就回到了我们开头写的两个for循环遍历了。。关于CART做回归构造树的过程就是这些了,至于剪枝就不讲了,和分类一样,有兴趣的可参考我以前的博客:决策树(decision tree)(二)——剪枝

下面看个具体的例子,看看CART是如何构造回归树,并作出预测的。
训练数据集为(来自李航统计学习方法p75,说一下李航的这个数据集存在很大的问题,他75页给出的表格如下图所示,按照他书中符号的注释 x i x_i xi表示第 i i i个样本, x i ( j ) x_i^{(j)} xi(j)表示第 i i i个样本的第 j j j个特征,那么我们看下表,who can tell me 特征的取值是什么?):

x i x_i xi 1 2 3 4 5 6 7 8 9 10
y i y_i yi 4.50 4.75 4.91 5.34 5.80 7.05 7.90 8.23 8.70 9.00

所以,我这里自己添加了两个特征取值,见下表

样本编号 i i i 1 2 3 4 5 6 7 8 9 10
x i ( 1 ) x_i^{(1)} xi(1) 1 2 3 4 5 6 7 8 9 10
x i ( 2 ) x_i^{(2)} xi(2) 0.1 0. 2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
y i y_i yi 4.50 4.75 4.91 5.34 5.80 7.05 7.90 8.23 8.70 9.00

按照上面的算法步骤,两个for循环挑出最有特征的最优分裂点。
对于第一个特征,能够求出最优分裂点为 s = 5 s=5 s=5时,把10个样本分成了 R 1 = { 1 , 2 , 3 , 4 , 5 } R_1 =\{1,2,3,4,5\} R1={ 1,2,3,4,5} R 2 = { 6 , 7 , 8 , 9 , 10 } R_2 = \{6, 7, 8, 9, 10\} R2={ 6,7,8,9,10} c 1 = 5.06 c_1 = 5.06 c1=5.06 c 2 = 8.176 c_2 = 8.176 c2=8.176,此时误差最小,误差为6.7。
对于第二个特征,能够求出最优分裂点为 s = 5 s=5 s=5时,把10个样本分成了 R 1 = { 1 , 2 , 3 , 4 , 5 } R_1 =\{1,2,3,4,5\} R1={ 1,2,3,4,5} R 2 = { 6 , 7 , 8 , 9 , 10 } R_2 = \{6, 7, 8, 9, 10\} R2={ 6,7,8,9,10} c 1 = 5.06 c_1 = 5.06 c1=5.06 c 2 = 8.176 c_2 = 8.176 c2=8.176,此时误差最小,误差为6.7。
因为两个误差一样,所以可以任取一个特征,作为第一个分裂点(注:我这里只是举例演示,所以第二个特征只是把第一个特征缩小了10倍,这在特征选择里属于冗余特征,实际数据集中如果出现了这样的特征,也要删掉,因为提供不了任何信息)
下图为构建的树图:
在这里插入图片描述
下面就是递归的去做,就不讲了。

最后这个回归模型的预测值为:
(6) f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x) = \sum_{m=1}^Mc_mI(x \in R_m)\tag{6} f(x)=m=1McmI(xRm)(6)
关于这个公式解释下,就是最终构建完一颗完整的树(剪枝)后,会把样本集划分为M个区域(就是M个叶子节点),当预测新样本时,按照构造好的决策树走到最后的叶子节点,然后取叶子节点里所有样本的平均值作为预测值(即上面的公式)。

二、sklearn中CART实践

sklearn中DecisionTreeRegressor则是封装的CART(做了些改进),我们可以直接调用,然后把构造的回归树画出来,让大家看的更清晰。
上代码:

from sklearn.datasets import load_boston
from sklearn.tree import DecisionTreeRegressor
from sklearn import tree
import graphviz

boston = load_boston()
regressor = DecisionTreeRegressor(random_state=0)
regressor.fit(boston.data[0:15, 0:3], boston.target[0:15])
dot_data = tree.export_graphviz(regressor, out_file=None)
graph = graphviz.Source(dot_data)
graph.render(filename="boston_dtr", directory="output")

这里为了演示的方便,我只用了15条样本,3个特征,不然画出来的树太大。画出来的回归树如下所示:

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012328159/article/details/93667566

智能推荐

云服务器(阿里云)安装kafka及相关报错处理(WARN Connection request from old client /58.247.201.56:31365; will be dropp)-程序员宅基地

文章浏览阅读4.2k次。云服务器安装kafka,部署zookeeper时有如下注意点:1、在云服务器安全组中开放:2181、9092端口2、zookeeper.connect改成公网IP3、listeners=PLAINTEXT:// 必须填内网IPlisteners=PLAINTEXT://**.**.**.**:90924、配置外部代理地址必须填公网IPadvertised.listeners=PLAINTEXT://**.**.**.**:9092advertised.host.name=*.._connection request from old client

【连接池】-从源码到适配(上),你遇到过数据库连接池的问题吗?This connection has been closed_failed to initialize pool: this connection has bee-程序员宅基地

文章浏览阅读1.2k次,点赞19次,收藏22次。本文从项目需求出发到项目最终发版提测,讲述一下项目中遇到的问题(MyBatis数据库厂商适配、查看数据库链接、连接池失效等)以及打怪升级过程(思路),文章中会提到涉及到的坑以及解决办法。相信看完,多少会给你提供一些价值。_failed to initialize pool: this connection has been closed.

android listpreference 自定义,自定义android preference组件-程序员宅基地

文章浏览阅读179次。e() {return mDisableDependentsState;}public void setDisableDependentsState(boolean disableDependentsState) {mDisableDependentsState = disableDependentsState;}@Overrideprotected Object onGetDefaultValu..._android 自定义listpreference

射频MOS管和三极管优缺点对比_mos管比起三极管有什么优势-程序员宅基地

文章浏览阅读5.1k次。MOS管优点:1.具有良好的温度特性。2.具有良好的噪声特性。3.输入阻抗高。4.MOS管的漏极电流具有二次函数特性,三极管的集电极电流是指数形式。5.MOS管的上限频率远远超过三极管的上限工作频率。6.MOS管功耗较小。MOS管缺点:1.增益通常较低。2.输入阻抗高,导致匹配网络难设计。3.相对于三极管,MOS管的功率容量偏低..._mos管比起三极管有什么优势

华为云云耀云服务器L实例评测使用_华为云耀云服务器l实例跟腾讯云什么服务器类似-程序员宅基地

文章浏览阅读172次。其次就是会发送一条开通后的短信到手机上,这点还可以吧,不过也没太大必要,感觉要是第一次进这个服务器管理界面的话,有个服务器信息弹窗选择是新手还是老手,新手提示教程,老手提示服务器基础信息会更好一点,一般人买服务器都是在电脑上,感觉手机短信的不那么有必要。以下是进入后的界面,感觉还行吧,就是都是统一的黑色,没感觉到重点,熟悉后,应该会好一些,但是什么重置密码,设置网关什么的不好找到,需要详细的找一下,这点不太好。还有一次创建失败的信息,也不知道因为什么,在后边价格联系客服之类的应该会更好一点。_华为云耀云服务器l实例跟腾讯云什么服务器类似

在安装win7系统时如何不产生100M的系统保留分区_做系统的保留分区只有50mb-程序员宅基地

文章浏览阅读855次。在安装win7系统时如何不产生100M的系统保留分区 如果你是从xp系统升级安装,或者重新安装win7系统,应该不会出现所谓的100M系统保留分区情况。 这里说的安装指的的对新的磁盘或者删除了老的所有分区后的安装win7系统。 第一种方法:利用第三方分区工具先对磁盘进行分区。没有第三方工具,利用xp安装盘,进行磁盘分区也行。只要分区格式化就可以了,没有必要安装xp系统_做系统的保留分区只有50mb

随便推点

tf.nn.dropout() 警报信息处理_please use `rate` instead of `keep_prob`. rate sho-程序员宅基地

文章浏览阅读8.2k次,点赞11次,收藏23次。WARNING: Logging before flag parsing goes to stderr.calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.Instructions for updatin..._please use `rate` instead of `keep_prob`. rate should be set to `rate = 1 -

vmware12 的kernel module updater解决方法_vmware kernel module update-程序员宅基地

文章浏览阅读6.9k次。vmware12 的kernel module updater解决方法_vmware kernel module update

Typescript 开发工具Vscode自动编译.ts文件_tsconfig中导入 d.ts-程序员宅基地

文章浏览阅读350次。1.创建tsconfig.json文件tsc–init 生成配置文件首先你需要进入你的项目目录cmd然后输入tsc --init这样的话该目录下就会生成一个tsconfig.json的文件下一步你需要把tsconfig.json文件的outDir 改一下下一步去创建一个ts 文件最后去终端运行一下就会生成js文件了..._tsconfig中导入 d.ts

用Visual Studio建立第一个ASP.NET页面_vs2022怎么创建aspx文件-程序员宅基地

文章浏览阅读2.6w次,点赞17次,收藏84次。1.新建一个项目 (1)直接在VS开始界面上选择“新建项目 (2)在菜单上选择“文件”、“新建”、“项目”2.在弹出的窗口中选择“Visual C#”--->“Web”---->"ASP.NET空Web应用程序",注意选择的是.NET Framework4框架,然后输入你所想输入的项目名称,点击“确定”,就成功新建了一个ASP.NET项目_vs2022怎么创建aspx文件

快速上手MATLAB:科研、工程、数据分析,MATLAB入门(下)教你基础知识!分享《MATLAB初学者教程 MATLAB编程-菜鸟入门(清晰版)》_菜鸟教程matlab在线编程-程序员宅基地

文章浏览阅读1.2k次,点赞38次,收藏49次。前两天,我们在(MATLAB入门(上))中简单认识了MATLAB,了解了MATLAB的基础知识,今天继续从文件读取、MATLAB绘图两个方面给大家介绍。MATLAB是一款广泛应用的科学计算工具,适用于科研、工程、数据分析等领域。认识MATLAB需要了解其概述及特点,学会使用命令窗口、创建M文件、目录和文件管理、搜索路径管理等基本操作。MATLAB基础知识包括简单计算、基本运算符号、数值、变量及表达式、数组的生成和寻访。编程基础则包括流程控制、控制命令、逻辑数组和向量化等。_菜鸟教程matlab在线编程

问题:( )存量经营派单中,实现一个派单聚合多种业务的活动是哪类?( ) #微信#微信-程序员宅基地

文章浏览阅读307次,点赞9次,收藏6次。问题:( )存量经营派单中,实现一个派单聚合多种业务的活动是哪类?