简单三步,即可对任何Python脚本进行超参数优化!

你是否有过编写了一个Python脚本来训练和评估机器学习模型的经历?

你想自动调整超参数以提高其性能吗?

那么这篇文章将能够帮助到你!

在本文中,我将向你展示如何将脚本转换为可以使用任何超参数优化库进行优化的目标函数。

简单三步,即可对任何Python脚本进行超参数优化!

只需要3个步骤,你就能调整好模型参数。

准备好了吗?

我们开始吧!

你的main.py脚本看起来像这样:

<code>import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import train_test_split
data = pd.read_csv('data/train.csv', nrows=10000)
X = data.drop(['ID_code', 'target'], axis=1)
y = data['target']
(X_train, X_valid,
y_train, y_valid )= train_test_split(X, y, test_size=0.2, random_state=1234)
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_valid, label=y_valid, reference=train_data)
params = {'objective': 'binary',
'metric': 'auc',
'learning_rate': 0.4,
'max_depth': 15,
'num_leaves': 20,
'feature_fraction': 0.8,
'subsample': 0.2}
model = lgb.train(params, train_data,
num_boost_round=300,
early_stopping_rounds=30,
valid_sets=[valid_data],
valid_names=['valid'])
score = model.best_score['valid']['auc']
print('validation AUC:', score)/<code>

步骤1:从代码中分离搜索参数

获取要优化的参数,并将它们放入脚本顶部的字典中。通过个步骤,你可以有效地将搜索参数与代码的其余部分分离。

<code>import pandas as pd 

import lightgbm as lgb
from sklearn.model_selection import train_test_split
SEARCH_PARAMS = {'learning_rate': 0.4,
'max_depth': 15,
'num_leaves': 20,
'feature_fraction': 0.8,
'subsample': 0.2}
data = pd.read_csv('../data/train.csv', nrows=10000)
X = data.drop(['ID_code', 'target'], axis=1)
y = data['target']
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=1234)
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_valid, label=y_valid, reference=train_data)
params = {'objective': 'binary',
'metric': 'auc',
**SEARCH_PARAMS}
model = lgb.train(params, train_data,
num_boost_round=300,
early_stopping_rounds=30,
valid_sets=[valid_data],
valid_names=['valid'])
score = model.best_score['valid']['auc']
print('validation AUC:', score)/<code>

步骤2:将训练和评估模型打包到一个函数中

现在,你可以将整个训练和评估模型的逻辑放入train_evaluate函数中。此函数将参数作为输入并输出验证分数。

<code>import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import train_test_split
SEARCH_PARAMS = {'learning_rate': 0.4,
'max_depth': 15,
'num_leaves': 20,
'feature_fraction': 0.8,
'subsample': 0.2}
def train_evaluate(search_params):
data = pd.read_csv('../data/train.csv', nrows=10000)
X = data.drop(['ID_code', 'target'], axis=1)
y = data['target']
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=1234)
train_data = lgb.Dataset(X_train, label=y_train)
valid_data = lgb.Dataset(X_valid, label=y_valid, reference=train_data)
params = {'objective': 'binary',

'metric': 'auc',
**search_params}
model = lgb.train(params, train_data,
num_boost_round=300,
early_stopping_rounds=30,
valid_sets=[valid_data],
valid_names=['valid'])
score = model.best_score['valid']['auc']
return score
if __name__ == '__main__':
score = train_evaluate(SEARCH_PARAMS)
print('validation AUC:', score)/<code>

步骤3:运行Hypeparameter优化脚本

我们就快完成了。

你现在需要做的就是使用这个train_evaluate函数作为你选择的黑盒优化库的目标。

我将使用Scikit Optimize,我在另一篇文章中详细介绍了它,但是你可以使用任何超参数优化库。

简而言之:

  • 定义搜索空间;
  • 创建最小化的目标函数;
  • 通过skopt.forest_minimize函数运行优化。

在这个例子中,我将尝试100种不同的配置,从10个随机选择的参数集开始。



<code>import skopt
from/>SPACE = [
skopt.space.Real(0.01, 0.5, name='learning_rate', prior='log-uniform'),
skopt.space.Integer(1, 30, name='max_depth'),
skopt.space.Integer(2, 100, name='num_leaves'),
skopt.space.Real(0.1, 1.0, name='feature_fraction', prior='uniform'),
skopt.space.Real(0.1, 1.0, name='subsample', prior='uniform')]
@skopt.utils.use_named_args(SPACE)
def objective(**params):
return -1.0 * train_evaluate(params)
results = skopt.forest_minimize(objective, SPACE, n_calls=30, n_random_starts=10)
best_auc = -1.0 * results.fun
best_params = results.x
print('best result: ', best_auc)
print('best parameters: ', best_params)/<code>

results对象包含有关最佳分数的信息以及产生它的参数。


注:如果你想可视化你的训练并在训练结束后保存诊断图表,你可以添加一个回调和一个函数调用来记录每一个超参数搜索到海王星。

<code>import neptune
import neptunecontrib.monitoring.skopt as sk_utils
import skopt
from/>neptune.init('jakub-czakon/blog-hpo')
neptune.create_experiment('hpo-on-any-script', upload_source_files=['*.py'])
SPACE = [
skopt.space.Real(0.01, 0.5, name='learning_rate', prior='log-uniform'),
skopt.space.Integer(1, 30, name='max_depth'),
skopt.space.Integer(2, 100, name='num_leaves'),
skopt.space.Real(0.1, 1.0, name='feature_fraction', prior='uniform'),
skopt.space.Real(0.1, 1.0, name='subsample', prior='uniform')]
@skopt.utils.use_named_args(SPACE)
def objective(**params):
return -1.0 * train_evaluate(params)
monitor = sk_utils.NeptuneMonitor()
results = skopt.forest_minimize(objective, SPACE, n_calls=100, n_random_starts=10, callback=[monitor])

sk_utils.log_results(results)
neptune.stop()/<code>

现在,运行参数扫描时,你将看到以下内容:

简单三步,即可对任何Python脚本进行超参数优化!

查看skopt超参数扫描实验的所有代码、图表和结果。

最后

在本文中,你只需3个步骤就学会了如何优化几乎所有Python脚本的超参数。

希望有了这些知识,你能用更少的时间建立更好的机器学习模型。

开始训练你的模型吧!


本文翻译:未艾信息(http://www.weainfo.net/)

欢迎大家关注我们的公众号:为AI呐喊(weainahan)

为了帮助更多缺少项目实战的同学入门Python,我们在头条上创建了一个专栏:欢迎大家点击下方链接或者阅读原文进行试看~


分享到:


相關文章: