本篇文章給大家分享的是有關(guān)python實(shí)現(xiàn)K折交叉驗(yàn)證出現(xiàn)的問題以及KFold和StratifiedKFold的區(qū)別是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
10年積累的成都網(wǎng)站建設(shè)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有臨澤免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
訓(xùn)練集和測試集的劃分方法很大程度上影響最終的模型與參數(shù)的值。一般情況將K折交叉驗(yàn)證用于模型調(diào)優(yōu),找到使得模型泛化性能最優(yōu)的超參值,同時(shí)可以測試當(dāng)前模型算法的性能。
k值大時(shí),在每次迭代過程中將會(huì)有更多的數(shù)據(jù)用于模型訓(xùn)練,能夠得到最小偏差,同時(shí)算法時(shí)間延長。
k值小時(shí),降低模型在不同的數(shù)據(jù)塊上進(jìn)行重復(fù)擬合的性能評(píng)估的計(jì)算成本,在平均性能的基礎(chǔ)上獲得模型的準(zhǔn)確評(píng)估。
通常用以下模塊實(shí)現(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:選擇是否在分割成批次之前對(duì)數(shù)據(jù)的每個(gè)分層進(jìn)行打亂。 供5次2折使用,這樣每次的數(shù)據(jù)是進(jìn)行打亂的,否則,每次取得的數(shù)據(jù)是相同的random_state:控制隨機(jī)狀態(tài),隨機(jī)數(shù)生成器使用的種子
兩注意點(diǎn):
1.kf.split(x)
返回的是數(shù)據(jù)集的索引,需要x[train_index]
才能提取數(shù)據(jù)
2.shuffle=True
時(shí),shuffle(洗牌的意思),每次run代碼是,隨機(jī)取得的索引是不同的。反之,所以不變。
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("--------二折時(shí),測試集變成了訓(xùn)練集分割線--------")train_index: [1 2 3]train_data: [[2 2] [3 3] [4 4]]test_index [0 4 5]--------二折時(shí),測試集變成了訓(xùn)練集分割線--------train_index: [0 4 5]train_data: [[1 1] [5 5] [6 6]]test_index [1 2 3]--------二折時(shí),測試集變成了訓(xùn)練集分割線--------
Stratified是分層采樣的意思,確保訓(xùn)練集,測試集中各類別樣本的比例與原始數(shù)據(jù)集中相同。
下面這個(gè)例子6個(gè)數(shù)據(jù)對(duì)應(yīng)6個(gè)標(biāo)簽,我們分成三折,則每次訓(xùn)練時(shí),4個(gè)數(shù)據(jù)為train,2個(gè)數(shù)據(jù)為test。
StratifiedKFold能保證樣本的比例與原始數(shù)據(jù)集中相同,即不會(huì)出現(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("--------二折時(shí),測試集成了訓(xùn)練集分割線--------")train_index: [0 1 4 5]test_index [2 3]--------二折時(shí),測試集成了訓(xùn)練集分割線--------train_index: [0 2 3 5]test_index [1 4]--------二折時(shí),測試集成了訓(xùn)練集分割線--------train_index: [1 2 3 4]test_index [0 5]--------二折時(shí),測試集成了訓(xùn)練集分割線--------
為什么需要用到這樣一個(gè)參數(shù)random_state(隨機(jī)狀態(tài))?
1、在構(gòu)建模型時(shí): forest = RandomForestClassifier(n_estimators=100, random_state=0)forest.fit(X_train, y_train)2、在生成數(shù)據(jù)集時(shí): X, y = make_moons(n_samples=100, noise=0.25, random_state=3)3、在拆分?jǐn)?shù)據(jù)集為訓(xùn)練集、測試集時(shí): 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實(shí)現(xiàn)K折交叉驗(yàn)證出現(xiàn)的問題以及KFold和StratifiedKFold的區(qū)別是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。