程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python中的KFold與StratifiedKFold

編輯:Python

skearn做數據集的處理需要用到這兩個比較重要的函數:KFold與StratifiedKFold,作用是在機器學習中進行交叉驗證來使用。
這兩個函數都是sklearn模塊中的,在應用之前應該導入:

from sklearn.model_selection import StratifiedKFold,KFold

兩者的區別:

StratifiedKFold函數采用分層劃分的方法(分層隨機抽樣思想),確保訓練集、測試集中各類別樣本的比例與原始數據集中相同。故StratifiedKFold在做劃分的時候需要傳入標簽特征。

1、KFold函數

參數說明:

n_splits: 默認為3,表示將數據劃分為多少份,即k折交叉驗證中的k;
shuffle: 默認為False,表示是否需要打亂順序,這個參數在很多的函數中都會涉及,如果設置為True,則會先打亂順序再做劃分,如果為False,會直接按照順序做劃分;
random_state: 默認為None,表示隨機數的種子,只有當shuffle設置為True的時候才會生效。

代碼:

import numpy as np
from sklearn.model_selection import KFold,StratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4],[5,9],[1,5],[3,9],[5,8],[1,1],[1,4]])
y = np.array([0, 1, 1, 1, 0, 0, 1, 0, 0, 0])
print('X:',X)
print('y:',y)
seed = 7
np.random.seed(seed)
kf = KFold(n_splits=3, shuffle=False)
print(kf)
#做split時只需傳入數據,不需要傳入標簽
for train_index, test_index in kf.split(X):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]

輸出:

X: [[1 2]
[3 4]
[1 2]
[3 4]
[5 9]
[1 5]
[3 9]
[5 8]
[1 1]
[1 4]]
y: [0 1 1 1 0 0 1 0 0 0]
KFold(n_splits=3, random_state=None, shuffle=False)
TRAIN: [4 5 6 7 8 9] TEST: [0 1 2 3]
TRAIN: [0 1 2 3 7 8 9] TEST: [4 5 6]
TRAIN: [0 1 2 3 4 5 6] TEST: [7 8 9]

輸出說明:
大家注意到,輸出中每個Train和Test都對應三個結果,是因為我們在調用函數是,參數n_splits=3,即交叉驗證三次。其中的數字只是對應索引,並不是真正的數據,比如第一行TEST: [0 1 2 3]代表著:測試集選取了X[0,1,2,3]即對應:
[1 2]
[3 4]
[1 2]
[3 4]
其他同理。 

 split(X, y)函數參數:

split(X, y):
X:array-like,shape(n_sample,n_features),訓練數據集。
y:array-like,shape(n_sample),標簽。
返回值:訓練集數據的index與驗證集數據的index。

2、StratifiedKFold函數

StratifiedKFold函數的參數與KFold相同。

import numpy as np
from sklearn.model_selection import KFold,StratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4],[5,9],[1,5],[3,9],[5,8],[1,1],[1,4]])
y = np.array([0, 1, 1, 1, 0, 0, 1, 0, 0, 0])
print('X:',X)
print('y:',y)
skf = StratifiedKFold(n_splits=4)
print(skf)
#做劃分是需要同時傳入數據集和標簽
for train_index, test_index in skf.split(X, y):
print('TRAIN:', train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]

輸出:

X: [[1 2]
[3 4]
[1 2]
[3 4]
[5 9]
[1 5]
[3 9]
[5 8]
[1 1]
[1 4]]
y: [0 1 1 1 0 0 1 0 0 0]
StratifiedKFold(n_splits=4, random_state=None, shuffle=False)
TRAIN: [2 3 5 6 7 8 9] TEST: [0 1 4]
TRAIN: [0 1 3 4 6 8 9] TEST: [2 5 7]
TRAIN: [0 1 2 4 5 6 7 9] TEST: [3 8]
TRAIN: [0 1 2 3 4 5 7 8] TEST: [6 9]

3、疑問:

(1) 分隔時skf.split(X,y)的輸出到底是個什麼東西?
(2) 為什麼可以用for循環去讀取?

python中的生成器(generator)

python中的生成器(generator)總結_Python 學習者的博客-CSDN博客_python的generator

參考:KFold與StratifiedKFold_ZhangJingHuaJYO的博客-CSDN博客


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved