Как мне узнать RMSE случайного леса в R? - PullRequest
0 голосов
/ 14 марта 2020

Мне нужно узнать СКО случайного леса на основе регрессии.

Во-первых, я использовал эту формулу для случайного леса:

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

Нужно ли делать прогноз на следующем шаге, чтобы выяснить СКО этого? Потому что я сделал бы прогноз с тестовыми данными, а затем использовал бы rmse = (фактический, прогнозируемый), который я скачал из пакета «Метрики». Кроме того, начальное число 12 подходит для данных с 1000 наблюдений. а 20 переменных?

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

В сценарии, где данные разбиты на группы training и test, для расчета root среднеквадратичной ошибки (RMSE) на тестовых данных используется функция predict(), а затем вычисляется RMSE.

Мы будем использовать данные BostonHousing из пакета mlbench для иллюстрации.

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, который соответствует конечному созданному дереву, и взять его квадрат root.

# 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 - это просто квадрат root среднего квадрата ошибок.

# we can calculate it  directly 
sqrt(mean((testing$medv -predValues)^2))

> sqrt(mean((testing$medv -predValues)^2))
[1] 2.944943
>

Кроме того, мы можем загрузить библиотеку Metrics и использовать ее функцию rmse(). Обратите внимание, что он выдает тот же результат, который мы вычислили из базы R.

# compare to Metrics::rmse() function
library(Metrics)
rmse(testing$medv,predValues)

> rmse(testing$medv,predValues)
[1] 2.944943

Что касается вопроса о семени, функция set.seed() фиксирует запуск генератора случайных чисел, чтобы сделать результаты анализа воспроизводимыми. , Это не влияет на «качество» анализа.

Используя set.seed(95014) перед использованием любых функций R, которые обращаются к генератору случайных чисел, любой, кто запускает код из этого ответа, получит точно такие же результаты для rmse(), как они были опубликованы в этом ответе.

0 голосов
/ 15 марта 2020

Да, вам нужно использовать прогнозы в ваших тестовых данных. Я не знаю, в какой момент вы установили свое начальное число, поэтому в приведенном ниже примере я установил начальное значение один раз при разбиении данных на последовательность и тестирование, чтобы этот набор тестов можно было воспроизвести. Другой экземпляр перед запуском randomForest (в конце). Семя для вас, чтобы воспроизвести результаты 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
...