Как найти самые важные переменные в R

Найдите наиболее важные переменные, которые в наибольшей степени влияют на переменную ответа.

Выбор наиболее важных переменных-предикторов, которые объясняют большую часть дисперсии переменной отклика, может быть ключевым для определения и построения высокоэффективных моделей.

1. Метод случайного леса

Случайный лес может быть очень эффективным для поиска набора предикторов, который лучше всего объясняет дисперсию переменной отклика.

library(caret)
library(randomForest)
library(varImp)
regressor <- randomForest(Target ~ . , data       ​= data, importance=TRUE) # fit the random forest with default parameter
varImp(regressor) # get variable importance, based on mean decrease in accuracy
varImp(regressor, conditional=TRUE) # conditional=True, adjusts for correlations between predictors
varimpAUC(regressor) # more robust towards class imbalance.

2. Метод xgboost

library(caret)
library(xgboost)
regressor=train(Target~., data        ​= data, method = "xgbTree",trControl = trainControl("cv", number = 10),scale=T)
varImp(regressor)

3.Метод относительной важности

Используя calc.relimp {relaimpo}, можно определить относительную важность переменных, подаваемых в модель lm, в виде относительного процента.

library(relaimpo)
regressor <- lm(Target ~ . , data       ​= data) # fit lm() model
relImportance <- calc.relimp(regressor, type = "lmg", rela = TRUE) # calculate relative importance scaled to 100
sort(relImportance$lmg, decreasing=TRUE) # relative importance

4. Метод MARS (земляной пакет)

Пакет earth реализует важность переменной на основе обобщенной перекрестной проверки (GCV), количества моделей подмножества, в которых встречается переменная (nsubsets), и остаточной суммы квадратов (RSS).

library(earth)
regressor <- earth(Target ~ . , data       ​= data) # build model
ev <- evimp (regressor) # estimate variable importance
plot (ev)

5. Метод пошаговой регрессии

Если у вас есть большое количество предикторов, разделите данные на куски по 10 предикторов, каждый из которых содержит responseVar.

base.mod <- lm(Target ~ 1 , data       ​= data) # base intercept only model
all.mod <- lm(Target ~ . , data       ​= data) # full model with all predictors
stepMod <- step(base.mod, scope = list(lower = base.mod, upper = all.mod), direction = "both", trace = 1, steps = 1000) # perform step-wise algorithm
shortlistedVars <- names(unlist(stepMod[[1]])) # get the shortlisted variable.
shortlistedVars <- shortlistedVars[!shortlistedVars %in% "(Intercept)"] # remove intercept

Выходные данные могут включать уровни внутри категориальных переменных, поскольку «пошаговый» метод основан на линейной регрессии.

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

· Будьте очень избирательны в отбрасывании ценных переменных-предикторов.

· Построить несколько моделей по переменной ответа.

6. Метод Боруты

Метод «Борута» можно использовать, чтобы решить, важна переменная или нет.

library(Boruta)
# Decide if a variable is important or not using Boruta
boruta_output <- Boruta(Target ~ . , data  ​= data, doTrace=2) # perform Boruta search
boruta_signif <- names(boruta_output$finalDecision[boruta_output$finalDecision %in% c("Confirmed", "Tentative")]) # collect Confirmed and Tentative variables
# for faster calculation(classification only)
library(rFerns)
boruta.train <- Boruta(factor(Target)~., data  ​=data, doTrace = 2, getImp=getImpFerns, holdHistory = F)
boruta.train
 
boruta_signif <- names(boruta.train$finalDecision[boruta.train$finalDecision %in% c("Confirmed", "Tentative")]) # collect Confirmed and Tentative variables
 
boruta_signif
##
getSelectedAttributes(boruta_signif, withTentative = F)
boruta.df <- attStats(boruta_signif)
print(boruta.df)

7. Метод ценности информации и веса доказательств

library(devtools)
library(woe)
library(riv)
iv_df <- iv.mult(data, y="Target", summary=TRUE, verbose=TRUE)
iv <- iv.mult(data, y="Target", summary=FALSE, verbose=TRUE)
iv_df
iv.plot.summary(iv_df) # Plot information value summary
Calculate weight of evidence variables
data_iv <- iv.replace.woe(data, iv, verbose=TRUE) # add woe variables to original data frame.

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

8. Метод обучения векторному квантованию (LVQ)

library(caret)
control <- trainControl(method="repeatedcv", number=10, repeats=3)
# train the model
regressor<- train(Target~., data       ​=data, method="lvq", preProcess="scale", trControl=control)
# estimate variable importance
importance <- varImp(regressor, scale=FALSE)

9. Метод RFE с рекурсивным удалением признаков

library(caret)
# define the control using a random forest selection function
control <- rfeControl(functions=rfFuncs, method="cv", number=10)
# run the RFE algorithm
results <- rfe(data[,1:n-1], data[,n], sizes=c(1:8), rfeControl=control)
# summarize the results
# list the chosen features
predictors(results)
# plot the results
plot(results, type=c("g", "o"))

10.Метод DALEX

library(randomForest)
library(DALEX)
regressor <- randomForest(Target ~ . , data       ​= data, importance=TRUE) # fit the random forest with default parameter

# Variable importance with DALEX
explained_rf <- explain(regressor, data   ​=data, y=data$target)
# Get the variable importances
varimps = variable_dropout(explained_rf, type='raw')
print(varimps)
plot(varimps)

11. ВИТА

library(vita)
regressor <- randomForest(Target ~ . , data    ​= data, importance=TRUE) # fit the random forest with default parameter
pimp.varImp.reg<-PIMP(data,data$target,regressor,S=10, parallel=TRUE)
pimp.varImp.reg
pimp.varImp.reg$VarImp
pimp.varImp.reg$VarImp
sort(pimp.varImp.reg$VarImp,decreasing = T)

12. Генетический алгоритм

library(caret)
# Define control function
ga_ctrl <- gafsControl(functions = rfGA, 
            method = "cv",
repeats = 3)# another option is `caretGA`
# Genetic Algorithm feature selection
ga_obj <- gafs(x=data[, 1:n-1], 
        y=data[, n], 
        iters = 3,  # normally much higher (100+)
        gafsControl = ga_ctrl)
ga_obj
# Optimal variables
ga_obj$optVariables

13.Имитация отжига

library(caret)
# Define control function
sa_ctrl <- safsControl(functions = rfSA,
            method = "repeatedcv",
            repeats = 3,
            improve = 5) # n iterations without improvement before a reset
# Simulated Annealing Feature Selection
set.seed(100)
sa_obj <- safs(x=data[, 1:n-1], 
        y=data[, n],
        safsControl = sa_ctrl)
sa_obj
# Optimal variables
print(sa_obj$optVariables)

14.Метод корреляции

library(caret)
# calculate correlation matrix
correlationMatrix <- cor(data [,1:n-1])
# summarize the correlation matrix
print(correlationMatrix)
# find attributes that are highly corrected (ideally >0.75)
highlyCorrelated <- findCorrelation(correlationMatrix, cutoff=0.5)
# print indexes of highly correlated attributes
print(highlyCorrelated)