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

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

要讲回归树,我们一定会提到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的杂货铺

相关推荐
小龙报1 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯
Hi李耶2 小时前
【LeetCode】15.三数之和
java·算法·leetcode
rannn_1112 小时前
【力扣hot100】链表专题|21、2、19、24、92、25
java·数据结构·算法·leetcode·链表·开发
SNAKEpc121383 小时前
OpenGL(十五)- 着色器语言GLSL
c语言·c++·线性代数·算法·矩阵·图形渲染·着色器
AI服务老曹3 小时前
AI视频分析API完整流程:设备、算法与告警接口接入指南
人工智能·算法·音视频
鹿角片ljp3 小时前
LeetCode 21. 合并两个有序链表
算法·leetcode·链表
Rabitebla3 小时前
C++11 新特性详解(一):列表初始化、initializer_list 与右值引用
java·开发语言·数据结构·c++·算法·leetcode·list
XMAIPC_Robot3 小时前
RK3588+STM32:高性能机器人运动控制解决方案,兼顾实时性与AI算力
人工智能·stm32·嵌入式硬件·算法·fpga开发·机器人·arm+fpga
天吾cc3 小时前
RTT-MQTT
网络·单片机·嵌入式硬件·算法