Как найти самые важные переменные в 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)