您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(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)前模型算法的性能。
k值大時,在每次迭代過程中將會有更多的數(shù)據(jù)用于模型訓(xùn)練,能夠得到最小偏差,同時算法時間延長。
k值小時,降低模型在不同的數(shù)據(jù)塊上進行重復(fù)擬合的性能評估的計算成本,在平均性能的基礎(chǔ)上獲得模型的準(zhǔ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)練集分割線--------
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)練集分割線--------
為什么需要用到這樣一個參數(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è)資訊頻道。
免責(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)容。