在進行數據挖掘時,我們並不需要將所有的自變量用來建模,而是從中選擇若干最重要的變量,這稱為特征選擇(feature selection)。本文主要介紹基於caret包的rfe()函數的特征選擇。
一種算法就是后向選擇,即先將所有的變量都包括在模型中,然后計算其效能(如誤差、預測精度)和變量重要排序,然后保留最重要的若干變量,再次計算效能,這樣反復迭代,找出合適的自變量數目。這種算法的一個缺點在於可能會存在過度擬合,所以需要在此算法外再套上一個樣本划分的循環。在caret包中的rfe命令可以完成這項任務。
rfe(x, y, sizes = 2^(2:4), metric = ifelse(is.factor(y), "Accuracy", "RMSE"), maximize = ifelse(metric == "RMSE", FALSE, TRUE), rfeControl = rfeControl(), ...)
- x 訓練集自變量矩陣或數據庫,注意,列名必須唯一
- y 訓練集的結果向量(數值型或因子型)
- sizes 對應於應該保留的特征的數量的數值向量
- metric 指定將使用什么匯總度量來選擇最優模型。默認情況下,"RMSE" and "Rsquared" for regression and "Accuracy" and "Kappa" for classification
- maximize 邏輯值,metric是否最大化
- rfeControl 控制選項列表,包括擬合預測的函數。一些模型的預定義函數如下: linear regression (in the object lmFuncs), random forests (rfFuncs), naive Bayes (nbFuncs), bagged trees (treebagFuncs) and functions that can be used with caret’s train function (caretFuncs). 如果模型具有必須在每次迭代中確定的調整參數,則后者是有用的。
rfeControl(functions = NULL, rerank = FALSE, method = "boot", saveDetails = FALSE, number = ifelse(method %in% c("cv", "repeatedcv"), 10, 25), repeats = ifelse(method %in% c("cv", "repeatedcv"), 1, number), verbose = FALSE, returnResamp = "final", p = 0.75, index = NULL, indexOut = NULL, timingSamps = 0, seeds = NA, allowParallel = TRUE)
functions
method 確定用什么樣的抽樣方法,默認提升boot,還有cv(交叉驗證),LOOCV(留一交叉驗證)
number folds的數量或重抽樣的迭代次數
seeds 每次重抽樣迭代時設置的隨機種子
在第17個變量后面有 * 號,表明選擇17個變量時,其預測精度最高
plot(lmProfile) 可觀察到同樣結果,如下:
返回最終保留的自變量:
參考:
http://topepo.github.io/caret/recursive-feature-elimination.html
http://blog.csdn.net/jiabiao1602/article/details/44975741