很多時候,,大家會利用各種方法建立不同的統(tǒng)計模型,諸如普通的cox回歸,,利用Lasso方法建立的cox回歸,,或者穩(wěn)健的cox回歸;或者說利用不同的變量建立不同的模型,,諸如模型一只考慮了三個因素,、模型二考慮了四個因素,最后對上述模型選擇(評價)的時候,,或者是參數(shù)擇優(yōu)的時候,,通常傳統(tǒng)統(tǒng)計學方法中會用AIC,BIC,、擬合優(yōu)度-2logL,,或者預測誤差最小等準則來選擇最優(yōu)模型,;而最新的文獻中都會提到一種叫交叉驗證(Cross validation)的方法,或者會用到一種將原始數(shù)據(jù)按照樣本量分為兩部分三分之二用來建模,,三分之一用來驗證的思路(臨床上有醫(yī)生稱為內部驗證),,再或者利用多中心數(shù)據(jù),一個中心數(shù)據(jù)用來建模,,另外一個中心數(shù)據(jù)用來驗證(臨床上稱為外部驗證),,這些都是什么?總結一下自己最近看的文獻和書籍,,在這里簡單介紹下,,僅供參考。 一,、交叉驗證的概念 交叉驗證(Cross validation),,有時亦稱循環(huán)估計,是一種統(tǒng)計學上將數(shù)據(jù)樣本切割成較小子集的實用方法,。于是可以先在一個子集上做建模分析,,而其它子集則用來做后續(xù)對此分析的效果評價及驗證。一開始的子集被稱為訓練集(Train set),。而其它的子集則被稱為驗證集(Validationset)或測試集(Test set),。交叉驗證是一種評估統(tǒng)計分析、機器學習算法對獨立于訓練數(shù)據(jù)的數(shù)據(jù)集的泛化(普遍適用性)能力(Generalize).例如下圖文獻中,,原始數(shù)據(jù)集中449例觀測,,文獻中將數(shù)據(jù)集分為了訓練集(Primary Cohort)367例,驗證集(Validation Cohort)82例,。 二,、交叉驗證的原理及分類 假設利用原始數(shù)據(jù)可以建立 n 個統(tǒng)計模型,這 n 個模型的集合是M={M1,,M2,,…,Mn},比如我們想做回歸,,那么簡單線性回歸,、logistic回歸,、隨機森林,、神經(jīng)網(wǎng)絡等模型都包含在M中。目標任務就是要從M中選擇最好的模型,。 (1)簡單交叉驗(hold-outcross validation) 假設訓練集使用T來表示,。如果想使用預測誤差最小來度量模型的好壞,那么可以這樣來選擇模型: 1).使用T來訓練每一個M,,訓練出參數(shù)(模型的系數(shù))后,,也就可以得到模型方程Fi,。(比如,線性模型中得到系數(shù)ai后,,也就得到了模型Fi(x)=aTx); 2).選擇預測誤差最小的模型,。 遺憾的是這個算法不可行,比如我們需要擬合一些樣本點,,使用高階的多項式回歸肯定比線性回歸錯誤率要小,,偏差小,但是方差卻很大,,會過度擬合,。因此,我們改進算法如下: 1).從全部的訓練數(shù)據(jù)T中隨機選擇70%的樣本作為訓練集Ttrain,,剩余的30%作為測試集Tcv,。 2).在Ttrain上訓練每一個M,得到模型Fi,。 3).在Tcv上測試每一個Fi,,得到相應的預測誤差e。 4).選擇具有最小預測誤差的作為最佳模型,。 這種方法稱為hold-outcross validation或者稱為簡單交叉驗證,。 由于測試集是和訓練集中是兩個世界的,因此可以認為這里的預測誤差接近于真實誤差(generalizationerror),。這里測試集的比例一般占全部數(shù)據(jù)的1/4-1/3,。30%是典型值。 還可以對模型作改進,,當選出最佳的模型M后,,再在全部數(shù)據(jù)T上做一次訓練,顯然訓練數(shù)據(jù)越多,,模型參數(shù)越準確,。 簡單交叉驗證方法的弱點在于得到的最佳模型是在70%的訓練數(shù)據(jù)上選出來的,不代表在全部訓練數(shù)據(jù)上是最佳的,。還有當訓練數(shù)據(jù)本來就很少時,,再分出測試集后,訓練數(shù)據(jù)就太少了,。其實嚴格意義來說Hold-OutMethod并不能算是CV,因為這種方法沒有達到交叉的思想,由于是隨機的將原始數(shù)據(jù)分組,所以最后驗證集分類準確率的高低與原始數(shù)據(jù)的分組有很大的關系,所以這種方法得到的結果其實并不具有說服性. (2)k-折疊交叉驗證(k-fold cross validation) 進一步對簡單交叉驗證方法再做一次改進,,如下: 1).將全部訓練集T分成k個不相交的子集,假設T中的訓練樣例個數(shù)為m,,那么每一個子集有m/k個訓練樣例,,相應的子集稱作{T1,T2,…, Tk},。 2).每次從模型集合M中拿出來一個Mi,,然后在訓練子集中選擇出k-1個{T1,,T2,Tj-1,Tj+1…,Tk}(也就是每次只留下一個Tj),使用這k-1個子集訓練Mi后,得到假設函數(shù)Fij,。最后使用剩下的一份Tj作測試,,得到預測誤差eij。 3).由于我們每次留下一個Tj(j從1到k),,因此會得到k個預測誤差,,那么對于一個Mi,它的預測誤差是這k個預測誤差的平均,。 4).選出平均經(jīng)驗錯誤率最小的Mi,,然后使用全部的T再做一次訓練,得到最后的模型Fi,。 此方法稱為k-fold cross validation(k-折疊交叉驗證)說白了,,這個方法就是將簡單交叉驗證的測試集改為1/k,,每個模型訓練k次,測試k次,,預測誤差為k次的平均,。K一般大于等于2,實際操作時一般從3開始取,只有在原始數(shù)據(jù)集合數(shù)據(jù)量小的時候才會嘗試取2.K-CV可以有效的避免過學習以及欠學習狀態(tài)的發(fā)生,最后得到的結果也比較具有說服性.一般講k取值為10,。這樣數(shù)據(jù)稀疏時基本上也能進行。顯然,缺點就是訓練和測試次數(shù)過多,。 (3)留一交叉驗證(leave one out cross validation) 極端情況下k-折疊交叉驗證中k可以取值為m,意味著每次留一個樣例做測試,,這個稱為leave-one-outcross validation(LOO-CV),。 如果設原始數(shù)據(jù)有N個樣本,那么LOO-CV就是N-CV,即每個樣本單獨作為驗證集,其余的N-1個樣本作為訓練集,所以LOO-CV會得到N個模型,用這N個模型最終的驗證集的分類準確率的平均數(shù)作為此下LOO-CV分類器的性能指標.相比于前面的K-CV,LOO-CV有兩個明顯的優(yōu)點: 1).每一回合中幾乎所有的樣本皆用于訓練模型,因此最接近原始樣本的分布,這樣評估所得的結果比較可靠。 2).實驗過程中沒有隨機因素會影響實驗數(shù)據(jù),確保實驗過程是可以被復制的,。 但LOO-CV的缺點則是計算成本高,因為需要建立的模型數(shù)量與原始數(shù)據(jù)樣本數(shù)量相同,當原始數(shù)據(jù)樣本數(shù)量相當多時,LOO-CV在實作上便有困難幾乎就是不顯示,除非每次訓練分類器得到模型的速度很快,或是可以用并行化計算減少計算所需的時間。 最后,介紹一種與交叉驗證有些不同但在各種文獻中經(jīng)常見到的模型選擇方法,即自助法(Bootstrap法),。自助法的基本思想是從原始數(shù)據(jù)中用有放回的抽樣方法來產(chǎn)生新的樣本,例如我們有一大小為N的數(shù)據(jù)集,我們從中有放回的抽取N個樣本,對N個樣本進行建模,,每個模型一個預測誤差,,取N各預測誤差的平均值。這一方法在前期介紹C-index值是曾介紹過,,C-index中的95%CI就是通過這一方法求出來的,。這一方法建議在樣本量小且單一的情況下使用,。 三、注意事項 交叉驗證使用中注意的事項: 1).訓練集中樣本數(shù)量要足夠多,,一般至少大于總樣本數(shù)的50%,。 2).訓練集和測試集必須從完整的數(shù)據(jù)集中均勻取樣,。均勻取樣的目的是希望減少訓練集、測試集與原數(shù)據(jù)集之間的偏差,。當樣本數(shù)量足夠多時,通過隨機取樣,,便可以實現(xiàn)均勻取樣的效果。(隨機取樣,,可重復性差)
附:CrossValidation的R實現(xiàn)程序 library(ISLR) set.seed(1) str(Auto) n=nrow(Auto) train=sample(n,n/2) test=(-train) lm.fit=lm(mpg~horsepower, data=Auto, subset=train) mean((Auto[test,'mpg']-predict(lm.fit, newdata=Auto[test,]))^2) summary(lm.fit) ## lm.fit2=lm(mpg~poly(horsepower,2), data=Auto, subset=train) mean((Auto[test,'mpg']-predict(lm.fit2, newdata=Auto[test,]))^2) summary(lm.fit2) ### testError=matrix(NA,10,10) for(seed in 123:132){ set.seed(seed) train=sample(n,n/2) test=(-train) for(degree in 1:10){ lm.fit=lm(mpg~poly(horsepower,degree), data=Auto,subset=train) testError[seed-122,degree]=mean((Auto[test,'mpg']-predict(lm.fit,newdata=Auto[test,]))^2) } } range=range(testError) plot(testError[1,],ylim=range,type='l',col=rainbow(10)[1],xlab='degree',ylab='the estimated test MSE') for(seed in 2:10)points(testError[seed,],type='l',col=rainbow(10)[seed]) 每種顏色代表一次全體樣本的隨機對半劃分 ### ##Leave-One-Out Cross-Validation > cv.error=rep(0,5) > t1=Sys.time() > for(degree in 1:5){ + glm.fit=glm(mpg ~ poly(horsepower,degree), data=Auto) + cv.error[degree]=cv.glm(Auto,glm.fit)$delta[1] + } > Sys.time()-t1 Time difference of 45.18859 secs > cv.error [1] 24.23151 19.24821 19.33498 19.42443 19.03321 > plot(cv.error,type='b',xlab='degree') ## K-Fold Cross Validation > set.seed(17) > cv.error.10=rep(0,10) > t1=Sys.time() > for(degree in 1:10){ + glm.fit=glm(mpg ~ poly(horsepower,degree), data=Auto) + cv.error.10[degree]=cv.glm(Auto,glm.fit,K=10)$delta[1] + } > Sys.time()-t1 Time difference of 2.411138 secs > cv.error.10 [1] 24.20520 19.18924 19.30662 19.33799 18.87911 19.02103 18.8960919.71201 18.95140 [10] 19.50196 > plot(cv.error.10,type='b',xlab='degree') |
|
來自: 生物_醫(yī)藥_科研 > 《待分類》