«Это 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)