在将数据划分为training 和test 组的情况下,为了计算测试数据的均方根误差(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() 完全相同的结果。