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