如何在Optuna的objective
函数中同时优化多个指标?例如,我在训练一个LGBM分类器,希望找到最佳的超参数集,以优化所有常见的分类指标,如F1、精确率、召回率、准确率、AUC等。
def objective(trial): # 训练 gbm = lgb.train(param, dtrain) preds = gbm.predict(X_test) pred_labels = np.rint(preds) # 计算指标 accuracy = sklearn.metrics.accuracy_score(y_test, pred_labels) recall = metrics.recall_score(pred_labels, y_test) precision = metrics.precision_score(pred_labels, y_test) f1 = metrics.f1_score(pred_labels, y_test, pos_label=1) ...
我该怎么做?
回答:
在定义参数网格并使用这些参数拟合模型并生成预测后,计算你想要优化的所有指标:
def objective(trial): param_grid = {"n_estimators": trial.suggest_int("n_estimators", 2000, 10000, step=200)} clf = lgbm.LGBMClassifier(objective='binary', **param_grid) clf.fit(X_train, y_train) preds = clf.predict(X_valid) probs = clf.predict_proba(X_valid) # 指标 f1 = sklearn.metrics.f1_score(y_valid, press) accuracy = ... precision = ... recall = ... logloss = ...
然后按照你希望的顺序返回这些指标:
def objective(trial): ... return f1, logloss, accuracy, precision, recall
接着,在研究对象中,指定每个指标是希望最小化还是最大化,并将其设置到directions
参数中,如下所示:
study = optuna.create_study(directions=['maximize', 'minimize', 'maximize', 'maximize', 'maximize'])study.optimize(objective, n_trials=100)
有关更多详情,请查看Optuna文档中的多目标优化部分。