亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

詳解python實現交叉驗證法與留出法

系統 4788 0

在機器學習中,我們經常在訓練集上訓練模型,在測試集上測試模型。最終的目標是希望我們的模型在測試集上有最好的表現。

但是,我們往往只有一個包含m個觀測的數據集D,我們既要用它進行訓練,又要對它進行測試。此時,我們就需要對數據集D進行劃分。

對于數據集D的劃分,我們盡量需要滿足三個要求:

  1. 訓練集樣本量充足

  2. 訓練模型時的計算量可以忍受

  3. 不同的劃分方式會得出不同的訓練集和測試集,從而得出不同的結果,我們需要消除這種影響

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

 1.留出法    

留出法是最常用最直接最簡單的方法,它直接將數據集D拆分成兩個互斥的集合,其中一個作為訓練集R,另一個作為測試集T。 即          

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

在使用留出法時,需要注意:

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

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

  3. 為了減弱隨機劃分的影響,重復劃分訓練集和測試集,對得到的多次結果取平均作為最后的結果

  4. 一般訓練集和測試集的比例在8:2或者7:3

當然留出法的缺點也非常明顯,即          它會損失一定的樣本信息;同時需要大樣本            。

python實現留出法,只需要使用sklearn包就可以

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

 2.交叉驗證法    

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

交叉驗證法先將數據集D劃分為k個大小相似的互斥子集,即

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

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

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

具體說來,我們以k=10為例:          
  第一次我們選取第10份數據為測試集,前9份為訓練集;          
  第二次我們選取第9份數據為測試集,第1-8和10為訓練集;          
  …          
  第十次我們選取第1份數據為測試集,第2-9為訓練集;          
  由此,我們共獲得10組訓練集和測試集,進行10次訓練和測試,最終返回10次測試結果的均值。

顯然,交叉驗證法結果的穩定性和保真性很大程度取決于k的選擇,為了強調這一點,交叉驗證法也稱作“k折交叉驗證法”,k最常取的是10,也有取5或者20的。

 

同時,我們也需要避免由于數據劃分的隨機性造成的誤差,我們可以重復進行p次實驗。          

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

python實現交叉驗證法,只需要使用sklearn包就可以。注意,函數返回的是樣本序號。

import pandas as pd
from sklearn.model_selection import KFold

data = pd.read_excel('') #導入數據
kf = KFold(n_splits = 4,shuffle = False,random_state = None) 
'''n_splits表示將數據分成幾份;shuffle和random_state表示是否隨機生成。
如果shuffle = False,random_state = None,重復運行將產生同樣的結果;
如果shuffle = True,random_state = None,重復運行將產生不同的結果;
如果shuffle = True,random_state = (一個數值),重復運行將產生相同的結果;
'''
for train, test in kf.split(data):
 print("%s %s" % (train, test))
 '''
 結果
[ 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]
'''

如果想對數據集重復幾次使用交叉驗證法劃分的話,使用RepeatedKFold函數即可,其中多了一個參數n_repeats

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

留一法的優點顯而易見,其數據損失只有一個樣本,并且不會受到樣本隨即劃分的影響。但是,其計算復雜度過高,空間存儲占用過大。

python實現交叉驗證法,只需要使用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))
'''結果
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]
'''

綜上所述:

  1. 當我們數據量足夠時,選擇留出法簡單省時,在犧牲很小的準確度的情況下,換取計算的簡便;

  2. 當我們的數據量較小時,我們應該選擇交叉驗證法,因為此時劃分樣本集將會使訓練數據過少;

  3. 當我們的數據量特別少的時候,我們可以考慮留一法。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。          

 


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 波多野结衣免费免费视频一区 | 国产亚洲自在精品久久 | 久久99精品久久久 | 久久精品网址 | 亚洲最大综合网 | 日韩看片网站 | 老司机深夜免费福利 | 国产亚洲欧美一区二区 | 看一级毛片一区二区三区免费 | 久久久久久久综合日本亚洲 | 亚洲一区二区三区在线网站 | 色婷婷综合在线 | 久久成人免费 | 国产精品一区三区 | 激情五月色婷婷丁香伊人 | 日本黄大片影院一区二区 | 69性影院在线观看国产精品87 | 欧美成人免费午夜影视 | 欧美一级午夜免费视频你懂的 | 久久婷婷是五月综合色狠狠 | 久久艹精品| 四虎影视黄色 | 99久热国产精品视频尤物不卡 | 一级美国乱色毛片 | 久久久久久不卡 | 欧美黑人巨大肥婆性视频 | 亚洲精品免费在线视频 | 日本一级毛片免费 | 奇米影视777俺要去888 | 国产1区二区 | 日本特黄a级高清免费大片18 | 草草在线观看视频 | 国产成人一区二区视频在线观看 | 日韩欧美国产高清在线观看 | 精品一区二区三区色花堂 | 亚洲精美视频 | 黄色a∨ | 亚洲精品国产免费 | 四虎网站网址 | 日本亚洲成高清一区二区三区 | 亚洲一区日韩 |