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 的其他改進版本是 StratifiedKFold
和 GroupKFold
。
ShuffleSplit
也是一種常用的交叉驗證技術,我們有 StratifiedShuffleSplit
和 GroupShuffleSplit
方法。
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