1. 程式人生 > >模型評估和超引數調整(二)——交叉驗證 (cross validation)

模型評估和超引數調整(二)——交叉驗證 (cross validation)

讀《python machine learning》chapt 6 

Learning Best Practices for Model Evaluation and Hyperparameter Tuning

【主要內容】

(1)獲得對模型評估的無偏估計

(2)診斷機器學習演算法的常見問題

(3)調整機器學習模型

(4)使用不同的效能指標對評估預測模型

git原始碼地址 https://github.com/xuman-Amy/Model-evaluation-and-Hypamameter-tuning

【交叉驗證 cross-validation】

常見的交叉驗證方法holdout cv ,k-fold cv

【cross-validation ----holdout CV】

【主要思想】

將資料分為三部分:訓練集(training data )、 驗證集(validation data) 、 測試集(test data)

訓練集(training data ):fit不同的模型

驗證集(validation data):用於模型選擇

 測試集(test data):對於泛化到新資料的效能,能得到較小偏差的估計值

流程圖:


【缺點】

效能評估對於如何劃分訓練集和驗證集比較敏感,對於不同的資料樣本得到的效能評估不同。

【cross-validation ----k-fold CV】

【主要思想】

將資料集無替換的隨機分為K份,k-1份用來fit模型,剩下的一份用來效能評估。這樣重複k次,得到K個模型和效能評估結果。

在得到K個性能評估後,計算平均效能評估。

另外,也可以找到泛華能力較好的最優引數。

找到這一引數後,在整個資料集上重新訓練模型,再用獨立的測試集得到最終的效能評估。

【K=10 的 流程圖】


【stratified k-fold CV】

對於k-fold CV的一個改進時stratified k-fold CV,在每個訓練集中保留了原始資料的類比例。

【sklearn實現 stratified k-fold cv】

# stratified k-fold cv
import numpy as np
from sklearn.model_selection import StratifiedKFold
Kfold = StratifiedKFold(n_splits = 10, 
                        random_state = 1).split(X_train, y_train)
scores = []
for k ,(train, test) in enumerate (Kfold):
    pipe_lr.fit(X_train[train], y_train[train])
    score = pipe_lr.score(X_train[test], y_train[test])
    scores.append(score)
    print('Fold: %2d, Class dist.: %s, Acc: %.3f' % (k+1, np.bincount(y_train[train]), score))
    
print('\nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

sklearn 提供了k-fold cross-validation scorer, 可利用stratified k-fold cross-validation直接評估模型

from sklearn.model_selection import cross_val_score
scores  = cross_val_score(estimator = pipe_lr, 
                          X = X_train,
                          y = y_train, 
                          cv = 10, 
                          n_jobs = 1)
print('CV accuracy scores:\n\n %s \n' % scores)
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))