您當前的位置:首頁 > 文化

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

作者:由 Python與資料探勘 發表于 文化時間:2021-11-21

歡迎關注 @Python與資料探勘 ,專注 Python、資料分析、資料探勘、好玩工具!

在任何有監督機器學習專案的模型構建階段,我們訓練模型的目的是從標記的示例中學習所有權重和偏差的最佳值。

如果我們使用相同的標記示例來測試我們的模型,那麼這將是一個方法論錯誤,因為一個只會重複剛剛看到的樣本標籤的模型將獲得完美的分數,但無法預測任何有用的東西 - 未來的資料,這種情況稱為過擬合。

為了克服過度擬合的問題,我們使用交叉驗證。 所以你必須知道什麼是交叉驗證? 以及如何解決過擬合的問題?

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

什麼是交叉驗證?

交叉驗證是一種用於估計機器學習模型效能的統計方法,它是一種評估統計分析結果如何推廣到獨立資料集的方法。

它是如何解決過擬合問題的?

在交叉驗證中,我們將訓練資料生成多個小的訓練測試分割,使用這些拆分來調整您的模型。 例如,在標準的 k 折交叉驗證中,我們將資料劃分為 k 個子集。 然後,我們在 k-1 個子集上迭代訓練演算法,同時使用剩餘的子集作為測試集。 透過這種方式,我們可以在未參與訓練的資料上測試我們的模型。

在本文中,我將分享 7 種最常用的交叉驗證技術及其優缺點,我還提供了每種技術的程式碼片段。

歡迎收藏學習,喜歡點贊支援。

注:文末提供技術交流、程式碼、資料

下面列出了這些技術方法:

HoldOut 交叉驗證

K-Fold 交叉驗證

分層 K-Fold交叉驗證

Leave P Out 交叉驗證

留一交叉驗證

蒙特卡洛 (Shuffle-Split)

時間序列(滾動交叉驗證)

1、HoldOut 交叉驗證

在這種交叉驗證技術中,整個資料集被隨機劃分為訓練集和驗證集。 根據經驗,整個資料集的近 70% 用作訓練集,其餘 30% 用作驗證集。

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

優點

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

print

“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

print

“Accuracy score on training set is

{}

format

accuracy_score

logreg

predict

x_train

),

y_train

)))

print

“Accuracy score on test set is

{}

format

accuracy_score

predict

y_test

)))

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

2、K 折交叉驗證

在這種 K 折交叉驗證技術中,整個資料集被劃分為 K 個相等大小的部分。 每個分割槽稱為一個“摺疊”。因此,因為我們有 K 個部分,所以我們稱之為 K 摺疊。 一折用作驗證集,其餘 K-1 折用作訓練集。

該技術重複 K 次,直到每個摺疊用作驗證集,其餘摺疊用作訓練集。

模型的最終精度是透過取 k-models 驗證資料的平均精度來計算的。

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

優點

整個資料集既用作訓練集又用作驗證集:

缺點

不用於不平衡的資料集:正如在 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

print

“Cross Validation Scores are

{}

format

score

))

print

“Average Cross Validation score :

{}

format

score

mean

()))

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

3、分層 K 折交叉驗證

分層 K-Fold 是 K-Fold 交叉驗證的增強版本,主要用於不平衡的資料集。 就像 K-fold 一樣,整個資料集被分成大小相等的 K-fold。

但是在這種技術中,每個摺疊將具有與整個資料集中相同的目標變數例項比率。

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

優點

對於不平衡資料非常有效:分層交叉驗證中的每個摺疊都會以與整個資料集中相同的比率表示所有類別的資料。

缺點

不適合時間序列資料:對於時間序列資料,樣本的順序很重要。 但在分層交叉驗證中,樣本是按隨機順序選擇的。

程式碼片段

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

print

“Cross Validation Scores are

{}

format

score

))

print

“Average Cross Validation score :

{}

format

score

mean

()))

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

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

print

“Cross Validation Scores are

{}

format

score

))

print

“Average Cross Validation score :

{}

format

score

mean

()))

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

5、留一交叉驗證

留一交叉驗證是一種詳盡的交叉驗證技術,其中 1 個樣本點用作驗證集,其餘 n-1 個樣本用作訓練集。

假設我們在資料集中有 100 個樣本。 然後在每次迭代中,1 個值將用作驗證集,其餘 99 個樣本作為訓練集。 因此,重複該過程,直到資料集的每個樣本都用作驗證點。

它與使用 p=1 的 LeavePOut 交叉驗證相同。

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

程式碼片段

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

print

“Cross Validation Scores are

{}

format

score

))

print

“Average Cross Validation score :

{}

format

score

mean

()))

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

6、蒙特卡羅交叉驗證(Shuffle Split)

蒙特卡羅交叉驗證,也稱為Shuffle Split交叉驗證,是一種非常靈活的交叉驗證策略。 在這種技術中,資料集被隨機劃分為訓練集和驗證集。

我們已經決定了要用作訓練集的資料集的百分比和用作驗證集的百分比。 如果訓練集和驗證集大小的增加百分比總和不是 100,則剩餘的資料集不會用於訓練集或驗證集。

假設我們有 100 個樣本,其中 60% 的樣本用作訓練集,20% 的樣本用作驗證集,那麼剩下的 20%( 100-(60+20)) 將不被使用。

這種拆分將重複我們必須指定的“n”次。

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

優點

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

print

“cross Validation scores:n

{}

format

scores

))

print

“Average Cross Validation score :

{}

format

scores

mean

()))

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

7、時間序列交叉驗證

什麼是時間序列資料?

時間序列資料是在不同時間點收集的資料。由於資料點是在相鄰時間段收集的,因此觀測值之間可能存在相關性。這是區分時間序列資料與橫截面資料的特徵之一。

在時間序列資料的情況下如何進行交叉驗證?

在時間序列資料的情況下,我們不能選擇隨機樣本並將它們分配給訓練集或驗證集,因為使用未來資料中的值來預測過去資料的值是沒有意義的。

由於資料的順序對於時間序列相關問題非常重要,所以我們根據時間將資料拆分為訓練集和驗證集,也稱為“前向鏈”方法或滾動交叉驗證。

我們從一小部分資料作為訓練集開始。基於該集合,我們預測稍後的資料點,然後檢查準確性。

然後將預測樣本作為下一個訓練資料集的一部分包括在內,並對後續樣本進行預測。

深度盤點:8000字詳細介紹 Python 中的 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

()

print

time_series

for

train_index

test_index

in

time_series

split

X

):

print

“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

深度盤點:8000字詳細介紹 Python 中的 7 種交叉驗證方法

結論

在本文中,我試圖概述各種交叉驗證技術的工作原理以及我們在實施這些技術時應牢記的事項,我真誠地希望在這個資料科學之旅中對你有所幫助。

技術交流群

建了技術交流群!想要進交流群、獲取資料的同學,可以直接加微訊號:

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:一款可以自動化機器學習過程的神器!

整理不易,有所收穫,點個贊和愛心

❤️,

更多精彩歡迎關注

標簽: 驗證  score  資料  交叉  訓練