【问题标题】:Why am I getting an error related to seeds?为什么我收到与种子相关的错误?
【发布时间】:2020-12-12 20:21:05
【问题描述】:

我使用这个question中的一个例子

train$`1stFlrSF`<-train$S1stFlrSF 
train$`2ndFlrSF`<-train$S2ndFlrSF
train$`3SsnPorch`<-train$S3SsnPorch

library("randomForest")
set.seed(1)
rf.model <- randomForest(SalePrice ~ ., 
                         data = train,
                         ntree = 50,
                         nodesize = 5,
                         mtry = 2,
                         importance = TRUE, 
                         metric = "RMSE")

library("caret")
caret.oob.model <- train(train[,-ncol(train)], train$SalePrice, 
                         method = "rf",
                         ntree = 50,
                         tuneGrid = data.frame(mtry = 2),
                         nodesize = 5,
                         importance = TRUE, 
                         metric = "RMSE",
                         trControl = trainControl(method = "oob", seed = 1),
                         allowParallel = FALSE) 

但是在caret.oob.model有一个错误

错误:坏种子:种子对象应该是一个长度为 2 的列表,其中包含 1 个大小为 1 的整数向量,最后一个列表元素至少有一个整数。

这是我的数据集https://drive.google.com/file/d/1el-gAgA93EbYnM6VnDqzhT5c5uWsnKvq/view?usp=sharing

我该如何解决这个问题?

【问题讨论】:

  • train[,-ncol(train)] 应该做什么?
  • @dvd280 除 SalePrice 以外的所有变量
  • 请务必阅读?trainControl 帮助页面。有一个关于seeds=参数的讨论。
  • @Ekaterina 是 SalesPrice 数据框中的最后一列?
  • trainControl 的帮助页面说“一组可选的整数,用于在每次重采样迭代时设置种子。这在模型并行运行时很有用。”。为什么不在运行 coed 之前删除, seed = 1 部分并使用set.seed(1)

标签: r random-forest r-caret


【解决方案1】:

randomForest 是一种随机算法,它依赖于行和列的采样。设置 RNG 种子可以得到可重复的结果。对于randomForest,在调用训练函数之前只需一个种子就足够了。在插入符号中,由于重新采样以及拟合多个模型的事实,事情变得更加复杂。

在您的情况下,即使没有重新采样,您也正在拟合两个模型,一个用于对 mtry 超参数和最终模型的 OOB 评估。

?trainControl 的帮助页面指出,seeds 参数是一组可选的整数,将用于在每次重采样迭代时设置种子。

它被指定为 B+1 个元素的列表,其中 B 是重采样数(“boot632”方法除外)。列表的前 B 个元素应该是长度为 M 的整数向量,其中 M 是正在评估的模型数(在您的情况下为 1)。列表的最后一个元素只需要是一个整数(用于最终模型)。

例子:

library(randomForest)
library(caret)

data(mtcars)

set.seed(1)
rf.model <- randomForest(mpg ~ ., 
                         data = mtcars,
                         ntree = 50,
                         nodesize = 5,
                         mtry = 2,
                         importance = TRUE, 
                         metric = "RMSE")

rf.model

Call:
 randomForest(formula = mpg ~ ., data = mtcars, ntree = 50, nodesize = 5,      mtry = 2, importance = TRUE, metric = "RMSE") 
               Type of random forest: regression
                     Number of trees: 50
No. of variables tried at each split: 2

          Mean of squared residuals: 7.353122
                    % Var explained: 79.1

caret.oob.model <- train(mpg ~ ., 
                         data = mtcars, 
                         method = "rf",
                         ntree = 50,
                         tuneGrid = data.frame(mtry = 2),
                         nodesize = 5,
                         importance = TRUE, 
                         metric = "RMSE",
                         trControl = trainControl(method = "oob", seeds = list(1, 1))) 

caret.oob.model$finalModel

Call:
 randomForest(x = x, y = y, ntree = 50, mtry = param$mtry, nodesize = 5,      importance = TRUE) 
               Type of random forest: regression
                     Number of trees: 50
No. of variables tried at each split: 2

          Mean of squared residuals: 7.353122
                    % Var explained: 79.1

在我看来,基于完全相同的Mean of squared residuals% Var explained 的模型是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多