决策树(五):决策树回归

决策树算法是一种既可以用于分类,也可以用于回归的算法。在之前的文章中我们介绍了决策树分类的原理,用决策树解决回归问题就是决策树回归算法,也叫作回归树。

要讲回归树,我们一定会提到CART树,CART树全称Classification And Regression Trees,包括分类树与回归树。CART的特点是:决策树是二叉树 ,只有是和否两个分支。这样的决策树等价于「递归地二分每个特征」,将输入空间(特征空间)划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。

回归树原理

接下来用一个例子来介绍回归树的原理

如下关于睡眠时长和次日效率的分布中出现了明显的四个集群,如果使用线性回归是无法通过一条直线对数据进行效果很好的划分,现在想通过决策树回归,当知道睡眠时长时可以预测次日效率。

像之前讲到的分类决策树一样,我们首先进行一次划分,判断睡眠时间是否小于5.8小时,将整个区域划分为两个不同的区域。

接着用不同睡眠时间的条件对区域划分,对应的效率(也就是最终的叶子节点)是取当前区域内所有数据的均值,这样就可以得到一个输出连续的结果的回归树。

那么如何确定最优的划分条件呢?分类树用基尼系数、信息熵,回归树常用两种损失函数:

1.均方误差 MSE(Scikit-learn 默认)

M S E = 1 n ∑ i = 1 n ( y i − y ˉ ) 2 MSE = \frac{1}{n}\sum_{i=1}^n (y_i - \bar{y})^2 MSE=n1i=1∑n(yi−yˉ)2

其中 y ˉ \bar{y} yˉ:当前节点样本标签均值

2.平均绝对误差 MAE

M A E = 1 n ∑ i = 1 n ∣ y i − y ˉ ∣ MAE = \frac{1}{n}\sum_{i=1}^n |y_i - \bar{y}| MAE=n1i=1∑n∣yi−yˉ∣

对异常值更鲁棒,计算略慢。

如下图所示,如果第一次划分时将划分条件定为睡眠时间是否小于3小时,则左右两个区域里的样本可以求出一个均值(对应的两条绿线),

接着求两个区域绿线与节点之间的均方误差 MSE,最小的均方误差 MSE即是最优的划分。

上述例子是一个特征回归预测的情况,多元情况下原理类似。例如两个特征可用下图表示划分结果:

sklearn中的回归树

DecisionTreeRegressor 是 sklearn.tree 提供的 回归任务决策树模型,用于 预测连续数值,适用于 非线性关系的回归问题。官方文档链接为https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html

DecisionTreeRegressor 的语法为:

py 复制代码
sklearn.tree.DecisionTreeRegressor(*, criterion='squared_error', splitter='best',
								   max_depth=None, min_samples_split=2, 
								   min_samples_leaf=1, min_weight_fraction_leaf=0.0,
								    max_features=None, random_state=None,
								    max_leaf_nodes=None, min_impurity_decrease=0.0, 
								    ccp_alpha=0.0, monotonic_cst=None)

其中大部分参数与分类的决策树相同,少量参数与分类树有区别,可以对照学习使用。

  • criterion:衡量分割质量的标准。可选{"squared_error", "absolute_error", "poisson"}, 默认为"squared_error"均方误差
  • splitter:用于在每个节点处选择分割点的策略。支持的策略有"best"(选择最佳分割点)和"random"(选择最佳随机分割点),默认为"best"
  • max_depth:树的最大深度
  • min_samples_split:分割内部节点的最小样本数
  • min_samples_leaf:叶节点所需的最小样本数。只有当分割点在左右分支中都留下至少所设参数个训练样本时,才会考虑该分割点。
  • min_weight_fraction_leaf:叶节点所需的总权重(所有输入样本的权重总和)的最小加权分数。如果未提供 sample_weight,则样本具有相等的权重
  • max_features:寻找最佳分割时要考虑的特征数量
  • random_state:控制估计器的随机性
  • max_leaf_nodes:决策树的最大叶子节点数量
  • min_impurity_decrease:如果此分割导致的不纯度降低大于或等于此值,则该节点将被分割。
  • ccp_alpha:用于最小成本复杂性剪枝的复杂性参数。
  • monotonic_cst:要对每个特征施加的单调性约束。1:单调增加,0:无约束,-1:单调减少

回归树案例

我们用 scikit-learn 自带糖尿病数据集来进行回归建模

py 复制代码
from sklearn.datasets import load_diabetes
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn import metrics

# 糖尿病数据集
diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target

from sklearn import preprocessing as pp
# 数据标准化
X = pp.scale(X)
y = pp.scale(y)

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)
# 定义决策树回归模型
reg = DecisionTreeRegressor(max_depth=2)

# 训练模型
reg.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = reg.predict(X_test)

# 在测试集上进行预测
y_pred = reg.predict(X_test)


y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)

print("均方误差:{}".format(mse))
print("R方:{}".format(r2))
print("中位数绝对误差:{}".format(m_error))

最终建模的结果为:

py 复制代码
均方误差:0.49592641133141596
R方:0.4219065993765826
中位数绝对误差:0.4248167843058491

更多相关内容:Smilecoc的杂货铺

相关推荐
毕竟是shy哥3 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
晊晌_h4 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦5 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小白羊丨9 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F10 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper10 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-10 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法