日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

詳解python實(shí)現(xiàn)交叉驗(yàn)證法與留出法

系統(tǒng) 4991 0

在機(jī)器學(xué)習(xí)中,我們經(jīng)常在訓(xùn)練集上訓(xùn)練模型,在測(cè)試集上測(cè)試模型。最終的目標(biāo)是希望我們的模型在測(cè)試集上有最好的表現(xiàn)。

但是,我們往往只有一個(gè)包含m個(gè)觀測(cè)的數(shù)據(jù)集D,我們既要用它進(jìn)行訓(xùn)練,又要對(duì)它進(jìn)行測(cè)試。此時(shí),我們就需要對(duì)數(shù)據(jù)集D進(jìn)行劃分。

對(duì)于數(shù)據(jù)集D的劃分,我們盡量需要滿(mǎn)足三個(gè)要求:

  1. 訓(xùn)練集樣本量充足

  2. 訓(xùn)練模型時(shí)的計(jì)算量可以忍受

  3. 不同的劃分方式會(huì)得出不同的訓(xùn)練集和測(cè)試集,從而得出不同的結(jié)果,我們需要消除這種影響

我們將分別介紹留出法、交叉驗(yàn)證法,以及各自的python實(shí)現(xiàn)。自助法(bootstrapping)將在下篇中加以介紹。

 1.留出法    

留出法是最常用最直接最簡(jiǎn)單的方法,它直接將數(shù)據(jù)集D拆分成兩個(gè)互斥的集合,其中一個(gè)作為訓(xùn)練集R,另一個(gè)作為測(cè)試集T。 即          

B{%SXKT5{_$9@N{1UKY2)II.png  

在使用留出法時(shí),需要注意:

  1. 要有足夠的樣本量,以保證訓(xùn)練模型的效果

  2. 在劃分時(shí)注意保證數(shù)據(jù)分布的一致性(如:500個(gè)樣本中正例和反例的比為2:3,則在訓(xùn)練集和測(cè)試集中正例和反例的比也要求為2:3),只需要采用隨機(jī)分層抽樣即可

  3. 為了減弱隨機(jī)劃分的影響,重復(fù)劃分訓(xùn)練集和測(cè)試集,對(duì)得到的多次結(jié)果取平均作為最后的結(jié)果

  4. 一般訓(xùn)練集和測(cè)試集的比例在8:2或者7:3

當(dāng)然留出法的缺點(diǎn)也非常明顯,即          它會(huì)損失一定的樣本信息;同時(shí)需要大樣本            。

python實(shí)現(xiàn)留出法,只需要使用sklearn包就可以

from sklearn.model_selection import train_test_split
#使用train_test_split劃分訓(xùn)練集和測(cè)試集
train_X , test_X, train_Y ,test_Y = train_test_split(
  X, Y, test_size=0.2,random_state=0)
''' 
X為原始數(shù)據(jù)的自變量,Y為原始數(shù)據(jù)因變量;
train_X,test_X是將X按照8:2劃分所得;
train_Y,test_Y是將X按照8:2劃分所得;
test_size是劃分比例;
random_state設(shè)置是否使用隨機(jī)數(shù)
'''

 2.交叉驗(yàn)證法    

交叉驗(yàn)證法(cross validation)可以很好地解決留出法的問(wèn)題,它對(duì)數(shù)據(jù)量的要求不高,并且樣本信息損失不多。

交叉驗(yàn)證法先將數(shù)據(jù)集D劃分為k個(gè)大小相似的互斥子集,即

QJ7V1$4E~$E1@U0_M{HA9TX.png     

為了保證數(shù)據(jù)分布的一致性,從D中隨機(jī)分層抽樣即可。

之后,每次都用k-1個(gè)子集的并集作為訓(xùn)練集,余下的那個(gè)子集作為測(cè)試集,這樣我們就可以獲得k組訓(xùn)練/測(cè)試集,從而進(jìn)行k次訓(xùn)練和測(cè)試,最終返回這k組測(cè)試的均值。

具體說(shuō)來(lái),我們以k=10為例:          
  第一次我們選取第10份數(shù)據(jù)為測(cè)試集,前9份為訓(xùn)練集;          
  第二次我們選取第9份數(shù)據(jù)為測(cè)試集,第1-8和10為訓(xùn)練集;          
  …          
  第十次我們選取第1份數(shù)據(jù)為測(cè)試集,第2-9為訓(xùn)練集;          
  由此,我們共獲得10組訓(xùn)練集和測(cè)試集,進(jìn)行10次訓(xùn)練和測(cè)試,最終返回10次測(cè)試結(jié)果的均值。

顯然,交叉驗(yàn)證法結(jié)果的穩(wěn)定性和保真性很大程度取決于k的選擇,為了強(qiáng)調(diào)這一點(diǎn),交叉驗(yàn)證法也稱(chēng)作“k折交叉驗(yàn)證法”,k最常取的是10,也有取5或者20的。

 

同時(shí),我們也需要避免由于數(shù)據(jù)劃分的隨機(jī)性造成的誤差,我們可以重復(fù)進(jìn)行p次實(shí)驗(yàn)。          

p次k折交叉驗(yàn)證法,相當(dāng)于做了pk次留出法(比例為k-1:1)

python實(shí)現(xiàn)交叉驗(yàn)證法,只需要使用sklearn包就可以。注意,函數(shù)返回的是樣本序號(hào)。

import pandas as pd
from sklearn.model_selection import KFold

data = pd.read_excel('') #導(dǎo)入數(shù)據(jù)
kf = KFold(n_splits = 4,shuffle = False,random_state = None) 
'''n_splits表示將數(shù)據(jù)分成幾份;shuffle和random_state表示是否隨機(jī)生成。
如果shuffle = False,random_state = None,重復(fù)運(yùn)行將產(chǎn)生同樣的結(jié)果;
如果shuffle = True,random_state = None,重復(fù)運(yùn)行將產(chǎn)生不同的結(jié)果;
如果shuffle = True,random_state = (一個(gè)數(shù)值),重復(fù)運(yùn)行將產(chǎn)生相同的結(jié)果;
'''
for train, test in kf.split(data):
 print("%s %s" % (train, test))
 '''
 結(jié)果
[ 5 6 7 8 9 10 11 12 13 14 15 16 17 18] [0 1 2 3 4]
[ 0 1 2 3 4 10 11 12 13 14 15 16 17 18] [5 6 7 8 9]
[ 0 1 2 3 4 5 6 7 8 9 15 16 17 18] [10 11 12 13 14]
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] [15 16 17 18]
'''

如果想對(duì)數(shù)據(jù)集重復(fù)幾次使用交叉驗(yàn)證法劃分的話,使用RepeatedKFold函數(shù)即可,其中多了一個(gè)參數(shù)n_repeats

與留出法相比,交叉驗(yàn)證法的數(shù)據(jù)損失較小,更加適合于小樣本,但是其計(jì)算復(fù)雜度變高,存儲(chǔ)空間變大。極端的說(shuō)來(lái),如果將數(shù)據(jù)集D(m個(gè)樣本)分成m份,每次都取m-1個(gè)樣本為訓(xùn)練集,余下的那一個(gè)為測(cè)試集。共進(jìn)行m次訓(xùn)練和測(cè)試。這種方法被叫做留一法。

留一法的優(yōu)點(diǎn)顯而易見(jiàn),其數(shù)據(jù)損失只有一個(gè)樣本,并且不會(huì)受到樣本隨即劃分的影響。但是,其計(jì)算復(fù)雜度過(guò)高,空間存儲(chǔ)占用過(guò)大。

python實(shí)現(xiàn)交叉驗(yàn)證法,只需要使用sklearn包就可以

from sklearn.model_selection import LeaveOneOut

X = [1, 2, 3, 4]
loo = LeaveOneOut()
for train, test in loo.split(data):
 print("%s %s" % (train, test))
'''結(jié)果
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]
'''

綜上所述:

  1. 當(dāng)我們數(shù)據(jù)量足夠時(shí),選擇留出法簡(jiǎn)單省時(shí),在犧牲很小的準(zhǔn)確度的情況下,換取計(jì)算的簡(jiǎn)便;

  2. 當(dāng)我們的數(shù)據(jù)量較小時(shí),我們應(yīng)該選擇交叉驗(yàn)證法,因?yàn)榇藭r(shí)劃分樣本集將會(huì)使訓(xùn)練數(shù)據(jù)過(guò)少;

  3. 當(dāng)我們的數(shù)據(jù)量特別少的時(shí)候,我們可以考慮留一法。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。          

 


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 开远市| 兰坪| 故城县| 昆山市| 松阳县| 阳春市| 根河市| 壤塘县| 沿河| 泾源县| 泽库县| 五大连池市| 连平县| 高邑县| 南溪县| 井冈山市| 泗阳县| 田林县| 浦东新区| 湖南省| 恩平市| 兴仁县| 东阳市| 政和县| 正阳县| 凤阳县| 重庆市| 得荣县| 蓬溪县| 舟山市| 锡林浩特市| 茶陵县| 海伦市| 开远市| 卫辉市| 赤峰市| 民和| 县级市| 红桥区| 合作市| 修水县|