@Cost_Estimator

Есть ли смысл использовать вместе optuna и KFold?

Часть первая:
def objective(trial):
    X = train.drop(columns = ['id', 'target'])
    Y = train['target']
    X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y, train_size = 0.75, random_state = 42)

    param = {
        'n_estimators': trial.suggest_int('n_estimators', 6600, 6650),
        'random_strength': trial.suggest_int('random_strength', 0, 100),                       
        'bagging_temperature': trial.suggest_loguniform('bagging_temperature', 0.01, 100.00),
        'od_type': trial.suggest_categorical('od_type', ['IncToDec', 'Iter']),
        'learning_rate': trial.suggest_float('learning_rate', 0.0704, 0.0705),
        'l2_leaf_reg': trial.suggest_float('l2_leaf_reg', 0.2618, 0.2619),
        'max_bin': trial.suggest_int('max_bin', 140, 145),
        'depth': trial.suggest_int('depth', 3, 4),
        'min_data_in_leaf': trial.suggest_int('min_data_in_leaf', 140, 145),
        'used_ram_limit': '16gb',
        'verbose': 0
    }

    gbm = CatBoostRegressor(**param,
                            eval_metric = 'AUC',
                            random_state = 42)

    gbm.fit(X_train, Y_train, eval_set = [(X_validation, Y_validation)], verbose = 0, early_stopping_rounds = 100)

    preds = gbm.predict(X_validation)
    pred_labels = np.rint(preds)
    accuracy = roc_auc_score(Y_validation, pred_labels)
    return accuracy


if __name__ == '__main__':
    study = optuna.create_study(direction = 'maximize')
    study.optimize(objective, n_trials = 100, timeout = 7*3600)

    print('Number of finished trials: {}'.format(len(study.trials)))

    print('Best trial:')
    trial = study.best_trial

    print('  Value: {}'.format(trial.value))

    print('  Params: ')
    for key, value in trial.params.items():
        print('    {}: {}'.format(key, value))


Часть вторая:
kf = StratifiedKFold(n_splits = 10 , shuffle = True , random_state = 42)
for fold, (tr_index , val_index) in enumerate(kf.split(X.values, Y.values)):

    print("-" * 50)
    print(f"Fold {fold + 1}")
    
    x_train, x_val = X.values[tr_index], X.values[val_index]
    y_train, y_val = Y.values[tr_index], Y.values[val_index]
        
    eval_set = [(x_val, y_val)]
    
    model = CatBoostRegressor(random_seed = 42, **study.best_trial.params)
    model.fit(x_train, y_train,
              eval_set = eval_set, verbose = 0)
    
    train_preds = model.predict(x_train)    
    val_preds = model.predict(x_val)
    
    print('AUC => {}'.format(roc_auc_score(y_val, val_preds)))
    
    if test_preds is None:
        test_preds = model.predict(test[cols].values)
    else:
        test_preds += model.predict(test[cols].values)

print("-" * 50)
test_preds /= 10


Подскажите пожалуйста, из прошлого опыта - насколько весомое увеличение точности может дать такая стратегия? На Kaggle мучаю ежемесячный конкурс, отрыв от первого места 0.12% (мое 240+). Данные - 1 млн строк, 286 параметров (если сие важно).
  • Вопрос задан
  • 27 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы