Выбор переменной в Случайном лесу и точность прогноза - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть набор данных поперечного сечения, повторенный за 2 года, 2009 и 2010 гг. Я использую первый год (2009 г.) в качестве учебного набора для подготовки случайного леса к проблеме регрессии, а второй год (2010 г.) как набор тестов.

Загрузка данных

df <- read.csv("https://www.dropbox.com/s/t4iirnel5kqgv34/df.cv?dl=1")

После обучения Случайного леса в 2009 году значение переменной указывает, что переменная x1 является наиболее важной.

Случайный лес с использованием всех переменных

set.seed(89)
rf2009 <- randomForest(y ~ x1 + x2 + x3 + x4 + x5 + x6,
                         data = df[df$year==2009,], 
                         ntree=500,
                         mtry = 6,
                         importance = TRUE)
print(rf2009)

Call:
 randomForest(formula = y ~ x1 + x2 + x3 + x4 + x5 + x6, data = df[df$year ==      2009, ], ntree = 500, mtry = 6, importance = TRUE) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 6

          Mean of squared residuals: 5208746
                    % Var explained: 75.59

Важность переменной

imp.all <- as.data.frame(sort(importance(rf2009)[,1],decreasing = TRUE),optional = T)
names(imp.all) <- "% Inc MSE"
imp.all

% Inc MSE
x1 35.857840
x2 16.693059
x3 15.745721
x4 15.105710
x5  9.002924
x6  6.160413

Затем я перехожу к тестовому набору и получаю следующие метрики точности.

Прогнозирование и оценка на тестовом наборе

test.pred.all <- predict(rf2009,df[df$year==2010,])
RMSE.forest.all <- sqrt(mean((test.pred.all-df[df$year==2010,]$y)^2))
RMSE.forest.all
[1] 2258.041

MAE.forest.all <- mean(abs(test.pred.all-df[df$year==2010,]$y))
MAE.forest.all
[1] 299.0751

Когда я затем обучаю модель без переменной x1, которая была наиболее важной, как указано выше, и Примените обученную модель к тестовому набору, я наблюдаю следующее:

  • дисперсия, объясненная x1, выше, чем без x1, как и ожидалось

  • но RMSE для т Данные теста лучше без x1 (RMSE: 2258.041 с x1 против 1885.462 без x1)

  • тем не менее MAE немного лучше с x1 (299.0751) и без него (302.3382).

Случайный лес, исключая x1

rf2009nox1 <- randomForest(y ~ x2 + x3 + x4 + x5 + x6,
                       data = df[df$year==2009,], 
                       ntree=500,
                       mtry = 5,
                       importance = TRUE)
print(rf2009nox1)

Call:
 randomForest(formula = y ~ x2 + x3 + x4 + x5 + x6, data = df[df$year ==      2009, ], ntree = 500, mtry = 5, importance = TRUE) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 5

          Mean of squared residuals: 6158161
                    % Var explained: 71.14

Переменная важность

imp.nox1 <- as.data.frame(sort(importance(rf2009nox1)[,1],decreasing = TRUE),optional = T)
names(imp.nox1) <- "% Inc MSE"
imp.nox1

   % Inc MSE
x2 37.369704
x4 11.817910
x3 11.559375
x5  5.878555
x6  5.533794

Прогнозирование и оценка на тестовом наборе

test.pred.nox1 <- predict(rf2009nox1,df[df$year==2010,])
RMSE.forest.nox1 <- sqrt(mean((test.pred.nox1-df[df$year==2010,]$y)^2))
RMSE.forest.nox1
[1] 1885.462

MAE.forest.nox1 <- mean(abs(test.pred.nox1-df[df$year==2010,]$y))
MAE.forest.nox1
[1] 302.3382

Мне известно, что значение переменной относится к модели обучения, а не к тестовой, но означает ли это, что переменная x1 должна не быть включенным в модель?

Итак, я должен включить x1 в модель?

1 Ответ

1 голос
/ 01 мая 2020

Я думаю, вам нужно больше информации о производительности модели. Только с одним тестовым образцом вы могли бы много предположить, почему RMSE лучше без x1, хотя x1 имеет наибольшее значение. Может быть корреляция между переменными или объяснение от шума в наборе поездов.

Чтобы получить больше информации, я бы порекомендовал посмотреть на ошибку «из пакета» и выполнить оптимизацию гиперпараметров с перекрестной проверкой. Если вы видите то же поведение после тестирования разных наборов тестовых данных, вы можете провести перекрестную проверку с x1 и без него.

Надеюсь, что это полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...