使用 Scikit Learn 的网格搜索

Python 中的超参数调优

Alex Scriven

Data Scientist

GridSearchCV 对象

 

介绍 GridSearchCV 对象:

sklearn.model_selection.GridSearchCV(
    estimator,
    param_grid, scoring=None, fit_params=None,
    n_jobs=None, refit=True, cv='warn',
    verbose=0, pre_dispatch='2*n_jobs',
    error_score='raise-deprecating',
    return_train_score='warn')
Python 中的超参数调优

网格搜索步骤

 

网格搜索步骤:

  1. 用于调参的算法(称为"估计器")
  2. 定义要调的超参数
  3. 为每个超参数设定取值范围
  4. 设置交叉验证方案;
  5. 定义评分函数,用于判定网格中的"最佳"单元
  6. 包含其他有用的信息或功能
Python 中的超参数调优

GridSearchCV 对象的输入项

重要参数:

  • estimator
  • param_grid
  • cv
  • scoring
  • refit
  • n_jobs
  • return_train_score
Python 中的超参数调优

GridSearchCV 的 `estimator`

 

estimator 参数:

  • 本质上就是我们的算法
  • 您已使用过 KNN、随机森林、GBM、逻辑回归

 

请记住:

  • 每个 GridSearchCV 对象仅包含一个估计器
Python 中的超参数调优

GridSearchCV 的 `param_grid`

param_grid 参数:

  • 指定要测试的超参数及其取值

而不是使用列表:

max_depth_list = [2, 4, 6, 8]
min_samples_leaf_list = [1, 2, 4, 6]

应改为:

param_grid = {'max_depth': [2, 4, 6, 8],
              'min_samples_leaf': [1, 2, 4, 6]}
Python 中的超参数调优

GridSearchCV 的 `param_grid`

param_grid 参数:

注意:param_grid 字典中的键必须是有效的超参数。

例如,对于逻辑回归估计器:

# 不正确
param_grid = {'C': [0.1,0.2,0.5],
              'best_choice': [10,20,50]}
ValueError: Invalid parameter best_choice for estimator LogisticRegression
Python 中的超参数调优

GridSearchCV 的 `cv`

cv 参数:

  • 选择交叉验证方式
  • 传入整数执行 k 折交叉验证,通常用 5 或 10

k 折(维基百科)

Python 中的超参数调优

GridSearchCV 的 `scoring`

 

scoring 参数:

  • 用于选择最佳网格单元(模型)的评分
  • 可用自定义函数或 Scikit Learn 的 metrics 模块

可这样查看所有内置评分函数:

from sklearn import metrics
sorted(metrics.SCORERS.keys())
Python 中的超参数调优

GridSearchCV 的 `refit`

 

refit 参数:

  • 将最佳超参数拟合到训练数据
  • 使 GridSearchCV 对象可作为估计器使用(用于预测)
  • 非常实用!
Python 中的超参数调优

GridSearchCV 的 `n_jobs`

n_jobs 参数:

  • 支持并行执行
  • 可同时训练多个模型,而非依次进行

有用的代码:

import os
print(os.cpu_count())

若还需进行其他工作,请谨慎占满所有内核!

Python 中的超参数调优

GridSearchCV 的 `return_train_score`

 

return_train_score 参数:

  • 记录已执行训练的统计信息
  • 有助于分析偏差-方差权衡,但会增加计算开销
  • 仅用于分析,不用于选择最佳模型
Python 中的超参数调优

构建 GridSearchCV 对象

 

构建自己的 GridSearchCV 对象:

# 创建网格
param_grid = {'max_depth': [2, 4, 6, 8], 'min_samples_leaf': [1, 2, 4, 6]}

# 获取带部分参数的基分类器 rf_class = RandomForestClassifier(criterion='entropy', max_features='auto')
Python 中的超参数调优

构建 GridSearchCv 对象

 

整合各部分:

grid_rf_class = GridSearchCV(
    estimator = rf_class,
    param_grid = parameter_grid,
    scoring='accuracy',
    n_jobs=4,
    cv = 10,
    refit=True,
    return_train_score=True)
Python 中的超参数调优

使用 GridSearchCV 对象

 

由于将 refit 设为 True,可直接使用该对象:

# 拟合到数据
grid_rf_class.fit(X_train, y_train)

# 进行预测
grid_rf_class.predict(X_test)
Python 中的超参数调优

¡Vamos a practicar!

Python 中的超参数调优

Preparing Video For Download...