一、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]