交叉驗證(Cross Validation)

2021-09-29 01:56:03 字數 3871 閱讀 3268

在模式識別(pattern recognition)與機器學習(machine learning)的相關研究中,經常會將資料集(dataset)分為訓練集(training set)跟測試集(testing set)這兩個子集,前者用以建立模型(model),後者則用來評估該模型對未知樣本進行**時的精確度,正規的說法是泛化能力(generalization ability)。怎麼將完整的資料集分為訓練集跟測試集,必須遵守如下要點:

只有訓練集才可以用在模型的訓練過程中,測試集則必須在模型完成之後才被用來評估模型優劣的依據。

訓練集中樣本數量必須夠多,一般至少大於總樣本數的50%。

兩組子集必須從完整集合中均勻取樣。

其中最後一點特別重要,均勻取樣的目的是希望減少訓練集/測試集與完整集合之間的偏差(bias),但卻也不易做到。一般的作法是隨機取樣,當樣本數量足夠時,便可達到均勻取樣的效果,然而隨機也正是此作法的盲點,也是經常是可以在資料上做手腳的地方。舉例來說,當辨識率不理想時,便重新取樣一組訓練集/測試集,直到測試集的識別率滿意為止,但嚴格來說這樣便算是作弊了。

在機器學習裡,通常來說我們不能將全部用於資料訓練模型,否則我們將沒有資料集對該模型進行驗證,從而評估我們的模型的**效果。為了解決這一問題,有如下常用的方法:

第一種是最簡單的,也是很容易就想到的。我們可以把整個資料集分成兩部分,一部分用於訓練,一部分用於驗證,這也就是我們經常提到的訓練集(training set)和測試集(test set)。

例如,如上圖所示,我們可以將藍色部分的資料作為訓練集(包含7、22、13等資料),將右側的資料作為測試集(包含91等),這樣通過在藍色的訓練集上訓練模型,在測試集上觀察不同模型不同引數對應的mse的大小,就可以合適選擇模型和引數了。

不過,這個簡單的方法存在兩個弊端。

最終模型與引數的選取將極大程度依賴於你對訓練集和測試集的劃分方法。什麼意思呢?我們再看一張圖:

右邊是十種不同的訓練集和測試集劃分方法得到的test mse,可以看到,在不同的劃分方法下,test mse的變動是很大的,而且對應的最優degree也不一樣。所以如果我們的訓練集和測試集的劃分方法不夠好,很有可能無法選擇到最好的模型與引數。

該方法只用了部分資料進行模型的訓練

我們都知道,當用於模型訓練的資料量越大時,訓練出來的模型通常效果會越好。所以訓練集和測試集的劃分意味著我們無法充分利用我們手頭已有的資料,所以得到的模型效果也會受到一定的影響。

基於這樣的背景,有人就提出了cross-validation方法,也就是交叉驗證。

2.1 loocv

2.2 k-fold cross validation

將原始資料分成k組(一般是均分),將每個子集資料分別做一次驗證集,其餘的k-1組子集資料作為訓練集,這樣會得到k個模型,用這k個模型最終的驗證集的分類準確率的平均數作為此k-cv下分類器的效能指標。k一般大於等於2,實際操作時一般從3開始取,只有在原始資料集合資料量小的時候才會嘗試取2。k-cv可以有效的避免過學習以及欠學習狀態的發生,最後得到的結果也比較具有說服性。

k折交叉驗證,和loocv的不同在於,我們每次的測試集將不再只包含乙個資料,而是多個,具體數目將根據k的選取決定。比如,如果k=5,那麼我們利用五折交叉驗證的步驟就是:

1.將所有資料集分成5份

2.不重複地每次取其中乙份做測試集,用其他四份做訓練集訓練模型,之後計算該模型在測試集上的msei

不難理解,其實loocv是一種特殊的k-fold cross validation(k=n)。再來看一**:

每一幅圖種藍色表示的真實的test mse,而黑色虛線和橙線則分貝表示的是loocv方法和10-fold cv方法得到的test mse。我們可以看到事實上loocv和10-fold cv對test mse的估計是很相似的,但是相比loocv,10-fold cv的計算成本卻小了很多,耗時更少。

2.3 bias-variance trade-off for k-fold cross-validation

最後,我們要說說k的選取。事實上,和開頭給出的文章裡的部分內容一樣,k的選取是乙個bias和variance的trade-off。

k越大,每次投入的訓練集的資料越多,模型的bias越小。但是k越大,又意味著每一次選取的訓練集之前的相關性越大(考慮最極端的例子,當k=n,也就是在loocv裡,每次都訓練資料幾乎是一樣的)。而這種大相關性會導致最終的test error具有更大的variance。

一般來說,根據經驗我們一般選擇k=5或10。

2.4 cross-validation on classification problems

上面我們講的都是回歸問題,所以用mse來衡量test error。如果是分類問題,那麼我們可以用以下式子來衡量cross-validation的test error:

其中erri表示的是第i個模型在第i組測試集上的分類錯誤的個數。

交叉驗證優點:

1:交叉驗證用於評估模型的**效能,尤其是訓練好的模型在新資料上的表現,可以在一定程度上減小過擬合。

2:還可以從有限的資料中獲取盡可能多的有效資訊

def

cross_val_score

(estimator, x, y=

none

, groups=

none

, scoring=

none

, cv=

'warn'

, n_jobs=

none

, verbose=

0, fit_params=

none

, pre_dispatch=

'2*n_jobs'

, error_score=

'raise-deprecating'):

estimator:估計方法物件(分類器)

x:資料特徵(features)

y:資料標籤(labels)

soring:呼叫方法(包括accuracy和mean_squared_error等等)

cv:幾折交叉驗證

n_jobs:同時工作的cpu個數(-

1代表全部)

fit_params:字典,將估計器中fit方法的引數通過字典傳遞

scoring引數值解析

這裡文件對分類、聚類和回歸三種問題下可以使用的引數進行了說明

from sklearn.datasets import load_boston

from sklearn.model_selection import cross_val_score

from sklearn.tree import decisiontreeregressor

boston = load_boston(

)regressor = decisiontreeregressor(random_state=

321)

# 交叉驗證cross_val_score的用法

cross_val_score(regressor, boston.data, boston.target

, cv=

10, scoring=

'neg_mean_squared_error'

)

scikit learning 交叉驗證

import numpy as np from sklearn import datasets from sklearn.cross validation import train test split from sklearn.neighbors import kneighborsclassifi...

交叉驗證(cross validation)

交叉驗證是資料分析時模型選擇的方法之一,將資料集分為三份,分別為訓練集 training set 驗證集 valication set 和測試集 test set 分別功能為訓練模型,選擇模型和對學習方法的評估。其演算法的思想為重複的使用資料,使得模型的精度越來越高。交叉驗證的方法有以下三種 1.簡...

交叉驗證(Cross validation

交叉驗證 cross validation 交叉驗證用於防止模型過於複雜而引起的過擬合 作用 如何交叉驗證 我這裡主要介紹k交叉驗證 1 將資料集分成k份 2 對於每乙個模型 拿多項式回歸舉例,m 2為乙個模型,m 3為乙個模型。我們主要就是尋找最好的m for j 1,2,k 將除第j份的所有資料...