Kaggle知識點:交叉驗證常見的6個錯誤

交叉驗證是保證模型有效的方法,同時也是防止模型過擬合的方法。但在有限的數據集中,交叉驗證容易出現一些錯誤使用。

本文將介紹在使用交叉驗證中,常見的一些錯誤情況,希望讀者在閱讀後可以避免再次犯錯。

什麽是交叉驗證?

交叉驗證(Cross-Validation)是驗證模型有效性的方法,具體(ti) 的實踐流程如下:

  • 步驟1:數據集劃分為K份,其中K-1份作為訓練集,剩餘1份作為驗證集。
  • 步驟2:訓練集並記錄驗證集精度。
  • 步驟3:將操作上述循環K次。

Kaggle知識點:交叉驗證常見的6個(ge) 錯誤

交叉驗證與(yu) 按照比例劃分的方法,與(yu) 如下優(you) 點:

  • 交叉驗證可以驗證模型多次,減少了模型誤差中的偏差,驗證集精度更加可信。
  • 交叉驗證可以得到多個模型,在測試集上可以進行多次預測,增加預測結果的多樣性。

錯誤1:選擇錯誤的折數

在交叉驗證中折數對應K值,是決(jue) 定了數據集應該劃分為(wei) 多少份,以及模型訓練多少次的設置。當然K值需要人工設置,一般設置為(wei) 5。

K值越小,模型訓練次數越少,但模型驗證集精度的偏差更大。K值一般不會(hui) 選擇2或者3。K值越大,模型訓練的次數越多,需要更多的計算量,但模型驗證集的偏差更小。但K值極少數會(hui) 大於(yu) 10。

當然選擇K值還需要考慮樣本的個(ge) 數,我們(men) 希望K值能反應模型驗證集精度。另一個(ge) 可選的方法是嚐試多個(ge) K值,然後查看模型精度是是否與(yu) K值相關(guan) 。

錯誤2:數據分布不同

在進行訓練與(yu) 驗證時,我們(men) 希望訓練集和驗證集分布保持一致。最直觀的分布是標簽分布,我們(men) 推薦使用StratifiedKFold來代替KFold。Kaggle知識點:交叉驗證常見的6個(ge) 錯誤當然也存在一些特殊情況,如果數據樣本按照對照組劃分,則在劃分時也需要考慮分組對照的情況,這裏則需要參考StratifiedGroupKfold。 Kaggle知識點:交叉驗證常見的6個(ge) 錯誤

上述劃分邏輯隻考慮到單個(ge) 類別情況下的劃分,更加複雜的還有數值標簽的劃分,以及多標簽下的情況。

如下演示數值標簽的劃分,可以將數值進行離散化分箱,然後繼續使用StratifiedKFold。

from sklearn.model_selection import StratifiedKFold def create_folds(df, n_grp, n_s=5):

df['Fold'] = -1 skf = StratifiedKFold(n_splits=n_s)
df['grp'] = pd.cut(df.target, n_grp, labels=False)
target = df.grp for fold_no, (t, v) in enumerate(skf.split(target, target)):
df.loc[v, 'Fold'] = fold_no return df

錯誤3:數據劃分後采樣

下采樣和上采樣是解決(jue) 樣本不均衡的常見操作,但如果遇到數據劃分,我們(men) 是先采樣再劃分驗證集,還是先劃分驗證集再采樣?

這裏推薦對驗證集不進行任何采樣,因為(wei) 驗證集本身是驗證模型的精度,用來反應模型的泛化能力。因此驗證集數據的分布應該是采樣之前的分布。

kfold = KFold(n_splits=n_splits) scores = [] for train,valid in kfold.split(data):         train_oversampled = oversample_function(train)         score = train_and_validate(train_oversampled,valid)         scores.append(score)

如果采樣是必不可少的一步,還是推薦先采樣再劃分驗證集,這樣至少訓練集和驗證集是同分布的。

錯誤4:過擬合驗證集

在我們(men) 進行特征工程時,經常會(hui) 編寫(xie) 如下邏輯的代碼:

  • 將訓練集和測試集拚接一起,進行PCA
  • 計算標簽編碼,然後劃分驗證集

上述操作都會(hui) 泄露標簽的信息,也就是有隱藏的Leak風險。舉(ju) 一個(ge) 例子,現在我們(men) 對用戶進行風險預測,如果按照用戶職業(ye) 進行標簽編碼,然後再劃分驗證集,這樣會(hui) 讓我們(men) 的驗證集精度虛高。

正確的做法是先將數據集劃分訓練集和驗證集,在訓練集上計算標簽編碼,然後在驗證集上進行映射。 不應該使用驗證集進行任何的特征提取和轉換過程。

錯誤5:亂序的時序劃分

在時間序列中,數據是按照次序出現的,因此我們(men) 在劃分驗證集時需要考慮時間的先後次序,將驗證集劃分在訓練集之後。當然可以直接參考TimeSeriesSplit劃分的邏輯。

Kaggle知識點:交叉驗證常見的6個(ge) 錯誤

在時序特征中,滯後特征是非常有效的一類。但也經常會(hui) 泄露驗證集信息。滯後特征應該在劃分驗證集之後,再進行操作。

錯誤6:數據劃分的隨機性

雖然數據劃分可以得到多個(ge) 模型,並減少模型驗證集的隨機性。但數據劃分的過程本身還是存在隨機性的。

如下代碼所示,我們(men) 在劃分數據集時可以考慮設置隨機種子,然後就可以固定數據劃分的邏輯。當然也可以訓練多次,得到更加穩定的驗證集結果。

SEEDS = [1, 2, 3, 4, 5] ScoreMetric = []

for seed in SEEDS:
seed_all(seed) # 設置所有seed kfold = KFold(n_splits=5, random_state=seed)
scores = []

for train,valid in kfold.split(data):
score = train_and_validate(train,valid)
scores.append(score)

ScoreMetric.append(scores)

【競賽報名/項目谘詢+微信:mollywei007】

上一篇

多倫多公立教育局30所接受國際生高中全介紹!

下一篇

新高一美本規劃方案:托福和SAT/ACT應該怎麽考?

你也可能喜歡

  • 暫無相關文章!

評論已經被關(guan) 閉。

插入圖片
返回頂部