CART 对回归树采用平方误差最小化准则,对分类树用基尼指数最小化准则。

随机森林

我们将使用CART决策树作为弱学习器的bagging方法称为随机森林
mp.weixin.qq.com/s/WDUj6OeKBgvt9dTyBNBd2Q
随机森林
随机森林回归

  1. 抽样
  2. 建立分类器
  3. 投票
    是随机选择样本数,随机选取特征,随机选择分类器,建立多颗这样的决策树,然后通过这几课决策树来投票,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)

随机森林分类效果的影响因素

  • 森林中任意两棵树的相关性:相关性越大,错误率越大;
  • 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
    减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

1.有放回抽取 可以降误差

  1. 关键 最大特征 最大样本数 树的数量
  1. 什么是OOB?随机森林中OOB是如何计算的,它有什么优缺点?
    OOB:
    构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。
    bagging方法中Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中,当然也就没有参加决策树的建立,把这1/3的数据称为袋外数据oob(out of bag),它可以用于取代测试集误差估计方法。

对于已经生成的随机森林,用袋外数据测试其性能,假设袋外数据总数为O,用这O个袋外数据作为输入,带进之前已经生成的随机森林分类器,分类器会给出O个数据相应的分类
因为这O条数据的类型是已知的,则用正确的分类与随机森林分类器的结果进行比较,统计随机森林分类器分类错误的数目,设为X,则袋外数据误差大小=X/O
优缺点:
这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。

  1. 随机森林的过拟合问题
    你已经建了一个有10000棵树的随机森林模型。在得到0.00的训练误差后,你非常高兴。但是,验证错误是34.23。到底是怎么回事?你还没有训练好你的模型吗?
    答:该模型过度拟合,因此,为了避免这些情况,我们要用交叉验证来调整树的数量。

结果解释

  1. No. of variables tried at each split: 2 解释 这就是mtry
  2. 重要性的结果怎么看?
  3. 在打乱 Petal.Length 后,如果模型对 versicolor 的预测准确率下降了 32.29 个点,那么就记为 32.29
           setosa     versicolor virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length   6.58       7.50      7.95                10.59             9.37
Sepal.Width    4.88       1.31      5.33                 5.62             2.57
Petal.Length  22.22      32.29     27.19                32.41            43.63
Petal.Width   22.22      30.73     30.35                32.75            43.69

你运行的是一个经典的可视化操作:将随机森林生成的 proximity matrix(样本间的“相似度”)用 MDS(多维尺度分析) 映射到二维空间,然后和原始特征一起画出一个 pairs 图(散点矩阵图)。

ris.mds <- cmdscale(1 - iris.rf$proximity, eig=TRUE)
  • iris.rf$proximity 是随机森林计算出的样本相似度矩阵(值越大代表两个样本越相似)
  • 1 - proximity 就是距离矩阵
  • cmdscale() 执行经典 MDS,将这个距离映射到二维空间(降维)
  • iris.mds$points 就是每个样本在这个二维空间中的坐标(两个新变量)

你绘制了原始前四个特征(Sepal.Length ~ Petal.Width)加上 MDS 得到的两个坐标,共 6 个维度的两两组合散点图。

pairs(cbind(iris[,1:4], iris.mds$points), ...)
  • iris[,1:4]: 原始4个特征
  • iris.mds$points: MDS降维后的两个维度(叫 MDS1、MDS2)

✅ 每一个小图:

  • 行列的交叉位置就是两个变量的散点图(比如:Petal.Width vs Sepal.Length)

  • 颜色:根据 Species 着色:

    • Setosa → 红色
    • Versicolor → 绿色
    • Virginica → 蓝色

✅ 哪些图是最重要的?

🟡 MDS 与原始变量的图(右下角的几列):

  • 比如:Petal.Length vs MDS1

  • 这些图展示的是:

    MDS降维后形成的结构,是否能反映原始变量中的差异?

🔵 MDS1 vs MDS2:

  • 这通常是右下角最末的那个图

  • 它展示的是:

    随机森林认为样本之间的“群体结构”,不依赖原始特征。

MDS的意义

MDS 的两个维度来自样本间的 proximity → 它揭示了:

随机森林认为的“相似”样本是否能够在二维空间中聚在一起?

所以,如果你看到:

  • 三种颜色在 MDS1 vs MDS2 图中被良好分开 → ✅ 表示随机森林很好地区分了三类花
  • 如果三种颜色混杂 → ❌ 说明模型不够好,或者数据不可分

最后那句:print(iris.mds$GOF) 是什么?

print(iris.mds$GOF)
  • 这会输出 MDS 的拟合优度(Goodness-of-Fit)
  • 输出是一个长度为 2 的数值向量,通常是:
[1] 0.67 0.85

含义是:

  • 第一个值:前两个维度解释的方差占比
  • 第二个值:累积解释方差(即二维的 MDS 能否有效还原距离)

🎯 一般来说:

  • 第一个值 > 0.5:还可以
  • 0.8:说明二维降维是有效的,MDS 图可以反映大部分结构


✅ 总结:你这张图看什么?

你在图中找什么?怎么判断?
MDS 降维结果是否分开三类花?看 MDS1 vs MDS2 图是否有三团颜色
哪些变量能明显区分花种?看哪些原始变量与 MDS 变量有清晰分离
随机森林是否学习了结构?看 GOF 值是否够大,以及 MDS图分布

如果你愿意贴出实际的 MDS 图截图,我可以帮你解读得更具体。是否需要我帮你生成 ggplot2 版本的 MDS 图(更清晰)?

问答

Q1:随机森林如何避免过拟合的?
1. 随机抽取特征
2. 随机抽取样本
Q2:tree的数量影响什么?

tree 越多越精确和稳定,和过拟合无关

Q3:超参加mtry影响什么?

mtry决定选择特征的多少进行分裂,越小,每个树之间的差异越明显, 需要的树越多。越多,有过拟合的风险

Q4:如果样本不平衡 需要开启wight的参数
如果样本不平衡,可通过 classwt 或 sampsize 进行类别平衡。weights 仅用于采样阶段。

Q5: OOB的置换检验的什么?

置换检验的特征

Q6:相关的评价指标有哪些?
对于回归树,可以看到多少的时候树比较稳定

plot(ozone.rf)

随机森林使用CART(Classification and Regression Trees)的方法使用Gemi,而不是熵进行衡量效果。随机森林是样本随机 特征随机的集成算法,其中使用OOB衡量树的效果。注意随机:(决策过程中没有剪枝)
mp.weixin.qq.com/s/WDUj6OeKBgvt9dTyBNBd2Q

随机森林P值

优点:

  • 它能够处理很高维度(feature很多)的数据,并且不用做特征选择(因为特征子集是随机选择的)。
  • 在训练完后,它能够给出哪些feature比较重要。
  • 训练速度快,容易做成并行化方法(训练时树与树之间是相互独立的)。
  • 在训练过程中,能够检测到feature间的互相影响。
  • 对于不平衡的数据集来说,它可以平衡误差。
  • 如果有很大一部分的特征遗失,仍可以维持准确度。

缺点:

  • 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
  • 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。

分类
回归
聚类
异常检测
机器学习 Boosting and Bagging
如果有一些特征预测目标值的能力很强,那么这些特征就会被许多树所选择,这样就会导致树的强相关性
,对于一个包含 p 个特征的分类问题,可以在每次划分时使用
p
{\displaystyle {\sqrt {p}}} 个特征[5]:592。对于回归问题,作者推荐 p/3 但不少于 5 个特征

Site Unreachable
sklearn基础篇(七)— 随机森林(Random forest)_sklearn随机森林-CSDN博客
图解机器学习 | 随机森林分类模型详解
图解机器学习 | 随机森林分类模型详解

这是个非常核心又经常被忽视的问题!我们来详细、直观地解释:


✅ 问题:随机森林是如何计算 proximity 的?


🌳 Proximity 是什么?

在随机森林中,proximity(接近度) 是一个衡量两个样本“相似程度”的数值,范围是 [0, 1]:

  • proximity(i, j) = 1 表示样本 i 和 j 非常相似(它们总是在同一个终端节点里)
  • = 0 表示完全不相似(从不一起出现)

🧠 直观理解:

“两个样本,如果在很多棵树里都落到了同一个叶子节点中,那么它们就很接近”

就像你问了一百个专家(每棵树),他们大多数都说“这两个人很像”,那我们就认为他们接近。


🛠️ 具体计算过程

假设你训练了一个 randomForest 模型,有 ntree = 100 棵树,训练集有 n = 150 个样本。

🧮 Proximity matrix 构建流程:

  1. 初始化一个 n × n 的矩阵 P,所有元素设为 0

  2. 对每一棵树:

    • 找出每个样本在这棵树中落在哪个叶子节点
    • 对于落在同一个叶子节点的样本对 (i, j),P[i, j] += 1
  3. 所有树都处理完后:

    • 把 P[i, j] 除以 ntree,即:
  4. 最终得到一个对称的 n × n 的 proximity 矩阵


✅ 小示例说明

假设只训练了 3 棵树,样本编号 1~5:

树号叶子节点A叶子节点B叶子节点C
树11, 23, 45
树21, 2, 53, 4
树31, 32, 4, 5
  • 样本 1 和 2:树1同叶子,树2同叶子,树3不同 → 2/3 = 0.666
  • 样本 3 和 4:树1同叶子,树2同叶子,树3不同 → 2/3 = 0.666
  • 样本 1 和 3:树3同叶子,其他不同 → 1/3 = 0.333

依此类推构建矩阵。


🧪 用途:为什么要用 proximity?

随机森林的 proximity 是一个无监督的样本相似性度量,可用于:

用途说明
MDS 降维利用 proximity 做距离矩阵,执行 cmdscale() 映射到 2D 空间
异常检测与“多数人不一样”的样本,其 proximity 值普遍低,可被检测为 outlier
聚类分析利用 proximity 做样本聚类,而不是用欧几里得距离
数据可视化用颜色 + proximity 的 MDS 图显示样本结构

✅ 总结一句话:

随机森林中的 proximity 是通过统计“两个样本落在同一个叶子节点的频率”来衡量相似性。

它是“模型感知的样本相似度”,比传统距离更适合处理非线性、高维数据。


需要我帮你可视化 proximity 矩阵(热图或 MDS 图)吗?你也可以把 iris.rf$proximity 打印前几行来看一下。

在随机森林(Random Forest)中,特征重要性(Feature Importance)的计算主要有 两种方法:

  1. %IncMSE(Increase in Mean Squared Error,回归任务)
  2. IncNodePurity(Increase in Node Purity,分类任务,通常基于 Gini 不纯度或信息增益)

而 OOB(Out-of-Bag)误差 也可以用于特征重要性评估(如置换重要性,Permutation Importance),但 randomForest 默认使用 %IncMSE 和 IncNodePurity,原因如下:


1. %IncMSE 和 IncNodePurity 的计算方式

(1) %IncMSE(回归任务)

  • 原理:

    • 对每个特征 X_j,计算其在 OOB 样本 上的预测误差(MSE)。
    • 然后 随机打乱 X_j 的值(破坏特征与目标的关系),重新计算 MSE。
    • %IncMSE = (MSE_permuted - MSE_original) / MSE_original * 100%
    • 值越大,说明该特征越重要(因为打乱后误差增加越多)。
  • 优点:

    • 直接衡量 特征对预测误差的影响,解释性强。
    • 适用于 回归问题(因为基于 MSE)。

(2) IncNodePurity(分类任务,通常基于 Gini 不纯度)

  • 原理:

    • 计算 所有树中,该特征在分裂节点时减少的 Gini 不纯度(或信息增益)的总和。
    • IncNodePurity = Σ (Gini 分裂收益)
    • 值越大,说明该特征在分类时贡献越大。
  • 优点:

    • 计算效率高(不需要额外的 OOB 预测)。
    • 适用于 分类问题(因为基于 Gini 不纯度或熵)。

2. 为什么不直接用 OOB 误差计算重要性?

OOB 误差本身可以用于计算 置换重要性(Permutation Importance),但 randomForest 默认使用 %IncMSE 和 IncNodePurity,原因包括:

(1) %IncMSE 和 IncNodePurity 计算更快

  • IncNodePurity 在训练过程中 直接计算(无需额外 OOB 预测)。
  • %IncMSE 虽然依赖 OOB 样本,但 仅需一次预测 + 一次置换,计算量可控。
  • 而 纯 OOB 置换重要性 需要 多次置换 + 预测,计算成本更高(尤其是大数据集)。

(2) IncNodePurity 更稳定

  • IncNodePurity 基于 所有树的分裂情况,受随机性影响较小。
  • 而 OOB 置换重要性 依赖于 OOB 样本的随机性,可能波动较大(特别是小数据集)。

(3) %IncMSE 更适用于回归

  • OOB 误差本身可以用于回归和分类,但 %IncMSE 是 专门针对回归任务优化的指标(基于 MSE)。
  • 而 IncNodePurity 更适合分类任务(基于 Gini/熵)。

3. 什么时候应该使用 OOB 置换重要性?

虽然 randomForest 默认不直接使用 OOB 误差计算重要性,但 OOB 置换重要性 仍然是一个强大的方法,适用于:

  1. 需要更鲁棒的特征重要性评估(因为 IncNodePurity 可能偏向高基数特征)。
  2. 对比不同模型的特征重要性(因为 OOB 置换重要性与模型无关,可用于任何基于 OOB 的集成方法)。
  3. 数据量较小,计算成本可以接受(OOB 置换需要额外计算)。

在 R 中,可以使用 importance(..., type=1) 计算 OOB 置换重要性:

# 计算基于 OOB 置换的重要性(分类任务)
importance(iris.rf, type=1)  # type=1 表示 MeanDecreaseAccuracy(OOB 置换)
 
# 计算基于 %IncMSE 的重要性(回归任务)
importance(iris.rf, type=2)  # type=2 表示 %IncMSE

4. 总结

方法适用任务计算方式优点缺点
%IncMSE回归基于 OOB 误差变化直接衡量特征对预测的影响计算稍慢
IncNodePurity分类基于 Gini 不纯度减少计算快,稳定可能偏向高基数特征
OOB 置换重要性分类/回归基于 OOB 误差变化更鲁棒,模型无关计算成本高

默认情况下,randomForest 使用 %IncMSE(回归)和 IncNodePurity(分类),因为:

  1. 计算效率高(尤其是 IncNodePurity)。
  2. 解释性强(%IncMSE 直接反映特征对误差的影响)。
  3. 适用于不同任务(回归 vs 分类)。

但如果需要更稳健的特征重要性评估,可以额外计算 OOB 置换重要性(importance(..., type=1))。