溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python實現(xiàn)K折交叉驗證出現(xiàn)的問題以及KFold和StratifiedKFold的區(qū)別是什么

發(fā)布時間:2021-12-04 09:09:42 來源:億速云 閱讀:200 作者:柒染 欄目:云計算

本篇文章給大家分享的是有關(guān)python實現(xiàn)K折交叉驗證出現(xiàn)的問題以及KFold和StratifiedKFold的區(qū)別是什么,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

訓(xùn)練集和測試集的劃分方法很大程度上影響最終的模型與參數(shù)的值。一般情況將K折交叉驗證用于模型調(diào)優(yōu),找到使得模型泛化性能最優(yōu)的超參值,同時可以測試當(dāng)前模型算法的性能。
python實現(xiàn)K折交叉驗證出現(xiàn)的問題以及KFold和StratifiedKFold的區(qū)別是什么
k值大時,在每次迭代過程中將會有更多的數(shù)據(jù)用于模型訓(xùn)練,能夠得到最小偏差,同時算法時間延長。
k值小時,降低模型在不同的數(shù)據(jù)塊上進行重復(fù)擬合的性能評估的計算成本,在平均性能的基礎(chǔ)上獲得模型的準(zhǔn)確評估。

二折實現(xiàn)代碼

通常用以下模塊實現(xiàn)

from sklearn.model_selection import KFold,StratifiedKFold

StratifiedKFold參數(shù)說明:

class sklearn.model_selection.StratifiedKFold(n_splits=’warn’, shuffle=False, random_state=None)n_splits:表示幾折(折疊的數(shù)量)shuffle== True:選擇是否在分割成批次之前對數(shù)據(jù)的每個分層進行打亂。   供5次2折使用,這樣每次的數(shù)據(jù)是進行打亂的,否則,每次取得的數(shù)據(jù)是相同的random_state:控制隨機狀態(tài),隨機數(shù)生成器使用的種子

兩注意點:
1.kf.split(x)返回的是數(shù)據(jù)集的索引,需要x[train_index]才能提取數(shù)據(jù)
2.shuffle=True時,shuffle(洗牌的意思),每次run代碼是,隨機取得的索引是不同的。反之,所以不變。

import numpy as npfrom sklearn.model_selection import KFold,StratifiedKFold
x = np.array([[1, 1], [2, 2], [3, 3], [4, 4],[5,5],[6,6]])kf = KFold(n_splits=2,shuffle=True)for train_index, test_index in kf.split(x):print('train_index:', train_index)print("train_data:",x[train_index])print('test_index', test_index)print("--------二折時,測試集變成了訓(xùn)練集分割線--------")train_index: [1 2 3]train_data: [[2 2]
 [3 3]
 [4 4]]test_index [0 4 5]--------二折時,測試集變成了訓(xùn)練集分割線--------train_index: [0 4 5]train_data: [[1 1]
 [5 5]
 [6 6]]test_index [1 2 3]--------二折時,測試集變成了訓(xùn)練集分割線--------

KFold和StratifiedKFold的區(qū)別

Stratified是分層采樣的意思,確保訓(xùn)練集,測試集中各類別樣本的比例與原始數(shù)據(jù)集中相同。
下面這個例子6個數(shù)據(jù)對應(yīng)6個標(biāo)簽,我們分成三折,則每次訓(xùn)練時,4個數(shù)據(jù)為train,2個數(shù)據(jù)為test。

StratifiedKFold能保證樣本的比例與原始數(shù)據(jù)集中相同,即不會出現(xiàn)train_index=[0,1,2,3] train_label=[1,1,1,0]
test_index=[4,5] test_label=[0,0]-----數(shù)據(jù)分布偏頗現(xiàn)象

import numpy as npfrom sklearn.model_selection import KFold,StratifiedKFold

x = np.array([[1, 1], [2, 2], [3, 3], [4, 4],[5,5],[6,6]])y=np.array([1,1,1,0,0,0])kf = StratifiedKFold(n_splits=3,shuffle=True)for train_index, test_index in kf.split(x,y):print('train_index:', train_index)print('test_index', test_index)print("--------二折時,測試集成了訓(xùn)練集分割線--------")train_index: [0 1 4 5]test_index [2 3]--------二折時,測試集成了訓(xùn)練集分割線--------train_index: [0 2 3 5]test_index [1 4]--------二折時,測試集成了訓(xùn)練集分割線--------train_index: [1 2 3 4]test_index [0 5]--------二折時,測試集成了訓(xùn)練集分割線--------

random_state(隨機狀態(tài))

為什么需要用到這樣一個參數(shù)random_state(隨機狀態(tài))?

1、在構(gòu)建模型時:
forest = RandomForestClassifier(n_estimators=100, random_state=0)forest.fit(X_train, y_train)2、在生成數(shù)據(jù)集時:
X, y = make_moons(n_samples=100, noise=0.25, random_state=3)3、在拆分?jǐn)?shù)據(jù)集為訓(xùn)練集、測試集時:
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42)

如果不設(shè)置random_state的話,則每次構(gòu)建的模型是不同的。
每次生成的數(shù)據(jù)集是不同的,每次拆分出的訓(xùn)練集、測試集是不同的,所以根據(jù)需求而定。

以上就是python實現(xiàn)K折交叉驗證出現(xiàn)的問題以及KFold和StratifiedKFold的區(qū)別是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI