為什么要用交叉驗(yàn)證

本文結(jié)構(gòu):

  • 什么是交叉驗(yàn)證法货邓?
  • 為什么用交叉驗(yàn)證法秆撮?
  • 主要有哪些方法??jī)?yōu)缺點(diǎn)换况?
  • 各方法應(yīng)用舉例职辨?

什么是交叉驗(yàn)證法?

它的基本思想就是將原始數(shù)據(jù)(dataset)進(jìn)行分組戈二,一部分做為訓(xùn)練集來(lái)訓(xùn)練模型舒裤,另一部分做為測(cè)試集來(lái)評(píng)價(jià)模型。


為什么用交叉驗(yàn)證法觉吭?

  1. 交叉驗(yàn)證用于評(píng)估模型的預(yù)測(cè)性能腾供,尤其是訓(xùn)練好的模型在新數(shù)據(jù)上的表現(xiàn),可以在一定程度上減小過(guò)擬合节值。
  2. 還可以從有限的數(shù)據(jù)中獲取盡可能多的有效信息黎侈。

主要有哪些方法?

1. 留出法 (holdout cross validation)

在機(jī)器學(xué)習(xí)任務(wù)中贴汪,拿到數(shù)據(jù)后扳埂,我們首先會(huì)將原始數(shù)據(jù)集分為三部分:訓(xùn)練集阳懂、驗(yàn)證集和測(cè)試集柜思。
訓(xùn)練集用于訓(xùn)練模型赡盘,驗(yàn)證集用于模型的參數(shù)選擇配置,測(cè)試集對(duì)于模型來(lái)說(shuō)是未知數(shù)據(jù)葱淳,用于評(píng)估模型的泛化能力赞厕。

這個(gè)方法操作簡(jiǎn)單定硝,只需隨機(jī)把原始數(shù)據(jù)分為三組即可蔬啡。
不過(guò)如果只做一次分割星爪,它對(duì)訓(xùn)練集顽腾、驗(yàn)證集和測(cè)試集的樣本數(shù)比例,還有分割后數(shù)據(jù)的分布是否和原始數(shù)據(jù)集的分布相同等因素比較敏感久信,不同的劃分會(huì)得到不同的最優(yōu)模型裙士,而且分成三個(gè)集合后管毙,用于訓(xùn)練的數(shù)據(jù)更少了夭咬。

于是有了 2. k 折交叉驗(yàn)證(k-fold cross validation)加以改進(jìn):

k 折交叉驗(yàn)證通過(guò)對(duì) k 個(gè)不同分組訓(xùn)練的結(jié)果進(jìn)行平均來(lái)減少方差南用,因此模型的性能對(duì)數(shù)據(jù)的劃分就不那么敏感掏湾。

  • 第一步融击,不重復(fù)抽樣將原始數(shù)據(jù)隨機(jī)分為 k 份砚嘴。
  • 第二步,每一次挑選其中 1 份作為測(cè)試集耸采,剩余 k-1 份作為訓(xùn)練集用于模型訓(xùn)練虾宇。
  • 第三步嘱朽,重復(fù)第二步 k 次搪泳,這樣每個(gè)子集都有一次機(jī)會(huì)作為測(cè)試集扼脐,其余機(jī)會(huì)作為訓(xùn)練集奋刽。
  • 在每個(gè)訓(xùn)練集上訓(xùn)練后得到一個(gè)模型佣谐,
  • 用這個(gè)模型在相應(yīng)的測(cè)試集上測(cè)試狭魂,計(jì)算并保存模型的評(píng)估指標(biāo)雌澄,
  • 第四步仔役,計(jì)算 k 組測(cè)試結(jié)果的平均值作為模型精度的估計(jì),并作為當(dāng)前 k 折交叉驗(yàn)證下模型的性能指標(biāo)任柜。

k 一般取 10沛厨,
數(shù)據(jù)量小的時(shí)候宅粥,k 可以設(shè)大一點(diǎn)秽梅,這樣訓(xùn)練集占整體比例就比較大剿牺,不過(guò)同時(shí)訓(xùn)練的模型個(gè)數(shù)也增多晒来。
數(shù)據(jù)量大的時(shí)候湃崩,k 可以設(shè)小一點(diǎn)。

當(dāng) k=m 即樣本總數(shù)時(shí)朵诫,叫做 3. 留一法(Leave one out cross validation)剪返,每次的測(cè)試集都只有一個(gè)樣本,要進(jìn)行 m 次訓(xùn)練和預(yù)測(cè)。
這個(gè)方法用于訓(xùn)練的數(shù)據(jù)只比整體數(shù)據(jù)集少了一個(gè)樣本宾毒,因此最接近原始樣本的分布诈铛。
但是訓(xùn)練復(fù)雜度增加了幢竹,因?yàn)槟P偷臄?shù)量與原始數(shù)據(jù)樣本數(shù)量相同焕毫。
一般在數(shù)據(jù)缺乏時(shí)使用邑飒。

此外:

  1. 多次 k 折交叉驗(yàn)證再求均值疙咸,例如:10 次 10 折交叉驗(yàn)證撒轮,以求更精確一點(diǎn)贼穆。
  2. 劃分時(shí)有多種方法扮惦,例如對(duì)非平衡數(shù)據(jù)可以用分層采樣崖蜜,就是在每一份子集中都保持和原始數(shù)據(jù)集相同的類別比例。
  3. 模型訓(xùn)練過(guò)程的所有步驟抡柿,包括模型選擇洲劣,特征選擇等都是在單個(gè)折疊 fold 中獨(dú)立執(zhí)行的囱稽。

還有一種比較特殊的交叉驗(yàn)證方式战惊,Bootstrapping: 通過(guò)自助采樣法,即在含有 m 個(gè)樣本的數(shù)據(jù)集中况凉,每次隨機(jī)挑選一個(gè)樣本刁绒,再放回到數(shù)據(jù)集中知市,再隨機(jī)挑選一個(gè)樣本,這樣有放回地進(jìn)行抽樣 m 次速蕊,組成了新的數(shù)據(jù)集作為訓(xùn)練集初狰。

這里會(huì)有重復(fù)多次的樣本,也會(huì)有一次都沒(méi)有出現(xiàn)的樣本互例,原數(shù)據(jù)集中大概有 36.8% 的樣本不會(huì)出現(xiàn)在新組數(shù)據(jù)集中奢入。

優(yōu)點(diǎn)是訓(xùn)練集的樣本總數(shù)和原數(shù)據(jù)集一樣都是 m,并且仍有約 1/3 的數(shù)據(jù)不被訓(xùn)練而可以作為測(cè)試集媳叨。
缺點(diǎn)是這樣產(chǎn)生的訓(xùn)練集的數(shù)據(jù)分布和原數(shù)據(jù)集的不一樣了腥光,會(huì)引入估計(jì)偏差。
此種方法不是很常用糊秆,除非數(shù)據(jù)量真的很少武福。


各方法應(yīng)用舉例?

1. 留出法 (holdout cross validation)

下面例子捉片,一共有 150 條數(shù)據(jù):

>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

用 train_test_split 來(lái)隨機(jī)劃分?jǐn)?shù)據(jù)集莹规,其中 40% 用于測(cè)試集,有 60 條數(shù)據(jù),60% 為訓(xùn)練集,有 90 條數(shù)據(jù):

>>> X_train, X_test, y_train, y_test = train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

用 train 來(lái)訓(xùn)練括荡,用 test 來(lái)評(píng)價(jià)模型的分?jǐn)?shù)。

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)                           
0.96...

2. k 折交叉驗(yàn)證(k-fold cross validation)

最簡(jiǎn)單的方法是直接調(diào)用 cross_val_score州邢,這里用了 5 折交叉驗(yàn)證:

>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_val_score(clf, iris.data, iris.target, cv=5)
>>> scores                                              
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])

得到最后平均分為 0.98呀枢,以及它的 95% 置信區(qū)間:

>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)

我們可以直接看一下 K-fold 是怎樣劃分?jǐn)?shù)據(jù)的:
X 有四個(gè)數(shù)據(jù)摘刑,把它分成 2 折紧唱,
結(jié)果中最后一個(gè)集合是測(cè)試集深胳,前面的是訓(xùn)練集敛劝,
每一行為 1 折:

>>> import numpy as np
>>> from sklearn.model_selection import KFold

>>> X = ["a", "b", "c", "d"]
>>> kf = KFold(n_splits=2)
>>> for train, test in kf.split(X):
...     print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]

同樣的數(shù)據(jù) X像捶,我們看 LeaveOneOut 后是什么樣子硼莽,
那就是把它分成 4 折矾瑰,
結(jié)果中最后一個(gè)集合是測(cè)試集采幌,只有一個(gè)元素,前面的是訓(xùn)練集凫岖,
每一行為 1 折:

>>> from sklearn.model_selection import LeaveOneOut

>>> X = [1, 2, 3, 4]
>>> loo = LeaveOneOut()
>>> for train, test in loo.split(X):
...     print("%s %s" % (train, test))
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]

資料:
機(jī)器學(xué)習(xí)
http://scikit-learn.org/stable/modules/cross_validation.html
https://ljalphabeta.gitbooks.io/python-/content/kfold.html
http://www.csuldw.com/2015/07/28/2015-07-28%20crossvalidation/


推薦閱讀 歷史技術(shù)博文鏈接匯總
http://www.reibang.com/p/28f02bb59fe5
也許可以找到你想要的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挟阻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往史,死亡現(xiàn)場(chǎng)離奇詭異挨决,居然都是意外死亡撒犀,警方通過(guò)查閱死者的電腦和手機(jī)或舞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門仆救,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人揩悄,你說(shuō)我怎么就攤上這事晰韵。” “怎么了雪猪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵栏尚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我只恨,道長(zhǎng)译仗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任官觅,我火速辦了婚禮纵菌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘休涤。我一直安慰自己咱圆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布功氨。 她就那樣靜靜地躺著序苏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捷凄。 梳的紋絲不亂的頭發(fā)上忱详,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音纵势,去河邊找鬼踱阿。 笑死管钳,一個(gè)胖子當(dāng)著我的面吹牛钦铁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播才漆,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牛曹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了醇滥?” 一聲冷哼從身側(cè)響起黎比,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳玩,沒(méi)想到半個(gè)月后阅虫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡不跟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年颓帝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡购城,死狀恐怖吕座,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘪板,我是刑警寧澤吴趴,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站侮攀,受9級(jí)特大地震影響锣枝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魏身,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一惊橱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箭昵,春花似錦税朴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至颤殴,卻和暖如春觅廓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涵但。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工杈绸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矮瘟。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓瞳脓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親澈侠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劫侧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容