文章目录
- 一、概述
- 1.1 介绍
- 1.2 回归树和分类树区别
- 二、重要参数、属性及接口
- 2.1 criterion(不纯度衡量指标)
- 2.2 回归树如何工作(核心流程拆解)
- 三、用回归树拟合正弦曲线(实战案例)
- 3.1 绘制正弦曲线
- 3.2 为正弦曲线添加噪声
- 3.3 实例化训练模型
- 3.4 测试集导入模型
- 3.5 绘制图像(对比真实与预测)
- 总结
一、概述
1.1 介绍
回归树是决策树家族中专攻连续型数值预测的模型,其运作逻辑可理解为 “把复杂回归难题拆分成简单小任务” 。打个比方,要预测房价(典型的连续数值),它会依据 “房屋面积>100㎡”“房龄<5 年” 这类规则,将整个数据集像切蛋糕一样,分割成一个个叶节点。每个叶节点会计算对应子数据集的均值,以此作为该区域的预测输出。整个过程就像树状结构那样,从根节点开始逐层做决策,既直观又高效,哪怕是非技术人员,也能轻松看懂模型的大致判断逻辑。
1.2 回归树和分类树区别
为了更清晰展现回归树与分类树的不同,我们用表格对比:
对比维度 | 回归树 | 分类树 |
---|---|---|
预测目标 | 聚焦连续型数值,像房价、温度、股票收盘价这类可在一定区间内连续取值的数据预测 | 针对离散型类别,比如猫狗分类、疾病诊断(是 / 否患病)、垃圾邮件识别(是 / 否垃圾邮件)等场景 |
叶节点输出 | 输出子数据集的均值,是连续的数值结果,比如某叶节点对应房屋子数据的平均价格 | 输出子数据集的众数,也就是出现频率最高的类别标签,像某叶节点里猫咪图片占比最多,就输出 “猫” 这个类别 |
不纯度衡量 | 用平方误差(最小化预测值与真实值的偏差,公式为∑(yi−yˉ)2\sum(y_i - \bar{y})^2∑(yi−yˉ)2 ),直接和回归任务的预测目标挂钩,清晰反映数值预测的误差情况 | 借助基尼系数(衡量类别混乱程度,数值越小越纯净)或者信息熵(反映信息不确定性,越小说明类别越集中),目标是降低类别混乱度 |
二、重要参数、属性及接口
2.1 criterion(不纯度衡量指标)
在回归树里,criterion
参数起着关键作用,它决定了模型如何挑选 “最佳分割特征以及对应的分割阈值” ,常用的参数有以下这些:
mse
(均方误差):这是默认且最常用的指标!它会计算分割后子节点的平方误差,也就是把每个数据点的真实值与子节点均值的差做平方后求和(∑(yi−yˉ)2\sum(y_i - \bar{y})^2∑(yi−yˉ)2)。模型训练时,会努力找到让这个误差最小的分割方式,因为它直接关联回归任务的预测目标,计算简单又高效,大多数常规回归场景用它准没错。mae
(平均绝对误差):计算方式是把每个数据点真实值与子节点均值的绝对差求和(∑∣yi−yˉ∣\sum |y_i - \bar{y}|∑∣yi−yˉ∣)。相比mse
,它对异常值更 “宽容”(鲁棒性强),因为平方运算会放大异常值的影响,而绝对值运算相对更平和。不过,它的计算速度稍慢一点,适合数据里噪声大、异常值多的场景,能避免模型被异常值带偏。
下面用 Python 的 sklearn
库演示代码:
from sklearn.tree import DecisionTreeRegressor
# 实例化模型,设置 mse 作为 criterion,追求最小化平方误差
model_mse = DecisionTreeRegressor(criterion='mse')
# 实例化模型,设置 mae 作为 criterion,应对噪声数据更稳
model_mae = DecisionTreeRegressor(criterion='mae')
2.2 回归树如何工作(核心流程拆解)
回归树构建是个层层递进的过程,就像剥洋葱一样,把复杂问题逐步拆解,主要分这 4 步:
- 特征 & 阈值遍历:模型会逐个遍历每个特征,比如预测房价时的房屋面积、房龄、楼层等特征。对于每个特征,还会遍历所有可能的分割阈值,像房屋面积可能尝试 80㎡、90㎡、100㎡ 等作为分割点,看看怎么分能让后续预测更准。
- 误差计算:依靠选定的
criterion
(比如mse
),计算按照当前分割方式,分割后子节点的误差总和。然后从众多分割可能里,找出能让误差下降最多的那个分割,把它作为当前的最佳分割。 - 递归分割:完成一次分割后,会生成新的子节点。接着,对子节点重复前面 “遍历特征 - 计算误差 - 找最佳分割” 的流程,不断细分数据,直到触发停止条件。常见停止条件有树的深度达到预设最大值(比如限制树只能长 5 层深),或者某个节点里的数据样本太少(比如只剩 10 个数据点就不再分割)。
- 叶节点赋值:当无法再继续分割(触发停止条件)时,叶节点就确定下来。叶节点的预测值,就是对应子数据集的均值,用这个均值代表该区域数据的预测结果。
三、用回归树拟合正弦曲线(实战案例)
目标:借助回归树学习 y=sin(x)y = \sin(x)y=sin(x) 这条曲线的规律,处理带有噪声的模拟数据,验证模型在曲线拟合这类回归任务里的能力,同时看看怎么调整参数优化效果。
3.1 绘制正弦曲线
先通过代码生成纯净的正弦曲线数据,直观感受它的形态:
import numpy as np
import matplotlib.pyplot as plt# 设置中文字体,SimHei 为 Windows 下的中文黑体,可根据系统调整(如 macOS 可用 'PingFang SC' 等 )
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号显示为方块的问题(可选,若绘图有负号时需要 )
plt.rcParams['axes.unicode_minus'] = False# 生成 x 数据,在 0 到 2π 区间均匀取 200 个点,构建连续的 x 轴
x = np.linspace(0, 2 * np.pi, 200)
# 根据正弦函数计算对应的 y 值,得到纯净的正弦曲线数据
y = np.sin(x)# 绘制曲线,设置标签和颜色,方便后续图例展示
plt.plot(x, y, label='纯净正弦曲线', color='blue')
# 显示图例,让曲线含义清晰
plt.legend()
# 展示绘制的图像
plt.show()
运行后,会看到一条平滑的、在 -1 到 1 之间周期性波动的蓝色正弦曲线,这是理论上纯净无干扰的曲线形态。
3.2 为正弦曲线添加噪声
实际数据采集时,难免会有各种干扰,所以给纯净数据添加随机噪声,模拟真实场景:
# 加噪声(设置随机种子为 0,保证每次运行生成相同噪声,方便复现结果;均值 0,方差 0.1 的正态分布噪声)
np.random.seed(0)
# 给纯净正弦曲线 y 的每个点,加上随机噪声,得到带噪声的 y_noise
y_noise = y + np.random.normal(0, 0.1, size=len(x)) # 绘制带噪声的数据点,用橙色小散点展示;同时绘制纯净曲线作为参考
plt.scatter(x, y_noise, label='带噪声数据', color='orange', s=10)
plt.plot(x, y, label='纯净曲线', color='blue')
# 显示图例,区分噪声点和纯净曲线
plt.legend()
# 展示图像,能看到噪声让原本平滑的曲线变得“凹凸不平”
plt.show()
此时图像里,蓝色平滑曲线是纯净正弦曲线,橙色小点点是叠加噪声后的模拟真实数据,能直观看到噪声对数据的影响。
3.3 实例化训练模型
用 sklearn
里的 DecisionTreeRegressor
来训练模型,过程如下:
from sklearn.tree import DecisionTreeRegressor# 数据格式转换(sklearn 的模型要求特征数据是二维数组,所以把一维的 x 转成列向量形式)
x_reshape = x.reshape(-1, 1) # 实例化模型,这里设置 max_depth=5 控制树的深度,criterion 选常用的 'mse';也可调整参数看效果变化
model = DecisionTreeRegressor(max_depth=5, criterion='squared_error')
# 用带噪声的数据训练模型,让模型学习 x 和 y_noise 之间的关系
model.fit(x_reshape, y_noise)
这里 max_depth
是重要参数,控制树的深度,深度设置会影响模型对曲线的拟合程度,后续可调整探索。
3.4 测试集导入模型
用训练好的模型,对测试数据(这里直接用和训练数据同范围的 x 生成测试集,也可换新的独立数据)做预测:
# 用同样 x 范围生成测试集(也可准备全新数据;保持和训练数据同结构,转成二维)
x_test = np.linspace(0, 2 * np.pi, 200).reshape(-1, 1)
# 用训练好的模型预测测试集的 y 值
y_pred = model.predict(x_test)
模型会依据训练时学到的分割规则,对每个测试数据点 x_test
,找到对应的叶节点,用叶节点均值给出预测结果 y_pred
。
3.5 绘制图像(对比真实与预测)
把纯净曲线、带噪声数据、模型预测曲线放一起对比,直观看拟合效果:
plt.figure(figsize=(10,6))
# 绘制带噪声数据点,展示原始数据分布
plt.scatter(x, y_noise, label='带噪声数据', color='orange', s=10)
# 绘制纯净正弦曲线,用虚线展示理论形态,方便对比
plt.plot(x, y, label='纯净正弦曲线', color='blue', linestyle='--')
# 绘制回归树预测曲线,用红色实线突出模型预测结果
plt.plot(x_test, y_pred, label='回归树预测', color='red', linewidth=2) # 显示图例,说明各条线、点的含义
plt.legend()
# 设置标题,清晰展示图表主题
plt.title('回归树拟合正弦曲线')
# 标注 x 轴、y 轴含义
plt.xlabel('x')
plt.ylabel('y')
# 展示图像
plt.show()
效果说明:
- 当
max_depth
很小时(比如设为 2),曲线会比较 “平”,模型对曲线的拟合不足,出现欠拟合,因为树太浅,没办法捕捉曲线的波动细节。 - 随着
max_depth
增大(比如设为 10),曲线会越来越贴合带噪声的数据,甚至可能过度学习噪声,出现过拟合,曲线变得 “崎岖”,在新数据上预测效果变差。
实际应用中,需要调整参数平衡欠拟合和过拟合问题。常用做法是用交叉验证(比如GridSearchCV
工具),自动筛选合适的max_depth
、criterion
等参数,找到在验证集上表现最好的模型配置。
总结
现过拟合,曲线变得 “崎岖”,在新数据上预测效果变差。
实际应用中,需要调整参数平衡欠拟合和过拟合问题。常用做法是用交叉验证(比如 GridSearchCV
工具),自动筛选合适的 max_depth
、criterion
等参数,找到在验证集上表现最好的模型配置。