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