[Практика] Использование инструмента автоматической настройки параметров optuna

сбор данных

«Это 20-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."

optuna — это фреймворк автоматической оптимизации гиперпараметров, специально разработанный для машинного обучения, глубокого обучения и пользовательского API с функциями языка сценариев. Поэтому код optuna очень модульный, и пользователи могут динамически формировать пространство поиска гиперпараметров в соответствии со своими пожеланиями. Кроме того, optuna также является очень популярным артефактом настройки параметров в соревнованиях kaggle и часто появляется в отличных программах. прощай жестокийGridSearchОтрегулируйте параметры.

адрес проекта:GitHub.com/op tuna/op figure…

Особенности рамы

  • Маленький и легкий, универсальный и независимый от платформы
  • Поиск пространства гиперпараметров в форме python
  • Эффективный алгоритм оптимизации
  • Просто написать, можно распараллелить
  • быстрая визуализация

Установить

Optuna поддерживает Python 3.6 и выше

pip установить Оптуна

pip install optuna

conda установить Optuna

conda install -c conda-forge optuna

Пример

Как правило, гиперпараметры древовидных моделей можно настроить в 3 этапа:

1. Корректировка древовидной структуры

Максимальная глубина:Глубина дерева, если вы не контролируете глубину дерева, легко переобучать, обычно устанавливается на 3-8.

количество_листьев:Количество листовых узлов, модель дерева представляет собой бинарное дерево, поэтому максимальное число листьев не должно превышать2 ^ (максимальная глубина).

min_data_in_leaf:Минимальное количество листовых узлов, если установлено значение 50, тогда дерево перестает расти, когда число достигает 50, поэтому размер этого значения связан с переоснащением, а его размер также связан с num_leaves, Как правило, чем больше набор данных , тем больше значение.

2. Регулировка точности

скорость_обучения:скорость обучения

n_оценщиков:количество деревьев

Эти два параметра часто настраиваются параметры, как правило, необходимо найтиn_estimatorsиlearning_rateлучшее сочетание.

макс_бин:Этот параметр также можно использовать для повышения точности, но также существует риск переобучения.

3. Регулировка переобучения

lambda_l1: обычный L1

lambda_l2: регуляризация L2

Регулярность влияет на переоснащение и ее трудно настроить.Как правило, диапазон поиска устанавливается равным (0,100).

min_gain_to_split:Минимальный выигрыш для разделения, когда расчетное усиление не велико, он не будет продолжать разделение.

мешок_фракция:Процент обучающих выборок для обучения каждого дерева, что делает каждое дерево хорошим и уникальным.

функция_фракция:Процент объектов для выборки для каждого дерева, чтобы каждый объект поддерева был дифференцированным и не поддавался переоснащению.

optuna сводит процедуру оптимизации к трем простым шагам: целевая функция, единичное испытание (проба) и исследование (исследование).

целевая функция

import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score,f1_score
from sklearn.model_selection import  StratifiedKFold
import lightgbm as lgbm

def objective(trial, data, target):
    X_train, X_test, y_train, y_test=train_test_split(data, target, train_size=0.3)# 数据集划分
    # 参数网格
    param_grid = {
        "n_estimators": trial.suggest_categorical("n_estimators", [10000]),
        "learning_rate": trial.suggest_float("learning_rate", 0.01, 0.3),
        "num_leaves": trial.suggest_int("num_leaves", 20, 3000, step=20),
        "max_depth": trial.suggest_int("max_depth", 3, 12),
        "min_data_in_leaf": trial.suggest_int("min_data_in_leaf", 200, 10000, step=100),
        "lambda_l1": trial.suggest_int("lambda_l1", 0, 100, step=5),
        "lambda_l2": trial.suggest_int("lambda_l2", 0, 100, step=5),
        "min_gain_to_split": trial.suggest_float("min_gain_to_split", 0, 15),
        "bagging_fraction": trial.suggest_float("bagging_fraction", 0.2, 0.95, step=0.1),
        "bagging_freq": trial.suggest_categorical("bagging_freq", [1]),
        "feature_fraction": trial.suggest_float("feature_fraction", 0.2, 0.95, step=0.1),
        "random_state": 2021,
    }
    model = lgbm.LGBMClassifier(objective="gbdt", **param_grid)
    model.fit(
        X_train,
        y_train,
        eval_set=[(X_test, y_test)],
        eval_metric="multi_logloss",
        early_stopping_rounds=100,
        verbose=False
    )
    pred_lgb = model.predict(X_test)
    scores = f1_score(y_true=y_test, y_pred=pred_lgb,average='macro')
    return scores

Словесные испытания и исследования:

n_trials=50
train = pd.read_csv("train.csv")
X,y = train.drop(["id","label"],axis=1),train["label"]
study = optuna.create_study(direction="maximize", study_name="LGBM Classifier") # minimize
study.optimize(func, n_trials=n_trials)

Распечатайте лучшие параметры:

print(f"\tBest value (f1): {study.best_value:.5f}")
print(f"\tBest params:")

for key, value in study.best_params.items():
    print(f"\t\t{key}: {value}")

визуализация

optuna.visualization.plot_optimization_history(study)

optuna.visualization.plot_parallel_coordinate(study)

optuna.visualization.plot_param_importances(study)