CART回归树入门学习

  • 一、什么是CART回归算法
  • 二、分类树与回归树区别
  • 三、CART回归树与一般回归算法区别
  • 四、CART回归树创建
    • 4.1 CART回归树的划分
    • 4.2 CART回归树的构建
    • 4.3 CART回归树的剪枝
    • 4.4 数据预测
  • 五、总结

ID3、C4.5不能直接处理连续性的特征,需要将连续性的转化成离散的,但是会破坏连续性特征的内在结构。

一、什么是CART回归算法

CART分类回归树(Classification and Regression Tree)是一种典型的二叉决策树,可以做分类或者回归。如果待预测结果是离散型数据,则CART生成分类决策树;如果待预测结果是连续型数据,则CART生成回归决策树,类似于二分类树,内部结点特征的取值只有“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。

数据对象的属性特征为离散型或连续型,并不是区别分类树与回归树的标准。

二、分类树与回归树区别

分类树与回归树的区别在样本的输出,如果样本输出是离散值,这是分类树;样本输出是连续值,这是回归树。分类树的输出是样本的类别,回归树的输出是一个实数。

分类模型:采用基尼系数的大小度量特征各个划分点的优劣。
回归模型:采用误差平方和度量

三、CART回归树与一般回归算法区别

CART回归树不同于线性回归模型,不是通过拟合所有的样本点来得到一个最终模型进行预测,它是一类基于局部的回归算法,通过采用一种二分递归分割的技术将数据集切分成多份,每份子数据集中的标签值分布得比较集中(比如以数据集的方差作为数据分布比较集中的指标),然后采用该数据集的平均值作为其预测值。这样,CART回归树算法也可以较好地拟合非线性数据。

假如数据集的标签(目标值)的集合呈现非线性目标函数的值,CART回归树算法将数据集切分成很多份,即将函数切成一小段一小段的,对于每一小段的值是较为接近的,可以每一小段的平均值作为该小段的目标值。

四、CART回归树创建

4.1 CART回归树的划分

在CART分类树中,是利用Gini指数作为划分的指标,通过样本中的特征对样本进行划分,直到所有的叶节点中的所有样本均为一个类别为止。其中,Gini指数表示的是数据的混乱程度,对于回归树,样本标签是连续数据,当数据分布比较分散时,各个数据与平均值的差的平方和较大,方差就较大;当数据分布比较集中时,各个数据与平均值的差的平方和较小。方差越大,数据的波动越大;方差越小,数据的波动就越小。因此,对于连续的数据,可以使用样本与平均值的差的平方和作为划分回归树的指标。

假设,有 m m m个训练样本, { ( X ( 1 ) , y ( 1 ) ) , ( X ( 2 ) , y ( 2 ) ) , … , ( X ( m ) , y ( m ) ) } \left\{\left(X^{(1)}, y^{(1)}\right),\left(X^{(2)}, y^{(2)}\right), \ldots,\left(X^{(m)}, y^{(m)}\right)\right\} {(X(1),y(1)),(X(2),y(2)),…,(X(m),y(m))},则划分CART回归树的指标为:
m ∗ s 2 = ∑ i = 1 m ( y ( i ) − y ˉ ) 2 m * s^{2}=\sum_{i=1}^{m}\left(y^{(i)}-\bar{y}\right)^{2} m∗s2=i=1∑m​(y(i)−yˉ​)2
下面是用Python实现CART回归树的划分指标:

import numpy as np
def calculate_err(data):"""input: data(list)output: m*s^2(float)"""data = np.mat(data)return np.var(data[:,-1]) * data.shape[0]

有了划分的标准,那么应该如何对样本进行划分呢?与CART分类树的划分一样,遍历各特征的所有取值,尝试将样本划分到树节点的左右子树中。只是因为不同的划分标准,在选择划分特征和特征值时的比较会有差异而已。 下面是左右子树划分的代码:

def split_tree(data, fea, value):'''根据特征fea中的值value将数据集data划分成左右子树input:  data(list):数据集fea(int):待分割特征的索引value(float):待分割的特征的具体值output: (set1,set2)(tuple):分割后的左右子树'''set_1 = []set_2 = []for x in data:if x[fea] >= value:set_1.append(x)else:set_2.append(x)return (set_1, set_2)

4.2 CART回归树的构建

CART回归树的构建也类似于CART分类树,主要的不同有三方面:

  1. 在选择划分特征与特征值的比较时,不是计算Gini指数,而是计算被划分后两个子数据集中各样本与平均值的差的平方和,选择此值较小的情况对数据集进行划分。
  2. 针对每一个叶节点,不是取样本的类别,而是各样本的标签值的平均平均值作为预测结果。
  3. 最后,CART回归树可通过设置参数进行前剪枝操作,此次构建中有设置了min_sample和min_err来控制树的节点是否需要进一步划分。
class node:'''树的节点的类'''def __init__(self, fea=-1, value=None, results=None, right=None, left=None):self.fea = fea  # 用于切分数据集的属性的列索引值self.value = value  # 设置划分的值self.results = results  # 存储叶节点所属的类别self.right = right  # 右子树self.left = left  # 左子树def build_tree(data, min_sample, min_err):'''构建树input:  data(list):训练样本min_sample(int): 叶子节点中最少的样本数min_err(float): 最小的erroroutput: node:树的根结点'''# 构建决策树,函数返回该决策树的根节点if len(data) <= min_sample:return node(results=leaf(data)# 1、初始化bestError = calculate_err(data)bestCriteria = None  # 存储最佳切分属性以及最佳切分点bestSets = None  # 存储切分后的两个数据集# 2、构建回归树 feature_num = len(data[0]) - 1  # 样本中特征的个数for fea in range(0, feature_num):feature_values = {}for sample in data:feature_values[sample[fea]] = 1for value in feature_values.keys():# 2.1 尝试划分(set_1, set_2) = split_tree(data, fea, value)if len(set_1) < 2 or len(set_2) < 2:continue# 2.2 计算划分后的errornowError = calculate_err(set_1) + calculate_err(set_2)if nowError < bestError and len(set_1) > 0 and len(set_2) > 0:bestError = nowErrorbestCriteria = (fea, value)bestSets = (set_1, set_2)# 3、判断划分是否结束if bestError > min_err:right = build_tree(bestSets[0],min_sample, min_err)left = build_tree(bestSets[1],min_sample, min_err)return node(fea=bestCriteria[0], value=bestCriteria[1], right=right, left=left)else:return node(results=leaf(data))  def leaf(data):"""计算叶节点的平均值"""data = np.mat(data)return np.mean(data[:,-1])

4.3 CART回归树的剪枝

在CART回归树中,当树中的节点对样本一直划分下去时,会出现最极端的情况:每一个叶子节点中仅包含一个样本,此时,叶子节点的值即为该样本的标签均值。这种情况极易对数据过拟合,为防止发生过拟合,需要对CART回归树进行剪枝,以防止生成过多的叶子节点。
在剪枝中主要分为:预剪枝和后剪枝。

  1. 预剪枝是指在生成树的过程中对树的深度进行控制,防止生成过多的叶子节点。在build_tree函数中就使用了min_sample和min_err来控制树中的节点是否需要进行更多的划分。通过不断调节这两个参数来找到合适的CART树模型。
  2. 后剪枝是指将训练样本分成两个部分,一部分用来训练CART树模型,这部分数据被称为训练数据,另一部分用来对生成的树模型进行剪枝,称为验证数据。
    在后剪枝的过程中,通过验证生成的CART树模型是否在验证数据集上发生过拟合,如果出现过拟合的现象,则合并一些叶子节点来达到CART树模型的剪枝。

本文中主要使用的是预剪枝,通过调整min_sample和min_err参数的方式。

4.4 数据预测

CART回归树模型构建好后,利用训练数据来训练该模型,最后训练好的回归树模型需要进行评估,了解预测值与实际值间的差距是否在接受范围内。

对CART回归树进行评估时,因需要对数据集中各样本进行预测,然后利用预测值与原始样本的标签值计算残差,所以,首先要建立predict函数。

def predict(sample,tree):"""对每一个样本sample进行预测input: sample(list)output: results(float)"""# 如果只是树根if tree.results != None:return tree.resultselse:# 有子树val_sample = sample(tree.fea)branch = Noneif val_sample >= tree.value:branch = tree.rightelse:branch = tree.leftreturn predict(sample, branch)

接下来,对数据集进行预测,并计算残差,代码如下:

def evaluate_error(data, tree):"""评估CART回归树模型input: data(list)tree: 训练好的CART回归树模型output: total_error/m(float): 均方误差"""m = len(data)total_error = 0.0for i in range(m):sample = data[i,:-1]pred = predict(sample, tree)total_error += np.square(data[i,-1] - pred)return total_error / m

五、总结

CART回归树算法是用来预测目标为连续值的算法,是一类基于局部的回归算法。CART回归树的构建是先利用类似CART分类树的方法将数据集进行划分,但划分的标准不同,本文使用的指标是各数值与平均值的差的平方和,在划分时选择使划分后的左右子树的该指标之和较小的特征与特征值,直到最后叶子节点中的样本个数达到min_sample或者各数值与平均值的差的平方和达到min_err为止,最后基于该叶子节点中的平均值作为预测值。在训练模型中,为避免过拟合,使用了参数min_sample和min_err来控制CART回归树模型的生成。

CART回归树原理及python实现相关推荐

  1. CART回归树原理及示例

    转载:https://cethik.vip/2016/09/21/machineCAST/ 一.概念 CART全称叫Classification and Regression Tree.首先要强调的是 ...

  2. 决策树(二):CART回归树与Python代码

    上一篇介绍了决策树的基本概念,特征划分标准及ID3、C4.5和CART分类树的算法,本文着重对CART回归树的内容进行补充. 本文概览: 首先介绍CART回归树的算法,然后是创建CART回归树的主要步 ...

  3. 1. 分类与回归树原理(CART)

    1. 简介 分类与回归树(Classification And Regression Tree),采用二分递归分割技术,将当前样本集划分成两个子集,即其结构为二叉树,每个内部节点均只有两个分支.左分支 ...

  4. Lesson 8.3Lesson 8.4 ID3、C4.5决策树的建模流程CART回归树的建模流程与sklearn参数详解

    Lesson 8.3 ID3.C4.5决策树的建模流程 ID3和C4.5作为的经典决策树算法,尽管无法通过sklearn来进行建模,但其基本原理仍然值得讨论与学习.接下来我们详细介绍关于ID3和C4. ...

  5. 一个例子让你明白什么是CART回归树

    关于CART的原理我相信各位都有看过,是不是有些晕呢?没关系,这里我给大家讲个例子,你就理解原来CART回归树生成这么简单啊... 首先建立一个数据集,为了方便,就取少量数据,如下表,数据的创建仅作参 ...

  6. 大白话5分钟带你走进人工智能-第二十六节决策树系列之Cart回归树及其参数(5)...

                                                    第二十六节决策树系列之Cart回归树及其参数(5) 上一节我们讲了不同的决策树对应的计算纯度的计算方法, ...

  7. CART回归树--决策树

    决策树的关键问题 这么多特征,使用哪个特征先进行子表划分? CART回归树 原始数据集S,此时树的深度depth=0; 针对集合S,遍历每一个特征的每一个value, 用该value将原数据集S分裂成 ...

  8. 监督学习 | CART 分类回归树原理

    文章目录 CART 算法 1. CART 生成 1.1 回归树生成 最小二乘回归树生成算法 1.2 分类树生成 基尼指数 CART 生成算法 参考文献 相关文章: 机器学习 | 目录 监督学习 | I ...

  9. CART回归树模型树 生成 剪枝 in Python

    现实中,数据集中经常包含一些复杂的相互关系,使得输入数据和目标变量之间呈现非线性关系.对这些复杂的关系建模,一种可行的方式是使用树来对预测值进行分段,包括分段常数或者分段直线,即通过树结构对数据进行切 ...

最新文章

  1. ledisDB底层实现——本质上就是用leveldb这样的底层存储,和ssdb一样,meta里存的是hash、list等的元数据...
  2. 比较经典的三层交换机实验
  3. linux下测试宽带速度
  4. KBQA相关论文分类整理:简单KBQA和复杂KBQA
  5. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...
  6. 掌握spec只需读这一篇文章,CentOS、RedHat、SUSE粉的福利来了
  7. python的浮点数占 个字节_Python的浮点数占 个字节。_学小易找答案
  8. 22.c语言各种输入输出与错误处理
  9. 字符数组的ss.toString()和new String(ss)的问题
  10. 当前GitHub上排名前十的热门Vue项目
  11. Netty权威指南——WebSocket协议开发
  12. 在线旅游发展趋势分析
  13. openssl密码套件详解
  14. 华为存储系统操作管理
  15. 本科论文查重率多少?
  16. Java--->奥运五环
  17. ArcGIS Server 统计服务请求数等
  18. Hive 练习(带数据)
  19. 极简Python:用opencv实现人脸检测,并用本地摄像头实现视频流的人脸识别
  20. ubuntu18.04 terminal 无法打开

热门文章

  1. OLE excel
  2. 仅改变rowspan背景_山西耗资10亿的小镇,人称长治“小周庄”,距市中心仅16公里...
  3. (精讲)UVA - 1339 Ancient Cipher 刘汝佳紫书题单(算法竞赛入门经典)
  4. java解析pdf获取pdf中内容信息
  5. linux 压缩固定大小,Linux 将文件打包、压缩并分割成指定大小
  6. vlc 控件属性和方法
  7. 基于python的批量网页爬虫
  8. redis 常用命令
  9. 【SQL自学打卡|DAY13】——组合查询
  10. vcruntime140.dll丢失的解决方法