Python-sklearn包中StratifiedKFold和KFold生成交叉驗證數據集的區別

一、StratifiedKFold及KFold主要區別及函數參數
KFold交叉採樣:將訓練/測試數據集劃分n_splits個互斥子集,每次只用其中一個子集當做測試集,剩下的(n_splits-1)作爲訓練集,進行n_splits次實驗並得到n_splits個結果。
注:對於不能均等分的數據集,前n_samples%n_spllits子集擁有n_samples//n_spllits+1個樣本,其餘子集都只有n_samples//n_spllits個樣本。(例10行數據分3份,只有一份可分4行,其他均爲3行)

sklearn.model_selection.KFold(n_splits=3,shuffle=False,random_state=None)

n_splits:表示將數據劃分幾等份
shuffle:在每次劃分時,是否進行洗牌
若爲False,其效果相當於random_state爲整數(含零),每次劃分的結果相同
若爲True,每次劃分的結果不一樣,表示經過洗牌,隨機取樣的
random_state:隨機種子數,當設定值(一般爲0)後可方便調參,因爲每次生成的數據集相同

StratifiedKFold分層採樣,用於交叉驗證:與KFold最大的差異在於,StratifiedKFold方法是根據標籤中不同類別佔比來進行拆分數據的。

sklearn.model_selection.StratifiedKFold(n_splits=3,shuffle=False,random_state=None)

參數含義同KFold。

二、實例分析兩者差別
首先生成8行數據(含特徵和標籤數據)

import numpy as np
from sklearn.model_selection import StratifiedKFold,KFold

X=np.array([
    [1,2,3,4],
    [11,12,13,14],
    [21,22,23,24],
    [31,32,33,34],
    [41,42,43,44],
    [51,52,53,54],
    [61,62,63,64],
    [71,72,73,74]
])
 
y=np.array([1,1,0,0,1,1,0,0])

利用KFold方法交叉採樣:按順序分別取第1-2、3-4、5-6和7-8的數據

#按順序分別取第1-2、3-4、5-6和7-8的數據。
kfolder = KFold(n_splits=4,random_state=1)
for train, test in kfolder.split(X,y):
    print('Train: %s | test: %s' % (train, test),'\n')
>>>
Train: [2 3 4 5 6 7] | test: [0 1]
Train: [0 1 4 5 6 7] | test: [2 3]
Train: [0 1 2 3 6 7] | test: [4 5]
Train: [0 1 2 3 4 5] | test: [6 7]

利用StratifiedKFold方法分層採樣:依照標籤的比例來抽取數據,本案例集標籤0和1的比例是1:1,因此在抽取數據時也是按照標籤比例1:1來提取的

#依照標籤的比例來抽取數據,本案例集標籤0和1的比例是1:1
#因此在抽取數據時也是按照標籤比例1:1來提取的
sfolder = StratifiedKFold(n_splits=4,random_state=0)
for train, test in sfolder.split(X,y):
    print('Train: %s | test: %s' % (train, test))
>>>
Train: [1 3 4 5 6 7] | test: [0 2]
Train: [0 2 4 5 6 7] | test: [1 3]
Train: [0 1 2 3 5 7] | test: [4 6]
Train: [0 1 2 3 4 6] | test: [5 7]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章