Случайный лесной регресс - кумулятивный MSE - PullRequest
1 голос
/ 16 марта 2019

Я новичок в Случайных Лесах, и у меня есть вопрос о регрессии. Я использую пакет случайных чисел R для расчета моделей RF.

Моя конечная цель - выбрать наборы переменных, важных для прогнозирования непрерывного признака, поэтому я вычисляю модель, затем удаляю переменную с наименьшим средним снижением точности, вычисляю новую модель и т. Д. , Это работало с классификацией RF, и я сравнил модели, используя ошибки OOB из прогнозирования (обучающий набор), наборов данных разработки и проверки. Теперь с регрессией я хочу сравнить модели на основе объяснения% отклонения и MSE.

Я оценивал результаты для MSE и объяснил% var, и я получал точно такие же результаты при расчете вручную с использованием прогноза из model$predicted. Но когда я делаю model$mse, представленное значение соответствует значению MSE для последнего вычисленного дерева, и то же самое происходит для объясненного% var.

В качестве примера вы можете попробовать этот код в R:

library(randomForest)
data("iris")
head(iris)

TrainingX<-iris[1:100,2:4] #creating training set - X matrix
TrainingY<-iris[1:100,1]  #creating training set - Y vector

TestingX<-iris[101:150,2:4]  #creating test set - X matrix
TestingY<-iris[101:150,1]  #creating test set - Y vector

set.seed(2)

model<-randomForest(x=TrainingX, y= TrainingY, ntree=500, #calculating model
                    xtest = TestingX, ytest = TestingY)

#for prediction (training set)

pred<-model$predicted

meanY<-sum(TrainingY)/length(TrainingY)

varpY<-sum((TrainingY-meanY)^2)/length(TrainingY)

mseY<-sum((TrainingY-pred)^2)/length(TrainingY)

r2<-(1-(mseY/varpY))*100

#for testing (test set)

pred_2<-model$test$predicted

meanY_2<-sum(TestingY)/length(TestingY)

varpY_2<-sum((TestingY-meanY_2)^2)/length(TestingY)

mseY_2<-sum((TestingY-pred_2)^2)/length(TestingY)

r2_2<-(1-(mseY_2/varpY_2))*100

training_set_mse<-c(model$mse[500], mseY)
training_set_rsq<-c(model$rsq[500]*100, r2)
testing_set_mse<-c(model$test$mse[500],mseY_2)
testing_set_rsq<-c(model$test$rsq[500]*100, r2_2)

c<-cbind(training_set_mse,training_set_rsq,testing_set_mse, testing_set_rsq)
rownames(c)<-c("last tree", "by hand")
c
model

В результате после выполнения этого кода вы получите таблицу, содержащую значения для MSE и пояснения% var (также называемые rsq). Первая строка называется «последним деревом» и содержит значения MSE и% var, объясненные для 500-го дерева в лесу. Вторая строка называется «вручную» и содержит результаты, рассчитанные в R на основе векторов model$predicted и model$test$predicted.

Итак, мои вопросы:

1- Являются ли прогнозы деревьев как-то совокупными? Или они независимы друг от друга? (Я думал, что они независимы)

2- Является ли последнее дерево средним среди всех остальных?

3- Почему MSE и% var объясняются для модели RF (представленной на основной плате при вызове model) так же, как модели из 500-го дерева (см. Первую строку таблицы)? Содержат ли векторы model$mse или model$rsq кумулятивные значения?

После последнего редактирования я нашел этот пост от Энди Лиу (одного из создателей пакета), в котором говорится, что MSE и% var объяснены на самом деле кумулятивно !: https://stat.ethz.ch/pipermail/r-help/2004-April/049943.html.

1 Ответ

0 голосов
/ 16 марта 2019

Не уверен, что понимаю вашу проблему;Я все же попробую ...

1- Являются ли прогнозы деревьев как-то кумулятивными?Или они независимы друг от друга?(Я думал, что они независимы)

Вы правильно подумали;деревья подгоняются независимо друг от друга, поэтому их предсказания действительно независимы.Фактически, это является ключевым преимуществом моделей RF, так как оно допускает параллельные реализации.

2- Является ли последнее дерево средним среди всех остальных?

Нет ;как пояснено выше, все деревья являются независимыми.

3- Если каждое дерево получает прогноз, как я могу получить матрицу со всеми деревьями, так как мне нужно этоMSE и% var объяснены для леса?

Вот где то, что вы спрашиваете, становится действительно неясным, учитывая ваш код выше;MSE и r2, которые, как вы говорите, вам нужны, - это именно то, что вы уже вычисляете в mseY и r2:

mseY
[1] 0.1232342

r2
[1] 81.90718

, которые, что неудивительно, - это те же самые значения, о которых сообщают model:

model
# result:

Call:
 randomForest(x = TrainingX, y = TrainingY, ntree = 500) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 1

          Mean of squared residuals: 0.1232342
                    % Var explained: 81.91

, поэтому я не уверен, что могу реально увидеть вашу проблему или то, что эти значения имеют отношение к "матрице со всеми деревьями" ...

Но когдаЯ делаю model$mse, представленное значение соответствует значению MSE для последнего вычисленного дерева, и то же самое происходит для объясненного% var.

Скорее всего не : model$mse - это вектор длины, равный количеству деревьев (здесь 500), содержащий MSE для каждого отдельного дерева; (см. ОБНОВЛЕНИЕ ниже). Я никогда не видел такого применения на практике (аналогично дляmodel$rsq):

length(model$mse)
[1] 500

length(model$rsq)
[1] 500

ОБНОВЛЕНИЕ : Престижность самой ФП (см. Комментарии), которая обнаружила, что величины в model$mse и model$rsq действительно совокупный (!);из старой (2004 г.) ветки сопровождающего пакета Энди Лайу, Извлечение MSE и% дисперсии из RandomForest :

Несколько способов:

  1. Читать? randomForest, особенно раздел `Value '.
  2. Посмотрите на str (myforest.rf).
  3. Посмотрите на print.randomForest.

Если лес имеет100 деревьев, затем mse и rsq - векторы с 100 элементами в каждом, i-й элемент - это mse (или rsq) леса, состоящего из первых i деревьев.Таким образом, последний элемент - это mse (или rsq) всего леса.

...