數據量太少怎麼辦,請認準交叉驗證

一、交叉驗證

交叉驗證是在機器學習建立模型和驗證模型參數時常用的辦法,一般被用於評估一個機器學習模型的表現。更多的情況下,我們也用交叉驗證來進行模型選擇(model selection)。交叉驗證,顧名思義,就是重複的使用數據,把得到的樣本數據進行切分,組合爲不同的訓練集和測試集,用訓練集來訓練模型,用測試集來評估模型預測的好壞。在此基礎上可以得到多組不同的訓練集和測試集,某次訓練集中的某樣本在下次可能成爲測試集中的樣本,即所謂“交叉”。 

  那麼什麼時候才需要交叉驗證呢?

交叉驗證用在數據不是很充足的時候。如果數據樣本量小於一萬條,我們就會採用交叉驗證來訓練優化選擇模型。如果樣本大於一萬條的話,我們一般隨機的把數據分成三份,一份爲訓練集(Training Set),一份爲驗證集(Validation Set),最後一份爲測試集(Test Set)。用訓練集來訓練模型,用驗證集來評估模型預測的好壞和選擇模型及其對應的參數。把最終得到的模型再用於測試集,最終決定使用哪個模型以及對應參數。

  回到交叉驗證,根據切分的方法不同,交叉驗證分爲下面三種:   

  第一種是簡單交叉驗證,所謂的簡單,是和其他交叉驗證方法相對而言的。首先,我們隨機的將樣本數據分爲兩部分(比如: 70%的訓練集,30%的測試集),然後用訓練集來訓練模型,在測試集上驗證模型及參數。接着,我們再把樣本打亂,重新選擇訓練集和測試集,繼續訓練數據和檢驗模型。最後我們選擇損失函數評估最優的模型和參數。 

  第二種是S折交叉驗證( S-Folder Cross Validation),也是經常會用到的。和第一種方法不同, S折交叉驗證先將數據集 D 隨機劃分爲 S 個大小相同的互斥子集,即 D=D1∪D2∪...∪DS ,Di∩Dj=∅(i≠j) 每次隨機的選擇 S−1 份作爲訓練集,剩下的1份做測試集。當這一輪完成後,重新隨機選擇 S−1 份來訓練數據。若干輪(小於 S )之後,選擇損失函數評估最優的模型和參數。注意,交叉驗證法評估結果的穩定性和保真性在很大程度上取決於 S 取值。

Image Name

第三種是留一交叉驗證(Leave-one-out Cross Validation),它是第二種情況的特例,此時 S 等於樣本數 N ,這樣對於 N 個樣本,每次選擇 N−1 個樣本來訓練數據,留一個樣本來驗證模型預測的好壞。此方法主要用於樣本量非常少的情況,比如對於普通適中問題, N 小於50時,我一般採用留一交叉驗證。

  通過反覆的交叉驗證,用損失函數來度量得到的模型的好壞,最終我們可以得到一個較好的模型。那這三種情況,到底我們應該選擇哪一種方法呢?一句話總結,如果我們只是對數據做一個初步的模型建立,不是要做深入分析的話,簡單交叉驗證就可以了。否則就用S折交叉驗證。在樣本量少的時候,使用S折交叉驗證的特例留一交叉驗證。

  此外還有一種比較特殊的交叉驗證方式,也是用於樣本量少的時候。叫做自助法(bootstrapping)。比如我們有m個樣本(m較小),每次在這m個樣本中隨機採集一個樣本,放入訓練集,採樣完後把樣本放回。這樣重複採集m次,我們得到m個樣本組成的訓練集。當然,這m個樣本中很有可能有重複的樣本數據。同時,用原始的m個樣本做測試集。這樣接着進行交叉驗證。由於我們的訓練集有重複數據,這會改變數據的分佈,因而訓練結果會有估計偏差,因此,此種方法不是很常用,除非數據量真的很少,比如小於20個。

 

二、實例代碼

使用sklearn庫實現交叉驗證。

import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score 

# 加載iris數據集
iris = datasets.load_iris()
# 讀取特徵
X = iris.data
# 讀取分類標籤
y = iris.target

# 定義分類器,k近鄰選擇爲5
knn = KNeighborsClassifier(n_neighbors=5)
# 進行交叉驗證數據評估, 數據分爲5部分, 每次用一部分作爲測試集
scores = cross_val_score(knn, X, y, cv = 5, scoring='accuracy')
# 輸出5次交叉驗證的準確率
print(scores)
[0.96666667 1.         0.93333333 0.96666667 1.        ]

sklearn中的cross_val_score()函數:

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’)

參數:

  1. estimator:數據對象;
  2. X:數據;
  3. y:預測數據;
  4. soring:調用的方法;
  5. cv:交叉驗證生成器或可迭代的次數;
  6. n_jobs:同時工作的cpu個數(-1代表全部);
  7. verbose:詳細程度;
  8. fit_params:傳遞給估計器的擬合方法的參數;
  9. pre_dispatch:控制並行執行期間調度的作業數量。減少這個數量對於避免在CPU發送更多作業時CPU內存消耗的擴大是有用的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章