使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法
在caret(short for classification and regression training)包中有多個函數可以實現特征選擇,總的分為封裝法和過濾法。封裝法,將特征選擇過程與訓練過程融合在一起,以模型的預測能力作為特征選擇的衡量標準。封裝法可以選出高質量的變量子集,但運行速度上會大打折扣。在caret包中,封裝法有遞歸特征消除(recursive feature elimination:rfe)算法,遺傳算法(genetic algorithms:ga)和模擬退火(Simulated annealing:sa)算法。過濾法的特征選擇與訓練過程相互獨立,通過分析變量內部的關系進行篩選操作,與訓練模型的選擇并沒有關系。過濾法通過變量間的相關性、近零方差檢驗、聚類分析等方法選擇出來的變量,再用于不同的訓練模型構建、評估等。過濾法雖然在速度上比封裝法更占優勢,但可能會刪除非常有實質意義的變量。caret包中的過濾法有Selection By Filtering (SBF)。
遞歸特征消除(recursive feature elimination RFE)算法
RFE算法是基于預測器重要性排序的預測器向后選擇。在建模之前,對預測因子進行排序,不太重要的因子依次剔除。其目標是找到可以用于生成準確模型的預測器子集。http://topepo.github.io/caret/recursive-feat-elimination。
使用rfeControl() 對特征選擇的參數進行選擇,使用ref() 返回特征篩選結果。
下面主要講解每個函數里參數表示的含義及選擇的標準。
Usage (默認參數設置)
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
)
Arguments
functions #functions選擇用什么樣的模型進行自變量排序,可以選擇的有rfFuncs(隨機森林),lmFuncs(線性回歸),nbFuncs(樸素貝葉斯,只能用于分類),treebagFuncs(裝袋決策樹),ldaFuncs(只能用于分類),lrFuncs,caretFuncs。
rerank #邏輯值:每次計算的變量重要性是否刪除
method #樣本重采樣方法,用于重復訓練/測試集的分割:boot、cv、LOOCV或LGOCV
saveDetails #邏輯值:從選擇過程中保存預測和變量的重要性
number #重采樣迭代的次數,默認如果method是"cv"或者"repeatedcv",number=10,其余為25。可自定義迭代次數。
repeats #只對重復的k折疊交叉驗證,要計算的折疊完整集的數目,如果method是"cv"或者"repeatedcv",repeats=1,其余的話與number取值一致。
Verbose # 邏輯值:是否打印每次重采樣迭代的記錄
returnResamp #字符串(“final”, “all” or “none”):指示保存多少重采樣的摘要指標。
p #訓練集占所有樣本的比例。
index #列表or NULL:指定樣本進行迭代訓練,每個列表元素代表用于迭代訓練的樣本行。
indexOut #列表or NULL:指定每次取樣都要保留的樣品。如果為NULL,則使用index中不包含的唯一樣本集。
timingSamps #數值:輸入訓練集樣本的數目,估計預測樣本所需的時間。0則代表不需要估計。
seeds # 整數集or NA or NULL or列表:整數集表示每次重采樣迭代時的種子;NA值代表工作中不設置種子;NULL值代表使用一組隨機整數設置種子。也可以使用列表,列表應該有B+1個元素,其中B是重復采樣的數量。列表的前B個元素應該是長度為P的整數的向量,其中P是被求值的子集的個數(包括整個集合),列表的最后一個元素只需要是一個整數(對于最終的模型)。
allowParallel #邏輯值:如果加載了一個并行后端并可用,函數是否應該使用它
用法
rfe(
x,
y,
sizes = 2^(2:4),
metric = ifelse(is.factor(y), "Accuracy", "RMSE"),
maximize = ifelse(metric == "RMSE", FALSE, TRUE),
rfeControl = rfeControl(),
...
)
參數
x, #矩陣或數據框:訓練集的特征矩陣或數據框,該對象必須有唯一的列名。
y, #向量:訓練集的結果向量,數值型向量(regression)或因子型向量(classification)
sizes #向量:程序要測試的特征數目.
metric #字符串:后續模型總結使用的維度。regression使用"RMSE" 和"Rsquared";classification使用"Accuracy" and "Kappa"。
maximize # 邏輯值,如果metric=“RMSE”,則為FALSE,否則為TRUE
rfeControl # 模型參數
ref()返回的是一個列表。內容包含
Example
1、回歸預測:使用lmFuncs,rfFuncs和treebagFuncs分別進行特征篩選,選擇最優模型篩選的特征。
data(BloodBrain)
data(BloodBrain)
x <- scale(bbbDescr[,-nearZeroVar(bbbDescr)])
x <- x[, -findCorrelation(cor(x), .8)]
x <- as.data.frame(x, stringsAsFactors = TRUE)
inTrain <- createDataPartition(logBBB, p = .75, list = FALSE)[,1]
trainx <- x[ inTrain, ]
testx <- x[-inTrain, ]
trainy <- logBBB[ inTrain]
testy <- logBBB[-inTrain]
set.seed(1)
lmProfile <- rfe(trainx, trainy,
sizes = c(2, 4, 6, 8, 15, 30,45,60,length(x)),
rfeControl = rfeControl(functions = lmFuncs))
set.seed(1)
#耗時
rfFuncs <- rfe(trainx, trainy,
sizes = c(2, 4, 6, 8, 15, 30,45,60,length(x)),
rfeControl = rfeControl(functions = rfFuncs))
set.seed(1)
treebagFuncs <- rfe(trainx, trainy,
sizes = c(2, 4, 6, 8, 15, 30,45,60,length(x)),
rfeControl = rfeControl(functions = treebagFuncs))
比較不同模型的性能
xyplot(lmProfile$results$RMSE + rfFuncs$results$RMSE + treebagFuncs$results$RMSE ~
lmProfile$results$Variables,ylab = "RMSE",xlab = "Variables",
type = c("g", "p", "l"),
auto.key = TRUE)
xyplot(lmProfile$results$Rsquared + rfFuncs$results$Rsquared + treebagFuncs$results$Rsquared ~
lmProfile$results$Variables,ylab = "Rsquared",xlab = "Variables",
type = c("g", "p", "l"),
auto.key = TRUE)
不同模型的RMSE比較不同模型的Rsquared 比較返回最優RMSE的特征數量
lmProfile$bestSubset
rfFuncs$bestSubset
treebagFuncs$bestSubset
返回最優RMSE的特征數量postResample(predict(lmProfile, testx), testy)
postResample(predict(rfFuncs, testx), testy)
postResample(predict(treebagFuncs, testx), testy)
返回篩選特征在驗證集的效果結論:可以看到雖然隨機森林的方法在測試集和驗證集的性能均達到最優(RMSE最低,Rsquared最高),但是保留了所有的特征,并沒有起到特征篩選的作用;線性回歸雖然在測試集中保留15個特征可以使模型達到最優,但是在驗證集的性能卻要差一點。所以,實際使用的時候,還是要根據項目需求來選擇是否要對特征進行篩選,然后進行下一步的模型構建。
2、分類預測 ldaFuncs只能用于分類
data(mdrr)
mdrrDescr <- mdrrDescr[,-nearZeroVar(mdrrDescr)]
mdrrDescr <- mdrrDescr[, -findCorrelation(cor(mdrrDescr), .8)]
set.seed(1)
inTrain <- createDataPartition(mdrrClass, p = .75, list = FALSE)[,1]
train <- mdrrDescr[ inTrain, ]
test <- mdrrDescr[-inTrain, ]
trainClass <- mdrrClass[ inTrain]
testClass <- mdrrClass[-inTrain]
set.seed(2)
ldaProfile <- rfe(train, trainClass,
sizes = c(1:10, 15, 30),
rfeControl = rfeControl(functions = ldaFuncs,method = "cv"))
set.seed(2)
nbFuncs <- rfe(train, trainClass,
sizes = c(1:10, 15, 30),metric="Accuracy",
rfeControl = rfeControl(functions = nbFuncs,method = "cv"))
set.seed(2)
lrFuncs <- rfe(train, trainClass,
sizes = c(1:10, 15, 30),
rfeControl = rfeControl(functions = lrFuncs,method = "cv"))
set.seed(2)
caretFuncs <- rfe(train, trainClass,
sizes = c(1:10, 15, 30),
rfeControl = rfeControl(functions = caretFuncs,method = "cv"))
xyplot(ldaProfile$results$Accuracy + nbFuncs$results$Accuracy + lrFuncs$results$Accuracy ~
ldaProfile$results$Variables,ylab = "Accuracy",xlab = "Variables",
type = c("g", "p", "l"),
auto.key = TRUE)
xyplot(ldaProfile$results$Kappa + nbFuncs$results$Kappa + lrFuncs$results$Kappa ~
ldaProfile$results$Variables,ylab = "Kappa",xlab = "Variables",
type = c("g", "p", "l"),
auto.key = TRUE)
不同模型的Accuracy比較不同模型的Kappa比較postResample(predict(ldaProfile, test), testClass)
postResample(predict(nbFuncs, test), testClass)
postResample(predict(lrFuncs, test), testClass)
返回特征在驗證集的效果總結
以上是生活随笔為你收集整理的使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arupld32.exe进程有毒吗 ar
- 下一篇: java用数组实现随机不重复抽奖