决策树算法是一种既可以用于分类,也可以用于回归的算法。在之前的文章中我们介绍了决策树分类的原理,用决策树解决回归问题就是决策树回归算法,也叫作回归树。
要讲回归树,我们一定会提到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的杂货铺