Python 中的 K 折交叉驗證

Manav Narula 2023年1月30日
  1. 在 Python 中需要交叉驗證
  2. Python 中的 K 折交叉驗證
  3. 在 Python 中使用 sklearn.model_selection.KFold 類實現 K-Fold
Python 中的 K 折交叉驗證

在 Python 中,我們有很多機器學習演算法。在對實時資料使用演算法之前,我們可以使用資料集訓練和測試有監督和無監督學習模型。

在 Python 中需要交叉驗證

訓練和測試模型的傳統方法涉及將資料集拆分為訓練和測試資料集。通常,火車與測試的比例為 70:30。

直接拆分資料集有一些缺點。

主要缺點與過度擬合有關。為了從模型中獲得最佳效能,我們相應地調整超引數以提高模型在測試資料上的效能。

然而,在反覆更改超引數的同時,我們將知識洩漏到模型中,增加了過度擬合測試資料的風險。

人們開始使用訓練、測試和驗證資料集來應對這種情況。

我們使用訓練和驗證資料集調整超引數。
但是,用於學習模型的樣本數量受到顯著影響和減少。

最近,人們開始使用 K-Fold 交叉驗證技術來應對早期的問題。這是一項必不可少的技術,因為它可以幫助調整模型以選擇具有最佳效能的模型。

Python 中的 K 折交叉驗證

資料被拆分而不改組為 K 個連續摺疊。現在,每個摺疊都用於驗證一次,而剩餘的摺疊形成訓練集 (K - 1)。

簡而言之,訓練集的一部分用於驗證。

讓我們詳細討論一下。

我們將資料集分為訓練和測試兩部分,除此之外,訓練資料集進一步分為 K-Folds。其中一部分用於驗證,其餘用於訓練。

記錄了該模型的超引數和效能。重複這些步驟,直到每個拆分都驗證資料集。

每個摺疊都記錄了模型的效能和平均標準偏差。對不同的超引數值重複此操作,並選擇效能最佳的模型。

在 Python 中使用 sklearn.model_selection.KFold 類實現 K-Fold

我們可以使用 sklearn 模組在 Python 中實現不同的機器學習演算法和技術。model_selection.KFold 類可以在 Python 中實現 K-Fold 交叉驗證技術。

KFold 類中,我們使用 n_splits 引數指定摺疊,預設為 5。

我們還可以提供 shuffle 引數,決定是否在拆分前對資料進行混洗。預設為 False

random_state 引數還控制每個摺疊的隨機性。為此,需要將 shuffle 設定為 True

我們將使用這個類的一個例項和一個簡單的 numpy 陣列。

我們將為陣列提供 split() 函式。此方法將返回資料集的索引。

例子:

from sklearn.model_selection import KFold
import numpy as np

x = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
k_fold = KFold(n_splits=3)
for indices_train, indices_test in k_fold.split(x):
    print(indices_train, indices_test)

輸出:

[ 4  5  6  7  8  9 10 11] [0 1 2 3]
[ 0  1  2  3  8  9 10 11] [4 5 6 7]
[0 1 2 3 4 5 6 7] [ 8  9 10 11]

在上面的示例中,我們將摺疊數設定為 3。

在處理大型資料集時,我們通常將 K 的值設定為 5。隨著資料集變小,K 的值往往會增加。

應該注意的是,在 sklearn 0.20 之前,KFold 類是 sklearn.cross_validation 模組的一部分。還有其他技術可用於 Python 中的資料交叉驗證。

對於小型資料集,我們傾向於使用 LOOCV 技術。K-Fold 的其他改進版本是 StratifiedKFoldGroupKFold

ShuffleSplit 也是一種常用的交叉驗證技術,我們有 StratifiedShuffleSplitGroupShuffleSplit 方法。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn