1. 程式人生 > >機器學習演算法:交叉驗證——(監督)學習器效能評估方法 [ sklearn.model_selection.cross_val_score()官方翻譯 ]

機器學習演算法:交叉驗證——(監督)學習器效能評估方法 [ sklearn.model_selection.cross_val_score()官方翻譯 ]

交叉驗證——(監督)學習器效能評估方法

一、思考:交叉驗證有什麼好值得我們使用的?

每個演算法模型都需要經過兩個階段:訓練和驗證。

1) 一般情況下的,我們用的方法是:將原始資料集分為 訓練資料集 & 測試資料集。

優點:是,但僅僅是思路正確。

缺點:思路正確,但是方法不夠高明。

分析:一方面,如果不把原始資料集劃分為 訓練資料集&測試資料集,而是直接使用,結果會是過擬合、泛化能力極低(即模型完美於預測原始資料,完敗於預測原始樣本集之外的任何資料);而劃分之後,就可以用 訓練資料集訓練模型,得到演算法引數

但是我們得到的這個演算法引數,其實是從一系列引數中對比的來的

,這意味著測試資料集的資訊會被間接地洩露出來,引數調整的越多、洩露得越多,測試資料集的意義越低;

所以為了防止這個問題,一個好的方法是從訓練資料集中劃出一部門資料我們稱之為“validation set”(驗證資料集),在用它評估得到的模型進行驗證;

最後再用測試資料集對標模型的輸出,檢驗演算法的泛化能力

——這即是它的優點;

2)另一方面,把原始資料集分割之後,用來訓練模型的資料集大大減小,同時訓練結果也更大的依賴於訓練資料集和測試資料集佔原始資料集的比重。

一個解決方法就是cross-validation(交叉檢驗),縮寫CV。

此時,任然需要一個測試資料集以進行最終評估,但是“validation set”

就不需要了。在名為k-fold CV的基本方法中,訓練集被分成k個較小的集合/k-folds(還有其他方法,但通常遵循相同的原則),然後如圖進行一下操作:

分別讓一個fold作為測試集,餘下部分作為訓練集,進行k次訓練,共計得到k個引數。最終使用均值作為最終的模型引數。

缺點:相同大小的資料集,需要進行更多的運算。

優點:最大特點是不再浪費validation set大小的資料,尤其是在樣本集不夠大的情況下。

二、如果我想在python使用cross-validation,怎麼操作呢?

一個簡單的方法就是引用cross_val_score()函式。官方文件連結

1)首先認識一下CV函式:

sklearn.model_selection.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’)

2)舉個栗子:

我們用SVM()/support vector machines(支援向量機)中的SVC分類演算法為例:

from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernal='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv =5)
print(scores)
array([0.96..., 1.  ..., 0.96..., 0.96..., 1.        ])

3)認識常用引數:

3.1 必選引數部分:

estimator:就是自己選定的模型;

X:array型別資料。訓練集(自變數部分);

3.2)可選引數部分:y:array型別資料。訓練集(因變數部分);

cv:int型別。設定cross-validation的維度。輸入可以是:

· 測試最優k-fold值的 & 迭代產生的序列,

· 整數:自行設定k-fold的值,

· 不設定cv:使用預設值3,即k-fold=3,

· 用作交叉驗證迭代器的物件,