《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,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 实战。期待您的到来!
领取专属 10元无门槛券
私享最新 技术干货