前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >决策树回归:不掉包源码实现

决策树回归:不掉包源码实现

作者头像
double
发布2018-04-02 16:03:12
1K0
发布2018-04-02 16:03:12
举报
文章被收录于专栏:算法channel

《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来!

01

回顾

近几天推送了以决策树为基础模型的,性能优秀,应用广泛的 XGBoost 集成算法。与之相似的,比 XGBoost 发明还早的 GBDT(梯度提升决策树),它们的共同点都是以决策树为基础模型,要想深刻的理解这两种重要的集成算法,如果能更好地理解决策树算法的实现,会有助于理解它们。

下面,我们用源码实现决策树的回归算法,提到决策树一般都会用分类来讲解,一般来说这样比较容易入门,但是决策树用于回归也是非常普遍的,尤其GBDT和XGBoost也会以回归决策树为基础模型,接下来先看下回归决策树的代码实现吧。

02

从代码说起,不说公式

先用易懂的文字阐述下决策树的回归算法的实现思路。比如,一个数据集有3个特征,对应的目标值不再是整数,0,1,2,3,这种分类值,而是0.1,0.23,1.4等这种小数值。那么,怎么用决策树的模型做回归呢?

首先,依次遍历每个特征,然后,遍历每个特征的取值,注意,特征的取值可能有很多种,根据定义的最佳分割点的方法,找出当前特征的最佳分割点,内层循环结束后即可找到当前特征的最佳分割点,等外层循环遍历结束时,找到所有特征中的最佳分割点。

import numpy as np

#求得mat的最后一列,也就是目标值的平均值

def regLeaf(mat):

return np.mean(mat[:,-1])

#定义误差计算方法:mat最后一列(目标值)的方差乘以个数

def regErr(mat):

return np.var(mat[:,-1]) * np.shape(mat[:,-1])[0]

#生成回归决策树,给出一个元参数:

# 第一个表示分割后误差下降的大小未超过此值,直接作为叶节点输出(带有目标值)

# 第二个参数表示某个节点内含有的节点个数,必须大于这个值,才会进一步分裂

def decisionTreeRegressor(dataSet,ops=(0.0001,3)):

feat,val = chooseBestSplit(dataSet,leafType,regErr,ops)

if feat==None:

return val

retTree={}

retTree['spIndex'] = feat

retTree['spValue'] = val

lSet,rSet = binSplitDataSet(dataSet,feat,val)

retTree['left'] = createTree(lSet,leafType,regErr,ops)

retTree['right'] = createTree(rSet,leafType,regErr,ops)

return retTree

#根据最佳索引和取值,将数据集分开

def binSplitDataSet(dataSet,bestIndex,bestValue):

mat0 = dataSet[np.array(dataSet)[:,bestIndex]<bestValue]

mat1 = dataSet[np.array(dataSet)[:,bestIndex]>=bestValue]

return mat0,mat1

#选择最佳切分属性及其对应的属性值

#所有的属性遍历后,如果误差减少不大,生成叶子节点

# 得到叶节点的条件有3个,标红色的代码

def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr,ops=(0.0001,3)):

tolS = ops[0]

tolN = ops[1]

#所有的样本对应的目标值都相等,则

if len(set(dataSet[:,-1].T.tolist())) ==1:

return None, leafType(dataSet)

m,n = np.shape(dataSet)

S = errType(dataSet)

bestS = np.inf

bestIndex = 0

bestValue = 0

for featIndex in range(n):

for splitVal in set(dataSet[:,featIndex]):

mat0,mat1 = binSplitDataSet(dataSet,featIndex,splitVal)

#这个条件约束了分割后的区间长度都不能小于tolN

if (np.shape(mat0)[0] < tolN) or (np.shape(mat1)[0]<tolN):

continue

#求出分割后的两部分均方误差的和

newS = errType(mat0) + errType(mat1)

#如果newS更小,则让它成为bestS

if newS < bestS:

bestIndex = featIndex

bestValue = splitVal

bestS = newS

#说明误差下降的不大

if S - bestS < tolS:

return None,leafType(dataSet)

#根据最优特征和其对应的取值划分数据集

mat0,mat1 = binSplitDataSet(dataSet,bestIndex,bestValue)

#满足这种情况,只能是所有的样本点个数小于tolN

#此时只给出当前样本的均方误差

if (np.shape(mat0)[0] < tolN) or (np.shape(mat1)[0] < tolN):

return None, leafType(dataSet[:,bestIndex])

return bestIndex, bestValue

03

决策树回归分析

写好了以上代码,调用上面 decisionTreeRegressor,看看回归决策树的回归效果,为了展示方便,特意将满足分裂的条件加大,即内含节点个数大些。

当 ops[1] = 6时,即节点内含样本数大于6才做分裂,待回归的样本如下,

此时调用接口做回归,得到的决策树的示意图如下:

回归后的结果如下:

当 ops[1] = 5 时,即节点内含样本数大于5才做分裂,得到的决策树示意图和回归图如下,

以上就是用决策树做回归的整体代码实现思路和实现效果,最核心的还是选择特征和取值,在这里实际上是运用了最小均方差来选择。

明天该到GBDT的实现原理了,欢迎关注。

算法channel已推送的更多文章:

1 机器学习:不得不知的概念(1)

2 机器学习:不得不知的概念(2)

3 机器学习:不得不知的概念(3)

4 回归分析简介

5 最小二乘法:背后的假设和原理(前篇)

6 最小二乘法原理(后):梯度下降求权重参数

7 机器学习之线性回归:算法兑现为python代码

8 机器学习之线性回归:OLS 无偏估计及相关性python分析

9 机器学习线性回归:谈谈多重共线性问题及相关算法

10 机器学习:说说L1和L2正则化

11 机器学习逻辑回归:原理解析及代码实现

12 机器学习逻辑回归:算法兑现为python代码

13 机器学习:谈谈决策树

14 机器学习:对决策树剪枝

15 机器学习决策树:sklearn分类和回归

16 机器学习决策树:提炼出分类器算法

17 机器学习:说说贝叶斯分类

18 朴素贝叶斯分类器:例子解释

19 朴素贝叶斯分类:拉普拉斯修正

20 机器学习:单词拼写纠正器python实现

21 机器学习:半朴素贝叶斯分类器

22 机器学习期望最大算法:实例解析

23 机器学习高斯混合模型(前篇):聚类原理分析

24 机器学习高斯混合模型(中篇):聚类求解

25 机器学习高斯混合模型(后篇):GMM求解完整代码实现

26 高斯混合模型:不掉包实现多维数据聚类分析

27 高斯混合模型:GMM求解完整代码实现

28 数据降维处理:背景及基本概念

29 数据降维处理:PCA之特征值分解法例子解析

30 数据降维处理:PCA之奇异值分解(SVD)介绍

31 数据降维处理:特征值分解和奇异值分解的实战分析

32 机器学习集成算法:XGBoost思想

33 机器学习:XGBoost 安装及实战应用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档