Выбор переменной в случайном лесу и точность прогноза
У меня есть набор данных поперечного сечения, повторяющийся в течение 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 ответ
Думаю, вам нужно больше информации о характеристиках модели. Имея только один тестовый образец, вы можете много размышлять, почему RMSE лучше без x1, хотя x1 имеет наибольшее значение. Это может быть корреляция между переменными или объяснение шума в поезде.
Чтобы получить больше информации, я бы порекомендовал взглянуть на ошибку вне пакета и выполнить оптимизацию гиперпараметров с перекрестной проверкой. Если вы видите такое же поведение после тестирования разных наборов тестовых данных, вы можете выполнить перекрестную проверку с x1 и без него.
Надеюсь, это поможет