對于不同的算法携御,會有一些獨有的參數(shù)需要調(diào)優(yōu)斑鼻,例如k-nearest neighbor中k值的選擇就需要進行一定的考量页滚。由于有時候這些參數(shù)會決定計算的復(fù)雜性,所以選擇這些參數(shù)就變的尤為重要稳吮。
選擇參數(shù)的方式有很多,其中的百試不爽的一種是井濒,建立一組候選值灶似,基于這些值進行預(yù)測,然后比較結(jié)果瑞你,選擇最優(yōu)結(jié)果的那個參數(shù)喻奥。
Data splitting 數(shù)據(jù)分組
模型建立的步驟主要有
1.預(yù)處理自變量 2.評估模型參數(shù) 3.選擇自變量4.評估模型效果 5.微調(diào)預(yù)測規(guī)則
數(shù)據(jù)分組的方法有隨機抽樣,差異性抽樣等
Resampling techniques
通常重新采樣評估模型效果的方式很類似捏悬,選擇樣本的一個子集來擬合模型撞蚕,然后用剩余的數(shù)據(jù)來驗證模型的效果。
k-Fold Cross-Validation
樣本隨機被分為k個大小相等的子集过牙。第一步,將第一個子集作為測試集甥厦,其他數(shù)據(jù)作為訓(xùn)練集,計算模型的性能寇钉。第二步刀疙,用第二子集作為測試機,用剩余數(shù)據(jù)作為訓(xùn)練集得到模型扫倡,依次執(zhí)行k次直到每個子集做過測試集谦秧,將測試性能的結(jié)果進行平均。隨著k值的增加其預(yù)測錯誤會降低撵溃。缺點是計算的次數(shù)較多疚鲤。通常會選擇5或者10。
Leave-one-out cross-validation(LOOCV)
將n個數(shù)據(jù)中n-1數(shù)據(jù)作為訓(xùn)練集缘挑,剩余1個數(shù)據(jù)作為測試集集歇,循環(huán)n次
Repeated Training/Test Splits (Monte Carlo cv)
將數(shù)據(jù)隨機分為訓(xùn)練集和測試集,重復(fù)多次语淘,重復(fù)的次數(shù)通常在25次左右诲宇,如果想得到更好的結(jié)果际歼,需要重復(fù)(50-200)次
The BootStrap
有放回的從原有數(shù)據(jù)集中選取訓(xùn)練集,訓(xùn)練集和原數(shù)據(jù)大小一樣姑蓝,沒被選到的數(shù)據(jù)集作為測試集鹅心。平均來看63.2%的被選中至少一次,類似于當(dāng)k約等于2時的k-fold cross-validation纺荧,bias情況隨著訓(xùn)練集擴大而降低巴帮。
數(shù)據(jù)量較小,推薦repeated 10-fold cross-validation
----------------------------------------------------------
在R的使用中sample可以用來對數(shù)據(jù)進行簡單地隨機分組虐秋,caret包中的createDataPartition可以對數(shù)據(jù)進行分層隨機分組榕茧。例子
>trainingRows<-createDataPartition(classes,p=.80,list=FALSE)
Resampling中可以繼續(xù)使用createDataPartition,增加times參數(shù)創(chuàng)建多重分組
>set.seed(1)
>repeatedSplits<-createDataPartition(trainClasses,p=.80,times=3)
同時客给,caret包中的createResamples(for bootstrapping)用押,createFolds(for k-fold cross-validation)和createMultiFolds(for repeated CV),舉例創(chuàng)建10-fold cross-validation
>set.seed(1)
>cvSplits<- creatFolds(trainClasses,k=10,returnTrain=TRUE)
caret包中的train能夠構(gòu)建不同的重采樣方法靶剑,性能評測和算法評估等蜻拨,也可以用于并行計算。舉例桩引,優(yōu)化SVM模型
>set.seed(1056)
>svmFit<-train(Class~., data=GermanCreditTrain, method="svmRadial",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? preProc=c("center","scale"),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tuneLength=10
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? trControl=trainControl(method="repeatedcv",repeats=5) ?)?