cart算法_决策树算法--CART回归树算法

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

分类模型:采用基尼系数的大小度量特征各个划分点的优劣。

回归模型:采用误差平方和度量。

建立CART回归树步骤

输入:训练数据集D

输出:回归树T

  1. 计算各个特征各个值划分的两部分
    的误差平方和,选择误差平方和最小的(如下式)作为最优特征和最优切分点

其中,

的样本输出均值,
的样本输出均值。

2. 根据最优特征A和最优切分点a,将本节点的数据集划分成两部分
,并给出相应的输出值

3. 继续对两个子集调用1-2步骤,直到满足停止条件

4. 生成回归树

对生成的CART回归树做预测时,用叶子节点的均值来作为预测的输出结果。

创建回归树

主要参考《机器学习实战》一书中的第9章树回归,来编写脚本的,因为我的环境是python3.6,所以按书本中的编写有几处会报错,故做了相关的修改,在代码中也一并标注出来了,大家需要注意下。

import 

示例1

绘制数据集ex00的散点图如下

6a3425ee314dbc4425d9c44dbe14a781.png

对数据集ex00 构建回归树,输入以下语句测试下

dataMat 

运行结果如下

{'spInd': 0, 'spVal': 0.48813, 'left': 1.0180967672413792, 'right': -0.04465028571428572}

示例2

绘制数据集ex0的散点图如下

aa7ef3b27a9abdb059c8cb90665126e8.png

对数据集ex0构建回归树,输入以下语句测试下

dataMat 

运行结果如下

{'spInd': 0, 'spVal': 0.39435, 'left': {'spInd': 0, 'spVal': 0.582002, 'left': {'spInd': 0, 'spVal': 0.797583, 'left': 3.9871632, 'right': 2.9836209534883724}, 'right': 1.980035071428571}, 'right': {'spInd': 0, 'spVal': 0.197834, 'left': 1.0289583666666666, 'right': -0.023838155555555553}}

树剪枝

当决策树划分得太细时,会对数据产生过拟合,因此要通过剪枝来解决,降低决策树的复杂度来避免过拟合。剪枝(pruning)分为预剪枝和后剪枝,预剪枝(prepruning)是指在构造树的过程中就知道哪些节点可以剪掉,在函数chooseBestSplit中提前终止条件,其实也是在进行一种预剪枝操作 。 后剪枝(postpruning)是指构造出完整的决策树之后再来考查哪些子树可以剪掉。

使用后剪枝需要将数据集分为测试集和训练集。首先指定参数,使得构建出的树足够复杂,便于剪枝;然后从上而下找到叶节点,用测试集来判断这些叶节点合并是否能够降低测试误差,如果是的话就合并。

def 

绘制数据集ex2的散点图如下

1e497b160d07a6703d058e0c9bbf56a8.png

对数据集ex2 构建回归树并进行剪枝,输入以下语句测试下

dataMat2 

运行结果如下

Merging
Merging
...
Merging
{'spInd': 0, 'spVal': 0.499171, 'left': {'spInd': 0, 'spVal': 0.729397, 'left': {'spInd': 
...
'left': {'spInd': 0, 'spVal': 0.053764, 'left': 1.7820349999999998, 'right': -13.731698}, 'right': 4.091626}}}}}}}}}}}

一般地,为了寻找最佳模型可以同时使用两种剪枝技术。

模型树

用树来对数据建模,除了把叶节点简单地设置为常数值之外,另一种方法是把叶节点设为分段线性函数,这里的分段线性(piecewise linear)是指模型由多个线性片段组成。

fdef2332de8da16681b9c579dcaf1d93.png

如上图,使用两条直线拟合会比使用一组常数来建模效果更好。 可以由[0.0,0.3]和[0.3,1.0]这两个区间的两条直线组成。决策树相比其他机器学习算法易于理解,而模型树的可解释性是它优于回归树的特性之一。模型树同时具备更高的预测准确度。

前面代码稍加修改就可以再叶节点生成线性模型而不是常数。createTree()里有两个参数leafType和errType从未改变过,回归树把这两个参数固定,而模型树需要对此略作修改。

为了寻找最佳切分,怎么计算误差?不能用回归树的误差计算方法了,这里需要对给定的数据集,先用线性的模型对它进行拟合,然后计算真实目标值和模型预测值之间的差距。最后求这些差值的平方和作为所需的误差

def 

输入以下语句测试下

dataMat2 

运行结果如下,

{'spInd': 0, 'spVal': 0.285477, 'left': matrix([[1.69855694e-03],
        [1.19647739e+01]]), 'right': matrix([[3.46877936],
        [1.18521743]])}

可以看出,生成的两个线性模型分别是

。与用于生成该数据的真实模型(
)非常接近。

树回归和标准回归的比较

函数treeForeCast()自顶向下遍历整棵树,直到命中叶节点为止。一旦到达叶节点,它会在输入数据上调用modelEval()函数,该参数默认值是regTreeEval()。要对回归树叶节点预测,就调用regTreeEval()函数,要对模型树节点预测,调用modelTreeEval()函数。

def 

数据集为人的智力水平和自行车的速度的关系(此数据纯属虚构),该数据散点图如下

85340c0f26b13c5e3372655314b9b232.png

输入下面语句,构建回归树和模型树,并比较$R^2$值

trainMat 

运行结果如下

3b66381e7bed0f482fd6dcf402e1e432.png

我们知道,

值越接近1.0越好,从上图可以看出,模型树的结果比回归树好。

下面看一下标准线性回归的效果,需要前面实现的线性方程组求解函数 linearSolve (),输入下面语句

print

运行结果如下:

eef78055b3f90f43ffd1ae5701da3f62.png

可以看到,标准线性回归方法在

值上的表现不如上面两种树回归方法。所以,树回归在预测复杂数据时会比简单的线性模型更有效。

使用python Tkinter库创建GUI

机器学习从数据中提取有用的信息,能否将这些信息以易于人们理解的方式呈现非常重要。构建一个图像用户界面(GUI,Graphical User Interface)可以同时支持数据呈现和用户交互的方式。

python有很多GUI框架,其中一个易于使用的Tkinter,随python标准编译版本发布。Tkinter可以再Windows、Mac OS和大多数Linux平台上使用。

注意:python3.6版本是自动安装tkinter。

示例

from 

运行结果如下

6b465b1f7ea403f06a665d5463343bdb.png

Tkinter的GUI是由一些小部件(Widget)组成的。小部件包括文本框(Text Box),按钮(Button),标签(刚才用的Label)、复选框(Check Button)等对象。其中,.grid()会把小部件安排到一个二维表格布局管理器中。用户可以设定每个小部件所在的行列位置,默认会显示在0行0列。

下面为集成Matplotlib和Tkinter的代码

import 

输入下面语句,将所需的小部件集成在一起构建树管理器界面

if 

运行程序,默认情况下(即不勾选复选框),会给出一棵包含八个节点的回归树,如下

731fb937a18d90e8d44c4c154713d5e0.png

勾选复选框,然后点击“ReDraw”按钮会得到模型树结果,如下

b836407a5c7593ca6fe1d29c74050d7a.png

总结

数据集中会包含一些复杂的相互关系,使输入数据和目标变量之间存在非线性的关系。对于这种复杂关系的建模,一种可行的方式是使用树来对预测值分段,包括分段常数(回归树)和分段直线(模型树)。

CART算法可以用于构建二元树并处理离散型或连续型数据的切分。若使用不同的误差准则,就可以通过CART算法构建模型树和回归树。但是,该算法构建的树倾向于对数据过拟合,可采用剪枝的方法解决该问题。剪枝分为预剪枝(在树的构建过程中就就进行剪枝)和后剪枝(树构建完毕进行剪枝)。预剪枝更有效但需要用户定义一些参数。一般地,为了寻找最佳模型可以同时使用两种剪枝技术。

Tkinter是python的一个最常用的GUI工具包。利用Tkinter,可以轻松绘制各种部件并灵活安排它们的位置。另外,可以为Tkinter构造一个特殊的部件来显示Matplotlib绘出的图。所以,Matplotlib和Tkinter的集成可以构建出更强大的GUI。

相关链接

书籍:《机器学习实战》、周志华的西瓜书《机器学习》

ID3算法

C4.5算法

CART分类树算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值