Python 中的超参数调优
Alex Scriven
Data Scientist
你之前的工作:
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 中进行分析。
测试 2 个超参数的取值呢?
使用 GBM 算法:
learn_rate [0.001, 0.01, 0.05]max_depth [4,6,8,10]我们可以用(嵌套)for 循环!
先写一个建模函数:
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)])
现在可遍历超参数列表并调用函数:
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))
也可把这些结果放入 DataFrame 并打印:
results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

加入更多超参数和值会构建更多模型。
那交叉验证呢?
如果再加更多超参数呢?
可以把循环再嵌套!
# 调整要测试的取值列表
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']
调整我们的函数:
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)])
调整 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)
现在有多少模型?
不可能一直无限嵌套!
另外,如果我们想要:
来创建一个网格:

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

(4,0.001) 等价于如下估计器:
GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
此方法的一些优点:
优点:
此方法的一些缺点:
我们稍后将介绍"有引导"的方法!
Python 中的超参数调优