超參數調整

使用 scikit-learn 進行監督式學習

George Boorman

Core Curriculum Manager

超參數調整

  • Ridge/lasso 迴歸:選擇 alpha

  • KNN:選擇 n_neighbors

  • 超參數:在擬合模型前先指定的參數

    • alphan_neighbors
使用 scikit-learn 進行監督式學習

選對超參數

  1. 嘗試多組超參數數值

  2. 各自擬合模型

  3. 比較表現

  4. 選最佳組合

 

  • 這稱為 超參數調整

  • 務必用交叉驗證,避免對測試集過度配適

  • 仍先切分資料,於訓練集做交叉驗證

  • 保留測試集作最後評估

使用 scikit-learn 進行監督式學習

網格搜尋交叉驗證

n_neighbors 候選值從 2 到 11,每次遞增 3,度量選項為 euclidean 或 manhattan 的方格

使用 scikit-learn 進行監督式學習

網格搜尋交叉驗證

對網格中每組超參數的 k 折交叉驗證分數

使用 scikit-learn 進行監督式學習

網格搜尋交叉驗證

高亮 5 個鄰居與 euclidean 度量,分數為 0.8748

使用 scikit-learn 進行監督式學習

scikit-learn 的 GridSearchCV

from sklearn.model_selection import GridSearchCV

kf = KFold(n_splits=5, shuffle=True, random_state=42)
param_grid = {"alpha": np.arange(0.0001, 1, 10), "solver": ["sag", "lsqr"]}
ridge = Ridge()
ridge_cv = GridSearchCV(ridge, param_grid, cv=kf)
ridge_cv.fit(X_train, y_train)
print(ridge_cv.best_params_, ridge_cv.best_score_)
{'alpha': 0.0001, 'solver': 'sag'}
0.7529912278705785
使用 scikit-learn 進行監督式學習

侷限與替代作法

  • 3 折交叉驗證、1 個超參數、10 個候選值 = 共 30 次擬合
  • 10 折交叉驗證、3 個超參數、30 個候選值 = 共 900 次擬合
使用 scikit-learn 進行監督式學習

RandomizedSearchCV

from sklearn.model_selection import RandomizedSearchCV

kf = KFold(n_splits=5, shuffle=True, random_state=42) param_grid = {'alpha': np.arange(0.0001, 1, 10), "solver": ['sag', 'lsqr']} ridge = Ridge()
ridge_cv = RandomizedSearchCV(ridge, param_grid, cv=kf, n_iter=2) ridge_cv.fit(X_train, y_train)
print(ridge_cv.best_params_, ridge_cv.best_score_)
{'solver': 'sag', 'alpha': 0.0001}
0.7529912278705785
使用 scikit-learn 進行監督式學習

在測試集上評估

test_score = ridge_cv.score(X_test, y_test)

print(test_score)
0.7564731534089224
使用 scikit-learn 進行監督式學習

一起來練習吧!

使用 scikit-learn 進行監督式學習

Preparing Video For Download...