介绍网格搜索

Python 中的超参数调优

Alex Scriven

Data Scientist

自动化调 2 个超参数

你之前的工作:

neighbors_list = [3,5,10,20,50,75]
accuracy_list = []
for test_number in neighbors_list:
    model = KNeighborsClassifier(n_neighbors=test_number)
    predictions = model.fit(X_train, y_train).predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    accuracy_list.append(accuracy)

随后我们汇总到一个 DataFrame 中进行分析。

Python 中的超参数调优

自动化调 2 个超参数

 

测试 2 个超参数的取值呢?

使用 GBM 算法:

  • learn_rate [0.001, 0.01, 0.05]
  • max_depth [4,6,8,10]

我们可以用(嵌套)for 循环!

Python 中的超参数调优

自动化调 2 个超参数

先写一个建模函数:

def gbm_grid_search(learn_rate, max_depth):
    model = GradientBoostingClassifier(
            learning_rate=learn_rate,
            max_depth=max_depth)

predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Python 中的超参数调优

自动化调 2 个超参数

 

现在可遍历超参数列表并调用函数:

results_list = []

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        results_list.append(gbm_grid_search(learn_rate,max_depth))

Python 中的超参数调优

自动化调 2 个超参数

 

也可把这些结果放入 DataFrame 并打印:

results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

结果表

Python 中的超参数调优

有多少模型?

 

加入更多超参数和值会构建更多模型。

  • 关系不是线性的,而是指数级
  • 超参数多一个取值并不只是多一个模型
  • 超参数1取5个值、超参数2取10个值,共50个模型!

那交叉验证呢?

  • 10 折交叉验证会变成 50x10 = 500 个模型!
Python 中的超参数调优

从 2 个到 N 个超参数

 

如果再加更多超参数呢?

可以把循环再嵌套!

# 调整要测试的取值列表
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
Python 中的超参数调优

从 2 个到 N 个超参数

调整我们的函数:

def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
    model = GradientBoostingClassifier(
        learning_rate=learn_rate, 
        max_depth=max_depth,
        subsample=subsample,
        max_features=max_features)
    predictions = model.fit(X_train, y_train).predict(X_test)
    return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
Python 中的超参数调优

从 2 个到 N 个超参数

调整 for 循环(嵌套):

for learn_rate in learn_rate_list:
    for max_depth in max_depth_list:
        for subsample in subsample_list:
            for max_features in max_features_list:
                results_list.append(gbm_grid_search(learn_rate,max_depth,
                                     subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
                         'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
Python 中的超参数调优

从 2 个到 N 个超参数

 

现在有多少模型?

  • 7x9x5x2 = 630(若做交叉验证则为 6,300)

不可能一直无限嵌套!

另外,如果我们想要:

  • 训练时间和评分的细节
  • 交叉验证评分的细节
Python 中的超参数调优

介绍网格搜索

来创建一个网格:

  • 左侧是所有 max_depth 的取值
  • 顶部是所有 learning_rate 的取值

超参数组合表

Python 中的超参数调优

介绍网格搜索

逐个遍历网格中的单元格:

超参数组合表

(4,0.001) 等价于如下估计器:

GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
Python 中的超参数调优

网格搜索的优缺点

 

此方法的一些优点:

优点:

  • 你无需写成千上万行代码
  • 在网格内找到最佳模型(此处有特别说明!)
  • 易于解释
Python 中的超参数调优

网格搜索的优缺点

 

此方法的一些缺点:

  • 计算开销大!还记得我们多快就做了 6,000+ 个模型吗?
  • 它是"无引导"的。一个模型的结果不会帮助下一个模型的创建。

 

我们稍后将介绍"有引导"的方法!

Python 中的超参数调优

Vamos praticar!

Python 中的超参数调优

Preparing Video For Download...