Я выполняю задачу регрессии случайного леса (RFR) и хочу применить стратегию удаления важности столбца. Основная идея этой стратегии заключается в следующем:
чтобы получить базовую оценку производительности, как и важность перестановки, но затем полностью удалите столбец, переобучите модель и пересчитайте оценка производительности. Тогда значением важности признака является разница между базовым уровнем и оценкой модели отсутствует эта особенность.
Эту стратегию я нашла здесь и здесь.
Как я могу реализовать описанную выше стратегию, используя пакет ranger
, чтобы в итоге получить окончательную модель с наиболее важными предикторами (на основе описанной выше стратегии) и, возможно, распечатать переменные?
library(ranger)
train.idx <- sample(nrow(iris), 2/3 * nrow(iris))
iris.train <- iris[train.idx, ]
iris.test <- iris[-train.idx, ]
rg.iris <- ranger(Species ~ .,
data = iris.train,
num.trees = 101,
importance = "permutation")
Windows 11, R 4.3.3, RStudio 2023.12.1, сборка 402.
Я думаю, вы могли бы написать цикл, чтобы сделать это, но вам нужно будет подумать о том, что вы используете для оценки каждой модели. Вот код, который оценивает точность:
library(ranger)
library(data.table)
data(iris)
setDT(iris)
set.seed(1234)
# Function to assess performance, here based on Accuracy
performance <- function(model, data) {
predictions <- predict(model, data.frame(data))
return(mean(data$Species == predictions$predictions))
}
# Assess performance of baseline model
baseline_model <- ranger(Species ~ ., data = iris)
baseline_performance <- performance(baseline_model, iris)
# Loop to drop columns and assess performance
importance <- c()
for (feature in names(iris)[names(iris) != "Species"]) {
model <- ranger(Species ~ ., data = iris[,!(names(iris) %in% feature), with = FALSE])
performance_without_feature <- performance(model, iris[,!(names(iris) %in% feature), with = FALSE])
importance[feature] <- baseline_performance - performance_without_feature
}
importance
Итак, результаты кода: > importance Sepal.Length Sepal.Width Petal.Length Petal.Width 0.000000000 0.006666667 0.013333333 0.006666667
Я могу сделать вывод, что Sepal.Length неважен. На самом деле меня интересует точность модели на данном этапе.
Итак, создайте свою модель заново, используя только те функции, которые вам нужны, и рассчитайте точность?
Да, как говорит @RYann, вы можете повторно запустить модель с любыми функциями, которые захотите, а затем оценить производительность. Какой порог важности вы решите использовать, является субъективным, поэтому я оставил это на ваше усмотрение. Вы также можете легко изменить цикл, чтобы он сохранял значения performance_without_feature
, если хотите.
Не уверен, что вы сможете сделать это только с помощью
ranger
. Мне кажется, что пакетrandomForest
также понадобится для оценки важности независимых переменных и последующей соответствующей настройки модели.