【问题标题】:How do I find out the RMSE of a random forest in R?如何在 R 中找出随机森林的 RMSE?
【发布时间】:2020-06-26 09:05:24
【问题描述】:

我需要根据回归找出随机森林的 RMSE。

首先,我将这个公式用于随机森林:

randomForest(price ~ ., type = "regression", data = train.data, ntree  = 400,
             mtry = 20)

我是否需要在进一步的步骤中进行预测以找出其 RMSE?因为我会使用测试数据进行预测,然后使用我从包“Metrics”下载的 rmse = (actual, predicted)。此外,12 的种子是否适合具有 1000 个 obs 的数据。和 20 个变量?

【问题讨论】:

    标签: r tree random-forest


    【解决方案1】:

    是的,您需要对测试数据使用预测。我不知道你是在什么时候设置种子的,所以在下面的示例中,我在将数据拆分为训练和测试时设置了一次种子,以便可以复制这个训练、测试集。另一个实例是在运行 randomForest 之前(在 lapply 中)。种子是为了让你重现 randomForest 的结果。

    例如:

    library(randomForest)
    library(MASS)
    data = Boston
    set.seed(999)
    trn = sample(nrow(data),400)
    traindata = data[trn,]
    testdata = data[-trn,]
    
    res = lapply(c(111,222),function(i){
    set.seed(i)
    fit = randomForest(medv ~.,data=traindata)
    
    pred_values = predict(fit,testdata)
    actual_values = testdata$medv
    
    data.frame(seed=i,
    metrics_rmse = rmse(pred_values,actual_values),
    cal_rmse = mean((pred_values-actual_values)^2)^0.5
    )
    })
    
    res = do.call(rbind,res)
    head(res)
    
      seed metrics_rmse cal_rmse
    1  111     4.700245 4.700245
    2  222     4.742978 4.742978
    

    【讨论】:

      【解决方案2】:

      在将数据划分为trainingtest 组的情况下,为了计算测试数据的均方根误差(RMSE),使用predict() 函数然后计算RMSE。

      我们将使用mlbench 包中的BostonHousing 数据进行说明。

      library(randomForest)
      library(mlbench)
      library(caret) # use createDataPartition() function 
      set.seed(95014)
      data(BostonHousing)
      
      # partition based on whether house is adjacent to Charles River 
      inTraining <- createDataPartition(BostonHousing$chas, p = 0.6, list=FALSE)
      training <- BostonHousing[inTraining,]
      testing <- BostonHousing[-inTraining,]
      
      fit <- randomForest(medv ~ ., training, ntree=30, type="regression")
      

      生成模型后,我们可以通过打印模型输出来查看training 数据集中的均方误差。

      fit
      
      > fit
      
      Call:
       randomForest(formula = medv ~ ., data = training, ntree = 30,      type = "regression") 
                     Type of random forest: regression
                           Number of trees: 30
      No. of variables tried at each split: 4
      
                Mean of squared residuals: 16.90869
                          % Var explained: 81.51
      

      为了计算 RMSE,我们还可以提取 fit$mse 的最后一个元素,它对应于最终创建的树,并取其平方根。

      # obtain MSE as of last element in fit$mse
      # which should match the output from printout
      fit$mse[length(fit$mse)]
      # take square root to calculate RMSE for the model
      sqrt(fit$mse[length(fit$mse)])
      
      
      > fit$mse[length(fit$mse)]
      [1] 16.90869
      > sqrt(fit$mse[length(fit$mse)])
      [1] 4.112018
      

      要计算测试数据的 RMSE,我们需要首先生成预测值。

      # now illustrate how to calculate RMSE on test data vs. training data
      predValues <- predict(fit,testing)
      

      RMSE 只是平方误差平均值的平方根。

      # we can calculate it  directly 
      sqrt(mean((testing$medv -predValues)^2))
      
      > sqrt(mean((testing$medv -predValues)^2))
      [1] 2.944943
      >
      

      或者,我们可以加载Metrics 库并使用它的rmse() 函数。请注意,它产生的结果与我们从 Base R 计算的结果相同。

      # compare to Metrics::rmse() function
      library(Metrics)
      rmse(testing$medv,predValues)
      
      > rmse(testing$medv,predValues)
      [1] 2.944943
      

      关于种子的问题,set.seed() 函数修复了随机数生成器的启动,以使分析结果可重现。它不会影响分析的“质量”。

      通过在使用任何访问随机数生成器的 R 函数之前使用 set.seed(95014),运行此答案中的代码的任何人都将收到与在此答案中发布的 rmse() 完全相同的结果。

      【讨论】:

        猜你喜欢
        • 2021-03-25
        • 2022-01-16
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2018-01-18
        • 2015-10-19
        • 2020-02-25
        相关资源
        最近更新 更多