超参数调优

使用 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 的监督学习

Passons à la pratique !

使用 scikit-learn 的监督学习

Preparing Video For Download...