欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2019年07月11日 10:48:31   作者:海軍上將光之翼  
這篇文章主要介紹了詳解python實現(xiàn)交叉驗證法與留出法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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

  1. 訓(xùn)練集樣本量充足
  2. 訓(xùn)練模型時的計算量可以忍受
  3. 不同的劃分方式會得出不同的訓(xùn)練集和測試集,從而得出不同的結(jié)果,我們需要消除這種影響

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

1.留出法

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

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

  1. 要有足夠的樣本量,以保證訓(xùn)練模型的效果
  2. 在劃分時注意保證數(shù)據(jù)分布的一致性(如:500個樣本中正例和反例的比為2:3,則在訓(xùn)練集和測試集中正例和反例的比也要求為2:3),只需要采用隨機分層抽樣即可
  3. 為了減弱隨機劃分的影響,重復(fù)劃分訓(xùn)練集和測試集,對得到的多次結(jié)果取平均作為最后的結(jié)果
  4. 一般訓(xùn)練集和測試集的比例在8:2或者7:3

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

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

from sklearn.model_selection import train_test_split
#使用train_test_split劃分訓(xùn)練集和測試集
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è)置是否使用隨機數(shù)
'''

2.交叉驗證法

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

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

 

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

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

具體說來,我們以k=10為例:
第一次我們選取第10份數(shù)據(jù)為測試集,前9份為訓(xùn)練集;
第二次我們選取第9份數(shù)據(jù)為測試集,第1-8和10為訓(xùn)練集;

第十次我們選取第1份數(shù)據(jù)為測試集,第2-9為訓(xùn)練集;
由此,我們共獲得10組訓(xùn)練集和測試集,進(jìn)行10次訓(xùn)練和測試,最終返回10次測試結(jié)果的均值。

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

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

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

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

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表示是否隨機生成。
如果shuffle = False,random_state = None,重復(fù)運行將產(chǎn)生同樣的結(jié)果;
如果shuffle = True,random_state = None,重復(fù)運行將產(chǎn)生不同的結(jié)果;
如果shuffle = True,random_state = (一個數(shù)值),重復(fù)運行將產(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]
'''

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

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

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

python實現(xià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ù)量足夠時,選擇留出法簡單省時,在犧牲很小的準(zhǔn)確度的情況下,換取計算的簡便;
  2. 當(dāng)我們的數(shù)據(jù)量較小時,我們應(yīng)該選擇交叉驗證法,因為此時劃分樣本集將會使訓(xùn)練數(shù)據(jù)過少;
  3. 當(dāng)我們的數(shù)據(jù)量特別少的時候,我們可以考慮留一法。

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

相關(guān)文章

  • Python中byte字符串轉(zhuǎn)string的實現(xiàn)

    Python中byte字符串轉(zhuǎn)string的實現(xiàn)

    本文主要介紹了Python中byte字符串轉(zhuǎn)string的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • python中列表的含義及用法

    python中列表的含義及用法

    在本篇文章里小編給大家分享的是關(guān)于python中列表的含義及用法,需要的朋友們可以參考學(xué)習(xí)下。
    2020-05-05
  • Python采集貓眼兩萬條數(shù)據(jù) 對《無名之輩》影評進(jìn)行分析

    Python采集貓眼兩萬條數(shù)據(jù) 對《無名之輩》影評進(jìn)行分析

    這篇文章主要給大家介紹了關(guān)于利用Python榮國采集兩萬條貓眼數(shù)據(jù),對《無名之輩》影評進(jìn)行分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • python函數(shù)的高級應(yīng)用詳解

    python函數(shù)的高級應(yīng)用詳解

    這篇文章主要為大家介紹了python函數(shù)的高級應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • python文件操作seek()偏移量,讀取指正到指定位置操作

    python文件操作seek()偏移量,讀取指正到指定位置操作

    這篇文章主要介紹了python文件操作seek()偏移量,讀取指正到指定位置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • SpringBoot中的@MessageMapping注解詳解

    SpringBoot中的@MessageMapping注解詳解

    這篇文章主要介紹了SpringBoot中的@MessageMapping注解詳解,Spring Boot 提供了對 WebSocket 的支持,其中 @MessageMapping 注解是一個常用的注解,它可以將一個 Java 方法標(biāo)記為 WebSocket 的消息處理器,需要的朋友可以參考下
    2023-08-08
  • Python中處理時間的幾種方法小結(jié)

    Python中處理時間的幾種方法小結(jié)

    這篇文章主要介紹了Python中處理時間的幾種方法,包括時間的獲取和時間之間的轉(zhuǎn)換等等,需要的朋友可以參考下
    2015-04-04
  • 詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例

    詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例

    這篇文章主要介紹了詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例的相關(guān)資料,這里使用了線程知識,隊列知識及循環(huán)的知識,需要的朋友可以參考下
    2017-08-08
  • python實現(xiàn)根據(jù)給定坐標(biāo)點生成多邊形mask的例子

    python實現(xiàn)根據(jù)給定坐標(biāo)點生成多邊形mask的例子

    今天小編就為大家分享一篇python實現(xiàn)根據(jù)給定坐標(biāo)點生成多邊形mask的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 查看python下OpenCV版本的方法

    查看python下OpenCV版本的方法

    今天小編就為大家分享一篇查看python下OpenCV版本的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評論