2.3_模型和交叉检验
模型檢驗(yàn)-交叉驗(yàn)證
一般在進(jìn)行模型的測(cè)試時(shí),我們會(huì)將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集。在給定的樣本空間中,拿出大部分樣本作為訓(xùn)練集來訓(xùn)練模型,剩余的小部分樣本使用剛建立的模型進(jìn)行預(yù)測(cè)。
訓(xùn)練集與測(cè)試集
訓(xùn)練集與測(cè)試集的分割可以使用cross_validation中的train_test_split方法,大部分的交叉驗(yàn)證迭代器都內(nèi)建一個(gè)劃分?jǐn)?shù)據(jù)前進(jìn)行數(shù)據(jù)索引打散的選項(xiàng),train_test_split 方法內(nèi)部使用的就是交叉驗(yàn)證迭代器。默認(rèn)不會(huì)進(jìn)行打散,包括設(shè)置cv=some_integer(直接)k折疊交叉驗(yàn)證的cross_val_score會(huì)返回一個(gè)隨機(jī)的劃分。如果數(shù)據(jù)集具有時(shí)間性,千萬不要打散數(shù)據(jù)再劃分!
- sklearn.cross_validation.train_test_split
?
上面的方式也有局限。因?yàn)橹贿M(jìn)行一次測(cè)試,并不一定能代表模型的真實(shí)準(zhǔn)確率。因?yàn)?#xff0c;模型的準(zhǔn)確率和數(shù)據(jù)的切分有關(guān)系,在數(shù)據(jù)量不大的情況下,影響尤其突出。所以還需要一個(gè)比較好的解決方案。
模型評(píng)估中,除了訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù),還會(huì)涉及到驗(yàn)證數(shù)據(jù)。使用訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù)進(jìn)行了交叉驗(yàn)證,只有這樣訓(xùn)練出的模型才具有更可靠的準(zhǔn)確率,也才能期望模型在新的、未知的數(shù)據(jù)集上,能有更好的表現(xiàn)。這便是模型的推廣能力,也即泛化能力的保證。
holdout method
評(píng)估模型泛化能力的典型方法是holdout交叉驗(yàn)證(holdout cross validation)。holdout方法很簡(jiǎn)單,我們只需要將原始數(shù)據(jù)集分割為訓(xùn)練集和測(cè)試集,前者用于訓(xùn)練模型,后者用于評(píng)估模型的性能。一般來說,Holdout 驗(yàn)證并非一種交叉驗(yàn)證,因?yàn)閿?shù)據(jù)并沒有交叉使用。 隨機(jī)從最初的樣本中選出部分,形成交叉驗(yàn)證數(shù)據(jù),而剩余的就當(dāng)做訓(xùn)練數(shù)據(jù)。 一般來說,少于原本樣本三分之一的數(shù)據(jù)被選做驗(yàn)證數(shù)據(jù)。所以這種方法得到的結(jié)果其實(shí)并不具有說服性
k-折交叉驗(yàn)證
K折交叉驗(yàn)證,初始采樣分割成K個(gè)子樣本,一個(gè)單獨(dú)的子樣本被保留作為驗(yàn)證模型的數(shù)據(jù),其他K-1個(gè)樣本用來訓(xùn)練。交叉驗(yàn)證重復(fù)K次,每個(gè)子樣本驗(yàn)證一次,平均K次的結(jié)果或者使用其它結(jié)合方式,最終得到一個(gè)單一估測(cè)。這個(gè)方法的優(yōu)勢(shì)在于,同時(shí)重復(fù)運(yùn)用隨機(jī)產(chǎn)生的子樣本進(jìn)行訓(xùn)練和驗(yàn)證,每次的結(jié)果驗(yàn)證一次,10折交叉驗(yàn)證是最常用的。
例如5折交叉驗(yàn)證,全部可用數(shù)據(jù)集分成五個(gè)集合,每次迭代都選其中的1個(gè)集合數(shù)據(jù)作為驗(yàn)證集,另外4個(gè)集合作為訓(xùn)練集,經(jīng)過5組的迭代過程。交叉驗(yàn)證的好處在于,可以保證所有數(shù)據(jù)都有被訓(xùn)練和驗(yàn)證的機(jī)會(huì),也盡最大可能讓優(yōu)化的模型性能表現(xiàn)的更加可信。
使用交叉驗(yàn)證的最簡(jiǎn)單的方法是在估計(jì)器和數(shù)據(jù)集上使用cross_val_score函數(shù)。
- sklearn.cross_validation.cross_val_score
?
from sklearn.cross_validation import cross_val_score diabetes = datasets.load_diabetes() X = diabetes.data[:150] y = diabetes.target[:150] lasso = linear_model.Lasso() print(cross_val_score(lasso, X, y))?
使用交叉驗(yàn)證方法的目的主要有2個(gè):
- 從有限的學(xué)習(xí)數(shù)據(jù)中獲取盡可能多的有效信息;
- 可以在一定程度上避免過擬合問題。
轉(zhuǎn)載于:https://www.cnblogs.com/alexzhang92/p/10070211.html
總結(jié)
以上是生活随笔為你收集整理的2.3_模型和交叉检验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10种排序算法基础总结
- 下一篇: jar - 操作jar包的工具