日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用特征_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)算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。