模型評估和超引數調整(二)——交叉驗證 (cross validation)
阿新 • • 發佈:2019-01-01
讀《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)))