深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法
歡迎關注 @Python與資料探勘 ,專注 Python、資料分析、資料探勘、好玩工具!
在任何有監督機器學習專案的模型構建階段,我們訓練模型的目的是從標記的示例中學習所有權重和偏差的最佳值。
如果我們使用相同的標記示例來測試我們的模型,那麼這將是一個方法論錯誤,因為一個只會重複剛剛看到的樣本標籤的模型將獲得完美的分數,但無法預測任何有用的東西 - 未來的資料,這種情況稱為過擬合。
為了克服過度擬合的問題,我們使用交叉驗證。 所以你必須知道什麼是交叉驗證? 以及如何解決過擬合的問題?
什麼是交叉驗證?
交叉驗證是一種用於估計機器學習模型效能的統計方法,它是一種評估統計分析結果如何推廣到獨立資料集的方法。
它是如何解決過擬合問題的?
在交叉驗證中,我們將訓練資料生成多個小的訓練測試分割,使用這些拆分來調整您的模型。 例如,在標準的 k 折交叉驗證中,我們將資料劃分為 k 個子集。 然後,我們在 k-1 個子集上迭代訓練演算法,同時使用剩餘的子集作為測試集。 透過這種方式,我們可以在未參與訓練的資料上測試我們的模型。
在本文中,我將分享 7 種最常用的交叉驗證技術及其優缺點,我還提供了每種技術的程式碼片段。
歡迎收藏學習,喜歡點贊支援。
注:文末提供技術交流、程式碼、資料
下面列出了這些技術方法:
HoldOut 交叉驗證
K-Fold 交叉驗證
分層 K-Fold交叉驗證
Leave P Out 交叉驗證
留一交叉驗證
蒙特卡洛 (Shuffle-Split)
時間序列(滾動交叉驗證)
1、HoldOut 交叉驗證
在這種交叉驗證技術中,整個資料集被隨機劃分為訓練集和驗證集。 根據經驗,整個資料集的近 70% 用作訓練集,其餘 30% 用作驗證集。
優點
1。快速執行:因為我們必須將資料集拆分為訓練集和驗證集一次,並且模型將在訓練集上僅構建一次,因此可以快速執行。
缺點
不適合不平衡資料集:假設我們有一個不平衡資料集,它具有“0”類和“1”類。 假設 80% 的資料屬於“0”類,其餘 20% 的資料屬於“1”類。在訓練集大小為 80%,測試資料大小為資料集的 20% 的情況下進行訓練-測試分割。 可能會發生“0”類的所有 80% 資料都在訓練集中,而“1”類的所有資料都在測試集中。 所以我們的模型不能很好地概括我們的測試資料,因為它之前沒有看到過“1”類的資料。
大量資料無法訓練模型。
在小資料集的情況下,將保留一部分用於測試模型,其中可能具有我們的模型可能會錯過的重要特徵,因為它沒有對該資料進行訓練。
程式碼片段
from
sklearn。datasets
import
load_iris
from
sklearn。model_selection
import
train_test_split
from
sklearn。linear_model
import
LogisticRegression
from
sklearn。metrics
import
accuracy_score
iris
=
load_iris
()
X
=
iris
。
data
Y
=
iris
。
target
(
“Size of Dataset
{}
”
。
format
(
len
(
X
)))
logreg
=
LogisticRegression
()
x_train
,
x_test
,
y_train
,
y_test
=
train_test_split
(
X
,
Y
,
test_size
=
0。3
,
random_state
=
42
)
logreg
。
fit
(
x_train
,
y_train
)
predict
=
logreg
。
predict
(
x_test
)
(
“Accuracy score on training set is
{}
”
。
format
(
accuracy_score
(
logreg
。
predict
(
x_train
),
y_train
)))
(
“Accuracy score on test set is
{}
”
。
format
(
accuracy_score
(
predict
,
y_test
)))
2、K 折交叉驗證
在這種 K 折交叉驗證技術中,整個資料集被劃分為 K 個相等大小的部分。 每個分割槽稱為一個“摺疊”。因此,因為我們有 K 個部分,所以我們稱之為 K 摺疊。 一折用作驗證集,其餘 K-1 折用作訓練集。
該技術重複 K 次,直到每個摺疊用作驗證集,其餘摺疊用作訓練集。
模型的最終精度是透過取 k-models 驗證資料的平均精度來計算的。
優點
整個資料集既用作訓練集又用作驗證集:
缺點
不用於不平衡的資料集:正如在 HoldOut 交叉驗證的情況下所討論的,在 K-Fold 驗證的情況下也可能發生訓練集的所有樣本都沒有樣本形式類“1”,並且只有 類“0”。驗證集將有一個類“1”的樣本。
不適合時間序列資料:對於時間序列資料,樣本的順序很重要。 但是在 K 折交叉驗證中,樣本是按隨機順序選擇的。
「程式碼片段」
from
sklearn。datasets
import
load_iris
from
sklearn。model_selection
import
cross_val_score
,
KFold
from
sklearn。linear_model
import
LogisticRegression
iris
=
load_iris
()
X
=
iris
。
data
Y
=
iris
。
target
logreg
=
LogisticRegression
()
kf
=
KFold
(
n_splits
=
5
)
score
=
cross_val_score
(
logreg
,
X
,
Y
,
cv
=
kf
)
(
“Cross Validation Scores are
{}
”
。
format
(
score
))
(
“Average Cross Validation score :
{}
”
。
format
(
score
。
mean
()))
3、分層 K 折交叉驗證
分層 K-Fold 是 K-Fold 交叉驗證的增強版本,主要用於不平衡的資料集。 就像 K-fold 一樣,整個資料集被分成大小相等的 K-fold。
但是在這種技術中,每個摺疊將具有與整個資料集中相同的目標變數例項比率。
優點
對於不平衡資料非常有效:分層交叉驗證中的每個摺疊都會以與整個資料集中相同的比率表示所有類別的資料。
缺點
不適合時間序列資料:對於時間序列資料,樣本的順序很重要。 但在分層交叉驗證中,樣本是按隨機順序選擇的。
程式碼片段
from
sklearn。datasets
import
load_iris
from
sklearn。model_selection
import
cross_val_score
,
StratifiedKFold
from
sklearn。linear_model
import
LogisticRegression
iris
=
load_iris
()
X
=
iris
。
data
Y
=
iris
。
target
logreg
=
LogisticRegression
()
stratifiedkf
=
StratifiedKFold
(
n_splits
=
5
)
score
=
cross_val_score
(
logreg
,
X
,
Y
,
cv
=
stratifiedkf
)
(
“Cross Validation Scores are
{}
”
。
format
(
score
))
(
“Average Cross Validation score :
{}
”
。
format
(
score
。
mean
()))
4、Leave P Out 交叉驗證
Leave P Out 交叉驗證是一種詳盡的交叉驗證技術,其中 p 樣本用作驗證集,剩餘的 np 樣本用作訓練集。
假設我們在資料集中有 100 個樣本。 如果我們使用 p=10,那麼在每次迭代中,10 個值將用作驗證集,其餘 90 個樣本將用作訓練集。
重複這個過程,直到整個資料集在 p-樣本和 n-p 訓練樣本的驗證集上被劃分。
優點
所有資料樣本都用作訓練和驗證樣本。
缺點
計算時間長:由於上述技術會不斷重複,直到所有樣本都用作驗證集,因此計算時間會更長。
不適合不平衡資料集:與 K 折交叉驗證相同,如果在訓練集中我們只有 1 個類的樣本,那麼我們的模型將無法推廣到驗證集。
程式碼片段
from
sklearn。model_selection
import
LeavePOut
,
cross_val_score
from
sklearn。datasets
import
load_iris
from
sklearn。ensemble
import
RandomForestClassifier
iris
=
load_iris
()
X
=
iris
。
data
Y
=
iris
。
target
lpo
=
LeavePOut
(
p
=
2
)
lpo
。
get_n_splits
(
X
)
tree
=
RandomForestClassifier
(
n_estimators
=
10
,
max_depth
=
5
,
n_jobs
=-
1
)
score
=
cross_val_score
(
tree
,
X
,
Y
,
cv
=
lpo
)
(
“Cross Validation Scores are
{}
”
。
format
(
score
))
(
“Average Cross Validation score :
{}
”
。
format
(
score
。
mean
()))
5、留一交叉驗證
留一交叉驗證是一種詳盡的交叉驗證技術,其中 1 個樣本點用作驗證集,其餘 n-1 個樣本用作訓練集。
假設我們在資料集中有 100 個樣本。 然後在每次迭代中,1 個值將用作驗證集,其餘 99 個樣本作為訓練集。 因此,重複該過程,直到資料集的每個樣本都用作驗證點。
它與使用 p=1 的 LeavePOut 交叉驗證相同。
程式碼片段
from
sklearn。datasets
import
load_iris
from
sklearn。ensemble
import
RandomForestClassifier
from
sklearn。model_selection
import
LeaveOneOut
,
cross_val_score
iris
=
load_iris
()
X
=
iris
。
data
Y
=
iris
。
target
loo
=
LeaveOneOut
()
tree
=
RandomForestClassifier
(
n_estimators
=
10
,
max_depth
=
5
,
n_jobs
=-
1
)
score
=
cross_val_score
(
tree
,
X
,
Y
,
cv
=
loo
)
(
“Cross Validation Scores are
{}
”
。
format
(
score
))
(
“Average Cross Validation score :
{}
”
。
format
(
score
。
mean
()))
6、蒙特卡羅交叉驗證(Shuffle Split)
蒙特卡羅交叉驗證,也稱為Shuffle Split交叉驗證,是一種非常靈活的交叉驗證策略。 在這種技術中,資料集被隨機劃分為訓練集和驗證集。
我們已經決定了要用作訓練集的資料集的百分比和用作驗證集的百分比。 如果訓練集和驗證集大小的增加百分比總和不是 100,則剩餘的資料集不會用於訓練集或驗證集。
假設我們有 100 個樣本,其中 60% 的樣本用作訓練集,20% 的樣本用作驗證集,那麼剩下的 20%( 100-(60+20)) 將不被使用。
這種拆分將重複我們必須指定的“n”次。
優點
1。我們可以自由使用訓練和驗證集的大小。
2。我們可以選擇重複的次數,而不依賴於重複的摺疊次數。
缺點
可能不會為訓練集或驗證集選擇很少的樣本。
不適合不平衡的資料集:在我們定義了訓練集和驗證集的大小後,所有的樣本都是隨機選擇的,所以訓練集可能沒有測試中的資料類別 設定,並且該模型將無法概括為看不見的資料。
程式碼片段
from
sklearn。model_selection
import
ShuffleSplit
,
cross_val_score
from
sklearn。datasets
import
load_iris
from
sklearn。linear_model
import
LogisticRegression
logreg
=
LogisticRegression
()
shuffle_split
=
ShuffleSplit
(
test_size
=
0。3
,
train_size
=
0。5
,
n_splits
=
10
)
scores
=
cross_val_score
(
logreg
,
iris
。
data
,
iris
。
target
,
cv
=
shuffle_split
)
(
“cross Validation scores:n
{}
”
。
format
(
scores
))
(
“Average Cross Validation score :
{}
”
。
format
(
scores
。
mean
()))
7、時間序列交叉驗證
什麼是時間序列資料?
時間序列資料是在不同時間點收集的資料。由於資料點是在相鄰時間段收集的,因此觀測值之間可能存在相關性。這是區分時間序列資料與橫截面資料的特徵之一。
在時間序列資料的情況下如何進行交叉驗證?
在時間序列資料的情況下,我們不能選擇隨機樣本並將它們分配給訓練集或驗證集,因為使用未來資料中的值來預測過去資料的值是沒有意義的。
由於資料的順序對於時間序列相關問題非常重要,所以我們根據時間將資料拆分為訓練集和驗證集,也稱為“前向鏈”方法或滾動交叉驗證。
我們從一小部分資料作為訓練集開始。基於該集合,我們預測稍後的資料點,然後檢查準確性。
然後將預測樣本作為下一個訓練資料集的一部分包括在內,並對後續樣本進行預測。
優點
最好的技術之一。
缺點
不適用於其他資料型別的驗證:與其他技術一樣,我們選擇隨機樣本作為訓練或驗證集,但在該技術中資料的順序非常重要。
程式碼片段
import
numpy
as
np
from
sklearn。model_selection
import
TimeSeriesSplit
X
=
np
。
array
([[
1
,
2
],
[
3
,
4
],
[
1
,
2
],
[
3
,
4
],
[
1
,
2
],
[
3
,
4
]])
y
=
np
。
array
([
1
,
2
,
3
,
4
,
5
,
6
])
time_series
=
TimeSeriesSplit
()
(
time_series
)
for
train_index
,
test_index
in
time_series
。
split
(
X
):
(
“TRAIN:”
,
train_index
,
“TEST:”
,
test_index
)
X_train
,
X_test
=
X
[
train_index
],
X
[
test_index
]
y_train
,
y_test
=
y
[
train_index
],
y
[
test_index
]
結論
在本文中,我試圖概述各種交叉驗證技術的工作原理以及我們在實施這些技術時應牢記的事項,我真誠地希望在這個資料科學之旅中對你有所幫助。
技術交流群
建了技術交流群!想要進交流群、獲取資料的同學,可以直接加微訊號:
dkl88191
。加的時候備註一下:
研究方向 +學校/公司+知乎
,即可。然後就可以拉你進群了。
強烈推薦大家關注
Python與資料探勘
知乎賬號和
Python學習與資料探勘
微信公眾號,可以快速瞭解到最新優質文章。
文章推薦
效率倍增!PyCaret:一個開源、低程式碼的 Python 機器學習工具!
盤點資料探勘中常見的5種 AutoEDA 工具
微軟太良心,這次對資料科學下手了!
效率倍增!5 個提高生產力的 Jupyter notebook外掛!
再見 if…elif…!使用 Python 裝飾器輕鬆搞定!
精選12個函式!它們可讓 Python 資料處理更容易、更便捷!
太愛了!networkx:一款構建圖網路視覺化的 Python 工具包!
20+時序模型!GluonTS:一個專門為時間序列建模而設計的工具包!
Pendulum:可能是最好的 Python DateTime 庫
妙不可言!使用 Python 管道 Pipe 編寫程式碼如此優雅!
別再用 print 除錯程式碼了!PySnooper:一款 GitHub 熱門除錯工具!
安裝圖文並茂,外掛體驗超棒,VScode 這款編輯器神器詳細教程來了!
一個超好用的 Python 標準庫,操作目錄和檔案太 6 了
真香啊!深度梳理時間序列多步預測的五種策略!
只需三五行程式碼即可產出完美資料分析報告,這四大 AutoEDA 工具包真的太棒了!
超詳細,Python 多執行緒總結的太到位了
深度盤點:機器學習中常見的7種 AutoML 工具庫!
如此高效!資料科學中這4款 Python 神器的很棒!
超詳細!Python 製作一個優雅的詞雲其實特簡單!
太強了,用 Python+Excel 製作天氣預報表!
微軟出品!FLAML:一款可以自動化機器學習過程的神器!
整理不易,有所收穫,點個贊和愛心
❤️,
更多精彩歡迎關注