Skip to main content
Version: 2.17.1

Hyperopt超参寻优案例

项目说明

Hyperopt是一个sklearn的Python库,在搜索空间上进行串行和并行优化,搜索空间可以是实值,离散和条件维度。

优化库基于 hyperopt-sklearn 和 hyperas, 这两个用于模型选择和优化的函数库分别建立在scikit-learn和keras的基础上。

当前以【鸢尾花分类模型】为例,提供Hyperopt超参寻优模型的案例说明。案例git为:【鸢尾花分类模型】

本地模型建模

为解决鸢尾花分类问题,示例引用了MLPRegressor模型进行训练,涉及到的参数为solver_value, alpha_value, nodes_value, max_iter_value等。

示例代码如下:


def train_model(solver_value, alpha_value, nodes_value, max_iter_value, training_data):
# 数据预处理
data = pd.read_csv(training_data)
raw_data = np.array(data)
x_data = raw_data[:, 0].reshape(-1, 1)
y_data = raw_data[:, 1]

# 模型预测
clf_model = MLPRegressor(solver=solver_value, alpha=alpha_value,
hidden_layer_sizes=(nodes_value, 30, 13, 8),
random_state=1, max_iter=max_iter_value, verbose=True)
clf_model.fit(x_dataset, y_dataset)

predict_results = clf_model.predict(x_dataset)
pre_results = list(predict_results)
re_pre_results = list(np.round(pre_results))
y_dataset = list(y_dataset)

# 输出指标
mae = mean_absolute_error(y_dataset, pre_results)
acc = accuracy_score(y_dataset, re_pre_results)


if __name__ == '__main__':
solver_value = 'adam'
alpha_value = 0.001
nodes_value = 10
max_iter_value = 1000
training_data = './data.csv'
train_model(solver_value, alpha_value, nodes_value, max_iter_value, training_data)

利用Hyperopt进行超参寻优

利用Hyperopt进行超参寻优,主要修改模型的入参部分,将入参传值的方式改为通过 创建参数搜索空间space 的方式进行入参的输入。

示例代码如下:

def experiment(params):
with mlflow.start_run(nested = True):
# 训练模型
clf_model = MLPRegressor(solver=params["solver"], alpha=float(params["alpha"]),
hidden_layer_sizes=(int(params["nodes"]), 30, 13, 8),
random_state=1, max_iter=max_iter, verbose=True)
clf_model.fit(x_dataset, y_dataset)

# 模型预测
predict_results = clf_model.predict(x_dataset)
pre_results = list(predict_results)
re_pre_results = list(np.round(pre_results))
y_dataset = list(y_dataset)

# 输出指标
mae = mean_absolute_error(y_dataset, pre_results)
acc = accuracy_score(y_dataset, re_pre_results)

# 保存模型
mlflow.sklearn.log_model(clf_model, "model")

return {'loss': acc, 'status': STATUS_OK}


def train_model(solver_value, alpha_value, nodes_value, max_iter_value, training_data):
# 数据预处理
data = pd.read_csv(training_data)
raw_data = np.array(data)
x_data = raw_data[:, 0].reshape(-1, 1)
y_data = raw_data[:, 1]

# --- 定义搜索空间 ---
trials = Trials()
global max_iter
max_iter = max_iter_value
# 定义搜索空间
space = {
'solver': hp.choice('solver', solver_value),
'alpha': hp.choice('alpha', alpha_value),
'nodes': hp.choice('nodes', nodes_value),
}
best = fmin(experiment, space, algo=tpe.suggest, max_evals=10, trials=trials)


if __name__ == '__main__':
solver_value = ['sgd', 'adam']
alpha_value = ['0.001', '0.01', '0.1']
nodes_value = ['5', '10', '15']
max_iter_value = 1000
training_data = './data.csv'
train_model(solver_value, alpha_value, nodes_value, max_iter_value, training_data)

后续步骤

有关模型 在线训练部署 工作流的详细信息,请参阅使用 快速开始-基础流程案例

如何修改模型格式,进行在线模型训练,详情请了解开发标准格式的在线训练模型