模型参数优化(四):交叉验证、网格搜索
生活随笔
收集整理的這篇文章主要介紹了
模型参数优化(四):交叉验证、网格搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.交叉驗證
1.1 基本概念
? ? ? ?交叉驗證的基本思想是將數據集分割成N份,依次使用其中1份作為測試集,其他N1份整合到一起作為訓練集,將訓練好的模型用于測試集上,以得到模型好壞的判斷或估計值,可以得到N個這樣的值。交叉驗證通常用于估計模型的誤差,這里將N個對應的誤差求平均作為對模型誤差的估計。也可以根據這N個值,選岀擬合效果最好的模型,對應模型的參數也被認為是最優或接近最優的,因此交叉驗證可以用來輔助確定參數。
1.2 代碼實現
#本函數實現對樣本的分割 #df:data.frame對象 #k:分割數量 #return:帶有I_kvalue屬性的完整數據集 #注意sample函數中的參數默認是“對位”的sample(x=x,size,replace=TRUE,prob=c(0.4,0.6))分別是數據集、尺寸、是否可重復、抽取的概率sampleSplit <- function(df,k) {df$I_kvalue <- sample(1+((1:dim(df)[1])%%k),dim(df)[1]) # dim(iris):150 5 dim(df)[1]=5return(df) } out=sampleSplit(iris,k=10) table(out$I_kvalue)#table是其中的數出現的次數 ## ## 1 2 3 4 5 6 7 8 9 10 ## 15 15 15 15 15 15 15 15 15 15# > out # Sepal.Length Sepal.Width Petal.Length Petal.Width Species I_kvalue # 1 5.1 3.5 1.4 0.2 setosa 9 # 2 4.9 3.0 1.4 0.2 setosa 1 # 3 4.7 3.2 1.3 0.2 setosa 2 # 4 4.6 3.1 1.5 0.2 setosa 2 # 5 5.0 3.6 1.4 0.2 setosa 8 # 6 5.4 3.9 1.7 0.4 setosa 4 # 7 4.6 3.4 1.4 0.3 setosa 5 # 8 5.0 3.4 1.5 0.2 setosa 3 # 9 4.4 2.9 1.4 0.2 setosa 9# 1、使用交叉驗證得到的參數 set.seed(1234) k=10 out=sampleSplit(iris,k) #初始化最小均方誤差minError minError=100 #初始化最佳擬合結果finalfit finalfit=NULL for(i in 1:k) {#選擇第i個子樣本之外的其它所有樣本作為訓練集trainset=out[out$I_kvalue!=i,1:(dim(out)[2]-2)]#選擇第i個子樣本作為測試集testset=out[out$I_kvalue==i,1:(dim(out)[2]-2)]#擬合線性回歸模型lm.fit=lm(Petal.Width~Sepal.Length+Sepal.Width+Petal.Length,data=trainset)#基于測試集得出預測結果testset$pred=predict(lm.fit,testset)#計算均方誤差error=mean((testset$Petal.Width-testset$pred)^2)#判斷是否最小均方誤差if(error<minError){minError=errorfinalfit=lm.fit} } print(minError) ## [1] 0.009822179print(finalfit$coefficients)## (Intercept) Sepal.Length Sepal.Width Petal.Length ## -0.2488242 -0.1977551 0.2176520 0.5157144# 2、使用一般方法得到的參數 lm.fit=lm(Petal.Width~Sepal.Length+Sepal.Width+Petal.Length,data=iris) print(lm.fit$coefficients)## (Intercept) Sepal.Length Sepal.Width Petal.Length ## -0.2403074 -0.2072661 0.2228285 0.52408312. 網格搜索
2.1 基本概念
? ? ? ?網格搜索的基本原理是將各參數變量值的區間劃分為一系列的小區間,并按順序計算出對應各參數變量值組合所確定的目標值(通常是誤差),并逐一擇優,以得到該區間內最小目標值及其對應的最佳參數值。該方法可保證所得的搜索解是全局最優或接近最優的,可避免產生重大的誤差。
2.2 代碼實現
minMSE=1000 f_a0=NULL f_b0=NULL f_c0=NULL f_d0=NULL k=55 for(a in 0:k) {for(b in 0:k){for(c in 0:k){for(d in 0:k){#參數實例化a0<-(-1)+2*a/kb0<-(-1)+2*b/kc0<-(-1)+2*c/kd0<-(-1)+2*d/k#計算均方誤差y0<-a0+b0*iris$Sepal.Length+c0*iris$Sepal.Width+d0*iris$Petal.Lengthmse<-mean((iris$Petal.Width-y0)^2)if(mse<minMSE){minMSE<-msef_a0<-a0f_b0<-b0f_c0<-c0f_d0<-d0}}}} } print(minMSE) ## [1] 0.03607967print(c(f_a0,f_b0,f_c0,f_d0)) ## [1] -0.3454545 -0.2000000 0.2363636 0.5272727?
總結
以上是生活随笔為你收集整理的模型参数优化(四):交叉验证、网格搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模型参数优化(三):模拟退火
- 下一篇: 卡尔曼滤波器算法(Kalman Filt