随机森林回归

所属分类:机器学习-回归

这个方法是做什么的

用一组自变量预测一个数值型因变量。做法是对训练样本做有放回重抽样(bootstrap),在每一份抽样上长出一棵回归树,再把 100 棵树的预测取平均——每棵树只见到约三分之二的不重复样本,单棵树的过拟合在平均中互相抵消。它不要求你事先写出函数形式,非线性关系与变量交互会被树自己切出来;定类自变量可以直接拖进去,管线内会做独热编码。代价是没有回归系数:你拿不到“广告投入每增加 1 万元,销售额平均涨多少”这种能写进论文的数字。

报告共五张卡。主结果口径是 5 折 KFold 交叉验证(打乱),表4 给出验证折 R²、RMSE、MAE 的均值、折间标准差与 95%CI,另附“训练折均值”与一次留出测试集两列作对照,表5 是逐折明细。卡① 给建模设置与四项机器学习特有的前提诊断(n∶p 比、VIF 共线、疑似数据泄漏、重复观测);卡③ 给逐折 R² 柱状图、真实值—预测值散点与残差图;卡④ 给测试集上 20 次随机重排的置换重要性(ΔR²、95%CI、是否稳健)以及 Cohen f² 与“相对均值基线的 RMSE 降幅”;卡⑤ 给可誊入论文的规范表述。本模块专属的着眼点是表4 的“训练折均值”:bootstrap 让它不会顶到 1(本次 0.9199),同族「极端随机树回归」那一列恒为 1.0000。

需要准备什么数据

  • 放入因变量Y:不限
  • 放入自变量X:至少 1 个

数据要求

  • 数据表至少 30 行。
  • 单列缺失率不超过 30%。
  • 不接受取值全都一样的列(零方差列没有可分析的变异)。

以上条目由系统从该方法的校验规则直接生成,与上传数据时的实际拦截规则一致。

什么时候用它

  • 自变量与因变量的关系明显不是直线,而你说不清该套哪种函数形式
  • 存在交互效应(折扣力度在大店和小店里作用不同),又不想手工构造交互项
  • 定量与定类自变量混在一起,想一次性丢进去看谁有预测价值
  • 只关心“能不能预测准”,不需要给每个自变量一个可解释、可检验的系数

前提:因变量必须是连续数值且有真实波动(常数列直接报错)。有效样本量建议 ≥30,且“样本量 / 独热编码后特征维度”比值 ≥10——卡① 表3 第一行会给出实测的 n∶p 与“充足 / 偏紧 / 不足”判定。所选变量上有任一缺失的整行会被剔除,缺失多的列建议先处理再进模型。本模块的下限风险在袋外:样本量小时每棵树没见过的样本更少,折间波动会放大(本次 240 条下折间标准差 0.0711,是这一族八个模块里最小的)。

什么时候不要用它

  • 因变量是类别(是 / 否、高 / 中 / 低):用「随机森林分类」。
  • 要的是系数、显著性与置信区间:整份报告没有系数表,也没有任何针对自变量效应的 p 值。需要可解释系数用「线性回归 (最小二乘法)」;自变量多、想在给系数的同时压掉一批变量,用「Lasso回归」。
  • 要把模型用到训练样本没覆盖的取值上:随机森林不能外推(见下)。本模块示例数据里门店面积只有 53.5~395.5 平米,想预测 1000 平米的店,得用有函数形式、能沿趋势外延的「线性回归 (最小二乘法)」;沿时间外推用「时间序列分析(ARIMA)」。
  • 观测之间不独立(同一批门店的多期数据、同一所学校内的学生):交叉验证会把同一个体的记录拆到训练折与验证折两边,R² 因此虚高。有个体—时间两维结构用「面板模型」,分层嵌套用「混合模型」。
  • 特征多、噪声也多,训练偏慢:本模块每次分裂要在全部特征上搜最优切点,可改用把切点也随机化的「极端随机树回归」;想进一步榨取精度、且愿意配对调学习率与轮数,用「GBDT梯度提升回归」。

容易误读的地方

  • “树的数量”不是控制过拟合的旋钮。 装袋的性质是加树只降低预测方差,不会让模型更贴合训练数据——把 100 棵改成 500 棵,训练折 R² 基本不动,交叉验证 R² 也不会明显变化,只是更慢。本次示例训练折 R²=0.9199、验证折 R²=0.3895,落差 0.5304,要压这个落差得动另外两个控件:把“最小叶节点样本数”从 1 调大,或给“最大深度”设一个上限。卡② 那句“建议减少弱学习器数量/树深”不是针对随机森林写的:它是按落差分档的三档文案之一,落差 ≥0.20 就发这一句。这句的前半句对随机森林是错的方向。
  • 表4 有三列数字,只有“交叉验证均值”那一列是成绩。 “训练折均值”是模型对自己训练数据的回代,0.9199 只说明每棵树把见过的样本记住了;“留出测试集”是另一次随机划分的结果,种子已与交叉验证错开,不是任何一折的副本,但它单次只有 48 条,波动远大于五折均值:本次 0.5086 比表5 里最好的第 2 折(0.4581)还高,而交叉验证均值只有 0.3895。两列也不是互相独立的两次验证:交叉验证跑在全部 240 条上,那 48 条留出样本照样进了各折的训练折。不能拿“两边都不错”当双重证据。
  • 置换重要性是“这个模型的重要性”,不是变量本身的重要性。 本模块的演示输出里,“促销折扣力度”ΔR²=0.0438、95%CI[-0.0271, 0.1077] 跨 0,判为不稳健;而「AdaBoost回归」的演示输出里,同一个变量 ΔR²=0.1407、95%CI[0.0387, 0.2684] 下限大于 0,是稳健贡献者——两边的示例数据由同一套规则生成(都是 240 条,该变量均值均约 20.0、标准差约 5.51),结论却不同。原因是随机森林已经用“广告投入”把它那部分信息吸收掉了,打乱它模型也不太变差。所以卡④ 的排序只能读作“在本次这个模型里谁被用上了”,既不是因果效应,也不等价于回归系数的显著性;卡① 的 VIF 若提示中度以上共线,共线特征之间的重要性还会互相稀释。
  • 随机森林不能外推。 每棵树的预测是叶子里训练样本因变量的平均,因此整片森林的预测恒落在训练集因变量的最小值与最大值之间;当新样本的自变量超出训练范围时,它只会一直落进同一批边界叶子,预测值锁死为一个常数,不再随自变量变化。卡③ 的真实值—预测值散点在两端向均值收缩,就是这件事的直观表现。预测之前先看一眼卡① 表2 的“取值范围”列。
  • 报告里唯一的 p 值与自变量无关。 卡① 表3“因变量分布形态”那行给了 Shapiro-Wilk 的 p(示例为 0.631),检验的是因变量像不像正态;而同一行的说明已写明集成树不要求因变量正态。所以这个 p 既不能用来说“建模前提满足”,更不能拿来说哪个自变量显著。需要显著性检验,回到「线性回归 (最小二乘法)」。

报告里有什么

  1. 输出结果一:数据概览与前提检验
  2. 输出结果二:主结果表(交叉验证性能)
  3. 输出结果三:可视化(逐折性能 / 拟合散点 / 残差)
  4. 输出结果四:效应量与事后分析
  5. 输出结果五:结论与学术表述
逐折验证 R²(5 折)
图1 逐折验证 R²(5 折)
真实值 vs 预测值(留出测试集)
图2 真实值 vs 预测值(留出测试集)
残差 vs 预测值(留出测试集)
图3 残差 vs 预测值(留出测试集)
三张图分别回答:模型在不同数据划分下稳不稳(逐折 R²)、预测值贴不贴近真实值(散点)、误差是否随预测水平系统性变化(残差图)。

在线统计分析平台 · 233 种分析方法 · AI 智能解读

在线使用
使用教程