首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机森林分类器是否需要验证集?

随机森林分类器是否需要验证集?
EN

Data Science用户
提问于 2019-10-08 09:47:51
回答 3查看 9.6K关注 0票数 9

使用随机森林分类器时是否需要有训练、测试和验证集?

我知道它对神经网络很重要,但我不理解它对射频的重要性。我知道有第三组看不见的数据来测试是非常重要的,尤其是使用神经网络,但在RF中,你似乎几乎没有测试或验证数据(我知道在实践中这是不正确的),但理论上,因为森林中的每一棵树都使用了训练数据集的随机样本(替换)。

目前,我遗漏了大约250个样本,因为它们无法从火车和测试集中看到,而且我知道模型会随着额外的数据而改进,那么是否有可能只进行培训和测试,而不指定一个独立的验证集,同时仍然有一个可靠的模型?

EN

回答 3

Data Science用户

回答已采纳

发布于 2019-10-08 13:28:09

是否有可能只有培训和测试,而不是指定一个单独的验证集,同时仍然有一个可靠的模型?

好的!您可以在训练集上训练RF,然后在测试集上进行测试。只要模型在培训期间没有看到任何测试数据,这是完全有效的。(或者,更好的是,您可以运行交叉验证,因为RFs是快速培训)

但是,如果您想要调优模型的超参数或进行任何正则化(比如修剪),那么您将需要一个验证集。使用训练集训练,使用验证集进行调优,然后用测试集生成精度估计。

票数 8
EN

Data Science用户

发布于 2019-10-08 16:41:10

如果缺少数据,您可以使用“凭据错误”作为验证错误。

正如您可能知道的,随机森林适合多个决策树,而对于每一棵树,它只适合于一个数据子集。因此,未用于拟合给定树的数据被从包数据中调用,并且可以用作验证集1

Python中的Sklearn有一个超参数,它是一个不需要处理的错误。

票数 4
EN

Data Science用户

发布于 2020-12-14 19:42:42

现有的答案是不错的,但这里有更多的细节。在他发明随机森林的那张纸中,Breiman将公开计算作为交叉验证的一种替代方法:

因此,使用外泄错误估计不需要留出测试集.

在同一篇论文中,他说OOB可能比简历更可取:

...unlike交叉验证,在存在偏见但其范围未知的情况下,公开的估计是无偏的。

这里有一个更具体的例子。让我们来训练一个基于此数据集的随机森林。

代码语言:javascript
复制
library(conflicted)
library(tidyverse)
library(tidymodels)
library(ranger)
col_factor <- readr::col_factor
telco_raw <- read_csv(
  "archive.zip",
  col_types = cols(
    Churn = col_factor(levels = c("Yes",
                                  "No")),
    Dependents = col_factor(levels = c("Yes",
                                       "No")),
    PaperlessBilling = col_factor(levels = c("Yes",
                                             "No")),
    Partner = col_factor(levels = c("Yes",
                                    "No")),
    PhoneService = col_factor(levels = c("Yes",
                                         "No")),
    SeniorCitizen = col_factor(levels = c("0",
                                          "1")),
    customerID = col_skip(),
    gender = col_factor(levels = c("Female",
                                   "Male"))
  )
) %>% 
  na.omit()

telco <- initial_split(telco_raw, prop = 0.8, strata = Churn)
telco_train <- training(telco)
# Since we're only running this once, we can combine testing and assessment
telco_test <- rbind(testing(telco), assessment(telco))

model_ranger <- ranger(Churn ~ ., data = telco_train)

从公开的数据中得到的准确性是多少?换句话说,使用从每棵树的训练中排除的数据,模型的准确性是多少?

代码语言:javascript
复制
# OOB accuracy
1 - model_ranger$prediction.error
#0.7965168

大约80%。

模型在整个训练数据集上的准确性如何?

代码语言:javascript
复制
# Training data accuracy
accuracy_vec(truth = telco_trainChurn, estimate = model_ranger#qcStackCode#predictions)
#0.7965168

完全一样!好吧,但是重要的交叉验证的准确性呢?

代码语言:javascript
复制
# CV accuracy
accuracy_vec(truth = telco_testChurn, predict(model_ranger, data = telco_test)#qcStackCode#predictions)
#0.7921708

它有点低,但非常接近我们在训练数据中所看到的。

如果您只训练一次模型而不尝试对其进行调优,您可以使用所有的数据来训练一个随机森林。当我在工作时,我仍然使用简历有三个原因:

  1. 我用一种特定于培训数据的方式来调整模型。
  2. 通常,我正在对旧数据进行培训,并希望我的模型能够处理将来将要生成的数据。我拿出了最新的测试数据。例如,我可能会对日期在3到24个月前的数据进行培训,并使用最后两个月进行测试/验证。在这种情况下,我想解释的事实是,“偏见是存在的,但它的程度未知”的数据。
  3. 我喜欢能够比较模型苹果和苹果,所以我使用相同的数据和相同的测试对我的每一个模型。能够在所有模型类型中获得完全相同的度量是很好的。
票数 4
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/61418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档