首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,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的最后一列,也就是目标值的平均值

defregLeaf(mat):

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

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

defregErr(mat):

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

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

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

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

defdecisionTreeRegressor(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

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

defbinSplitDataSet(dataSet,bestIndex,bestValue):

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

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

return mat0,mat1

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

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

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

defchooseBestSplit(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]

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 安装及实战应用

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171213G106K500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券