交叉驗證cross validation

2021-10-03 17:59:16 字數 3364 閱讀 2417

4.驗證方法選擇

5. 注意事項

6.函式[6]

7.例子

ref在使用訓練集對引數進行訓練的時候,經常會發現人們通常會將一整個訓練集分為三個部分。一般分為:訓練集(train_set),驗證集(valid_set),測試集(test_set)這三個部分。這其實是為了保證訓練效果而特意設定的。其中測試集很好理解,其實就是完全不參與訓練的資料,僅僅用來觀測測試效果的資料。

在實際的訓練中,訓練的結果對於訓練集的擬合程度通常還是挺好的(初始條件敏感),但是對於訓練集之外的資料的擬合程度通常就不那麼令人滿意了。因此我們通常並不會把所有的資料集都拿來訓練,而是分出一部分來(這一部分不參加訓練)對訓練集生成的引數進行測試,相對客觀的判斷這些引數對訓練集之外的資料的符合程度。這種思想就稱為交叉驗證(cross validation)[5]。

(1)從有限的學習資料中獲取盡可能多的有效資訊;

(2)交叉驗證從多個方向開始學習樣本的,可以有效地避免陷入區域性最小值;

(3)交叉驗證用於評估模型的**效能,尤其是訓練好的模型在新資料上的表現,可以在一定程度上避免過擬合問題;[2]

簡單交叉驗證方法是:首先隨機地將已給資料分為兩部分,一部分作為訓練集,另一部分作為測試集(例如,70%的資料為訓練集,30%的資料為測試集);然後用訓練集在各種條件下(例如,不同的引數個數)訓練模型,從而得到不同的模型;在測試集上評價各個模型的測試誤差,選出測試誤差最小的模型。

一般來說,簡單交叉驗證並非一種交叉驗證,因為資料並沒有交叉使用。隨機從最初的樣本中選出部分,形成交叉驗證資料,而剩餘的就當作訓練資料。一般來說,少於原本樣本三分之一的資料被選做驗證資料。

優點:處理簡單,只需隨機把原始資料分為兩組即可

缺點:a) 當訓練資料本來就很少時,再分出測試集後,訓練資料就太少了

b) 驗證集分類準確率的高低與原始資料的分組有很大的關係,得到的結果其實並不具有說服性

為了方便除錯超引數,從訓練集中劃分一部分作為驗證集,但是由於劃分出乙個驗證集調節的引數可能受到驗證集資料影響有偏差不夠準確,於是進行交叉,如圖,其中fold1-fold5可以進行任意4個組合作為訓練集,剩下乙個作為驗證集,這樣得到不同的訓練模型,然後對最終**結果進行求平均。[1]

第一步,不重複抽樣將原始資料隨機分為 k 份。

第二步,每一次挑選其中 1 份作為驗證集,剩餘 k-1 份作為訓練集用於模型訓練。

第三步,重複第二步 k 次,這樣每個子集都有一次機會作為驗證集,其餘作為訓練集。在每個訓練集上訓練後得到乙個模型,用這個模型在相應的驗證集上測試,計算並儲存模型的評估指標。

第四步,計算 k 組測試結果的平均值作為模型精度的估計,並作為當前 k 折交叉驗證下模型的效能指標。

k一般大於等於2,實際操作時一般從3開始取。一般講k取值為10。這樣資料稀疏時基本上也能進行。資料量小的時候,k可以設大一點,這樣訓練集佔整體比例就比較大,不過同時訓練的模型個數也增多。資料量大的時候,k可以設小一點。

優點:有效地避免過學習以及欠學習狀態的發生,得到的結果比較具有說服性

缺點:訓練和測試次數過多

留一驗證意指只使用原本樣本中的一項來當作驗證資料,而剩餘的則留下來當作訓練資料。這個步驟一直持續到每個樣本都被當作一次驗證資料。事實上,這等同於k-fold交叉驗證是一樣的,其中k為原本樣本個數。

缺點:計算的開銷很大

如果我們只是對資料做乙個初步的模型建立,不是要做深入分析的話,簡單交叉驗證就可以,否則就用k折交叉驗證,在樣本量少的時候,使用留一交叉驗證。

(1)訓練集中樣本數量要足夠多,一般至少大於總樣本數的50%。

(2)訓練集和測試集必須從完整的資料集中均勻取樣。均勻取樣的目的是希望減少訓練集、測試集與原資料集之間的偏差。當樣本數量足夠多時,通過隨機取樣,便可以實現均勻取樣的效果。(隨機取樣,可重複性差)

sklearn.model_selection.kfold(n_splits=3, shuffle=false, random_state=none)

n_splits:表示劃分幾等份

shuffle:在每次劃分時,是否進行洗牌

若為falses時,其效果等同於random_state等於整數,每次劃分的結果相同

若為true時,每次劃分的結果都不一樣,表示經過洗牌,隨機取樣的

random_state:隨機種子數

sklearn.cross_validation.cross_val_score(estimator, x, y=none, scoring=none, cv=none, n_jobs=1, verbose=0,fit_params=none,pre_dispatch=『2*n_jobs』)

estimator:資料物件

x:資料

y:**資料

soring:呼叫的方法

cv:交叉驗****或可迭代的次數

n_jobs:同時工作的cpu個數(-1代表全部)

verbose:詳細程度

fit_params:傳遞給估計器的擬合方法的引數

pre_dispatch:控制並行執行期間排程的作業數量。減少這個數量對於避免在cpu傳送更多作業時cpu記憶體消耗的擴大是有用的。

[1] ch1 統計學習方法概論|1.5.2交叉驗證《統計學習方法》-學習筆記

[2] 機器學習乾貨|交叉驗證(cross validation)詳解

[3] 交叉驗證(cross validation)與網格搜尋(grid search)的原理及實證分析

[4]

[5] 交叉驗證/8543100?fr=aladdin

[6]

[7]

[8]

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份的所有資料...