您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關python實現K折交叉驗證出現的問題以及KFold和StratifiedKFold的區別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
訓練集和測試集的劃分方法很大程度上影響最終的模型與參數的值。一般情況將K折交叉驗證用于模型調優,找到使得模型泛化性能最優的超參值,同時可以測試當前模型算法的性能。
k值大時,在每次迭代過程中將會有更多的數據用于模型訓練,能夠得到最小偏差,同時算法時間延長。
k值小時,降低模型在不同的數據塊上進行重復擬合的性能評估的計算成本,在平均性能的基礎上獲得模型的準確評估。
通常用以下模塊實現
from sklearn.model_selection import KFold,StratifiedKFold
StratifiedKFold參數說明:
class sklearn.model_selection.StratifiedKFold(n_splits=’warn’, shuffle=False, random_state=None)n_splits:表示幾折(折疊的數量)shuffle== True:選擇是否在分割成批次之前對數據的每個分層進行打亂。 供5次2折使用,這樣每次的數據是進行打亂的,否則,每次取得的數據是相同的random_state:控制隨機狀態,隨機數生成器使用的種子
兩注意點:
1.kf.split(x)
返回的是數據集的索引,需要x[train_index]
才能提取數據
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("--------二折時,測試集變成了訓練集分割線--------")train_index: [1 2 3]train_data: [[2 2] [3 3] [4 4]]test_index [0 4 5]--------二折時,測試集變成了訓練集分割線--------train_index: [0 4 5]train_data: [[1 1] [5 5] [6 6]]test_index [1 2 3]--------二折時,測試集變成了訓練集分割線--------
Stratified是分層采樣的意思,確保訓練集,測試集中各類別樣本的比例與原始數據集中相同。
下面這個例子6個數據對應6個標簽,我們分成三折,則每次訓練時,4個數據為train,2個數據為test。
StratifiedKFold能保證樣本的比例與原始數據集中相同,即不會出現train_index=[0,1,2,3] train_label=[1,1,1,0]
test_index=[4,5] test_label=[0,0]-----數據分布偏頗現象
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("--------二折時,測試集成了訓練集分割線--------")train_index: [0 1 4 5]test_index [2 3]--------二折時,測試集成了訓練集分割線--------train_index: [0 2 3 5]test_index [1 4]--------二折時,測試集成了訓練集分割線--------train_index: [1 2 3 4]test_index [0 5]--------二折時,測試集成了訓練集分割線--------
為什么需要用到這樣一個參數random_state(隨機狀態)?
1、在構建模型時: forest = RandomForestClassifier(n_estimators=100, random_state=0)forest.fit(X_train, y_train)2、在生成數據集時: X, y = make_moons(n_samples=100, noise=0.25, random_state=3)3、在拆分數據集為訓練集、測試集時: X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42)
如果不設置random_state的話,則每次構建的模型是不同的。
每次生成的數據集是不同的,每次拆分出的訓練集、測試集是不同的,所以根據需求而定。
以上就是python實現K折交叉驗證出現的問題以及KFold和StratifiedKFold的區別是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。