R語言交叉驗證的實現(xiàn)代碼
k-折交叉驗證
k-折交叉驗證(K-fold cross-validation)是交叉驗證方法里一種。它是指將樣本集分為k份,其中k-1份作為訓(xùn)練數(shù)據(jù)集,而另外的1份作為驗證數(shù)據(jù)集。用驗證集來驗證所得分類器或者模型的錯誤率。一般需要循環(huán)k次,直到所有k份數(shù)據(jù)全部被選擇一遍為止。
有關(guān)交叉驗證的介紹可參考作者另一博文:
http://blog.csdn.net/yawei_liu1688/article/details/79138202
R語言實現(xiàn)
K折交叉驗證,隨機(jī)分組
數(shù)據(jù)打折-數(shù)據(jù)分組自編譯函數(shù):進(jìn)行交叉檢驗首先要對數(shù)據(jù)分組,數(shù)據(jù)分組要符合隨機(jī)且平均的原則
library(plyr) CVgroup <- function(k,datasize,seed){ cvlist <- list() set.seed(seed) n <- rep(1:k,ceiling(datasize/k))[1:datasize] #將數(shù)據(jù)分成K份,并生成的完成數(shù)據(jù)集n temp <- sample(n,datasize) #把n打亂 x <- 1:k dataseq <- 1:datasize cvlist <- lapply(x,function(x) dataseq[temp==x]) #dataseq中隨機(jī)生成k個隨機(jī)有序數(shù)據(jù)列 return(cvlist) }
k <- 10 datasize <- nrow(iris) cvlist <- CVgroup(k = k,datasize = datasize,seed = 1206) cvlist
結(jié)果輸出示例:
K折交叉驗證
第一種方法:循環(huán)語句寫驗證
data <- iris pred <- data.frame() #存儲預(yù)測結(jié)果 library(plyr) library(randomForest) m <- seq(60,500,by = 20) #如果數(shù)據(jù)量大盡量間隔大點,間隔過小沒有實際意義 for(j in m){ #j指的是隨機(jī)森林的數(shù)量 progress.bar <- create_progress_bar("text") #plyr包中的create_progress_bar函數(shù)創(chuàng)建一個進(jìn)度條, progress.bar$init(k) #設(shè)置上面的任務(wù)數(shù),幾折就是幾個任務(wù) for (i in 1:k){ train <- data[-cvlist[[i]],] #剛才通過cvgroup生成的函數(shù) test <- data[cvlist[[i]],] model <-randomForest(Sepal.Length~.,data = train,ntree = j) #建模,ntree=j 指的樹數(shù) prediction <- predict(model,subset(test,select = -Sepal.Length)) #預(yù)測 randomtree <- rep(j,length(prediction)) #隨機(jī)森林樹的數(shù)量 kcross <- rep(i,length(prediction)) #i是第幾次循環(huán)交叉,共K次 temp <- data.frame(cbind(subset(test,select = Sepal.Length),prediction,randomtree,kcross))#真實值、預(yù)測值、隨機(jī)森林樹數(shù)、預(yù)測組編號捆綁在一起組成新的數(shù)據(jù)框tenp pred <- rbind(pred,temp) #temp按行和pred合并 print(paste("隨機(jī)森林:",j)) #循環(huán)至樹數(shù)j的隨機(jī)森林模型 progress.bar$step() #輸出進(jìn)度條。告知完成了這個任務(wù)的百分之幾 } }
結(jié)果輸出示例1:
結(jié)果輸出示例2:指標(biāo)分別為真實值、預(yù)測值、隨機(jī)森林樹數(shù)、預(yù)測組編號
第二種方法:apply家族lapply
當(dāng)測試的循環(huán)數(shù)較多或單任務(wù)耗時較多時,apply家族優(yōu)勢特別明顯
data <- iris library(plyr) library(randomForest) k = 10 j <- seq(10,10000,by = 20) #j樹的數(shù)量 i <- 1:k #K折 i <- rep(i,times = length(j)) j <- rep(j,each = k) #多少折,each多少 x <- cbind(i,j) cvtest <- function(i,j){ train <- data[-cvlist[[i]],] test <- data[cvlist[[i]],] model <- randomForest(Sepal.Length~.,data = train,ntree = j) prediction <- predict(model,subset(test,select = -Sepal.Length)) temp <- data.frame(cbind(subset(test,select = Sepal.Length),prediction)) }
結(jié)果輸出示例3:指標(biāo)分別為真實值、預(yù)測值、隨機(jī)森林樹數(shù)、預(yù)測組編號
system.time(pred <- mdply(x,cvtest))
mdyly在plyr包中:輸出三個指標(biāo):“用戶”“系統(tǒng)”“流逝”。其中“流逝”應(yīng)該是這段代碼從開始到結(jié)束的真正時間。對于一般單線程的程序來說這個時間近似于用戶時間和系統(tǒng)時間之和,可以看出共運行了1386秒。
到此這篇關(guān)于R語言交叉驗證的文章就介紹到這了,更多相關(guān)R語言交叉驗證的實現(xiàn)代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語言-如何循環(huán)讀取excel并保存為RData
這篇文章主要介紹了R語言循環(huán)讀取excel并保存為RData的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04R語言 實現(xiàn)list類型數(shù)據(jù)轉(zhuǎn)換
這篇文章主要介紹了R語言 實現(xiàn)list類型數(shù)據(jù)轉(zhuǎn)換,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03