Для выбора функции доступно довольно много алгоритмов. Вы можете попробовать rfe из пакета карет. Более сложная часть - это определение метрики c, по которой следует хранить переменные.
Например, ниже, я использую набор данных Ionosphere, и я добавил 30 случайных переменных, которые не имеют ничего общего с зависимой переменной, и запустить рекурсивную функцию исключения. Сначала данные:
library(caret)
library(mlbench)
library(e1071)
data(Ionosphere)
set.seed(888)
# exclude first 2 columns
Data = Ionosphere[,-c(1:2)]
# introduce another 30 columns that are random
Data = cbind(Class=Data[,"Class"],Data[-ncol(Data)],
matrix(rnorm(nrow(Data)*30),ncol=30)
)
Я выбираю наименьший размер, который находится в пределах 1,5% от максимальной точности:
svmFuncs = caretFuncs
svmFuncs$selectSize = pickSizeTolerance
rfe.ctrl <- rfeControl(functions = svmFuncs,
method="repeatedcv",
number=5,repeats=3)
Мы запускаем его, используя rfe из каретки:
test = rfe(Data[,-1],
Data$Class,
sizes = seq(5,50,by=5),
rfeControl = rfe.ctrl,method="svmLinear")
Результаты:
Recursive feature selection
Outer resampling method: Cross-Validated (5 fold, repeated 3 times)
Resampling performance over subset size:
Variables Accuracy Kappa AccuracySD KappaSD Selected
5 0.8214 0.5857 0.04111 0.09904
10 0.8328 0.6156 0.02787 0.06535 *
15 0.8385 0.6263 0.03413 0.08129
20 0.8291 0.6031 0.03215 0.07959
25 0.8319 0.6100 0.03647 0.08981
30 0.8253 0.5962 0.03363 0.08314
35 0.8272 0.6022 0.03354 0.08179
40 0.8271 0.6042 0.03579 0.08845
45 0.8243 0.6008 0.03511 0.08086
50 0.8138 0.5795 0.03447 0.07868
62 0.8092 0.5685 0.02800 0.06212
test$optVariables
[1] "V3" "V7" "V27" "V5" "V33" "V31" "V9" "V8" "V15" "V29"
Из приведенных выше результатов вы можете выбрать 15 или 25, так что это действительно зависит от ваших данных и того, чего вы хотите достичь с помощью модели в конце.