在R中构建单个决策树时是否需要set.seed()?

问题描述 投票:0回答:1

我正在学习如何在 R 中构建单个决策树和随机森林。我知道在构建随机森林之前需要 set.seed() 以确保结果的可重复性,例如如果有人使用我的代码,他们将得到相同的输出,因为将生成相同的随机森林树。

但是,由于单个决策树仅基于一棵树,因此在构建它之前我还需要使用 set.seed() 吗?当使用相同的代码和数据集时,无论我是否使用 set.seed() ,生成的树并不总是相同吗?

我使用以下方法构建了一个决策树:

> tree <- rpart(Kyphosis ~ ., method='class', data=kyphosis)
> printcp(tree)

我尝试过在前一行中添加或不添加 set.seed(101) 来运行此脚本。在这两种情况下我都得到相同的输出:

Classification tree:
rpart(formula = Kyphosis ~ ., data = kyphosis, method = "class")

Variables actually used in tree construction:
[1] Age   Start

Root node error: 17/81 = 0.20988

n= 81 

CP nsplit rel error xerror    xstd
1 0.176471      0   1.00000 1.0000 0.21559
2 0.019608      1   0.82353 1.0588 0.22010
3 0.010000      4   0.76471 1.0588 0.22010

所以看来 set.seed() 是不需要的,但是任何人都可以帮助我理解我的说法是否正确,以及这个想法背后的基本原理是什么?谢谢!

附注我确实知道单个决策树一般来说不是很理想(与随机森林相比),但仍然很好奇

r random-forest decision-tree random-seed
1个回答
0
投票

对于使用 rpart() 的单个决策树:

您不需要 set.seed() 来进行基本的树结构,因为 rpart() 在构建主树结构时是确定性的 但是,如果您是以下情况,则确实需要 set.seed():

  • 使用交叉验证(rpart 中的默认值)

  • 将数据随机分成训练/测试集

  • 在分析中使用任何随机抽样

所以在你的具体例子中:

rCopytree <- rpart(Kyphosis ~ ., method='class', data=kyphosis)

输出中的 xerror 列来自交叉验证,其中涉及随机采样。这就是为什么在没有 set.seed() 的情况下运行之间可能会得到略有不同的 xerror 值。

无论如何,最佳实践是使用 set.seed(),因为它可以确保分析的各个方面的完全可重复性,即使您稍后添加交叉验证或采样步骤也是如此。

随机森林始终需要 set.seed(),因为它们依赖于每次分割时的观察(装袋)和特征的随机采样。

© www.soinside.com 2019 - 2024. All rights reserved.