Высокий AUC, но плохие прогнозы с несбалансированными данными - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь построить классификатор с LightGBM на очень несбалансированном наборе данных. Дисбаланс в соотношении 97:3, то есть:

Class

0    0.970691
1    0.029309

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

lgb_params = {
        'boosting_type': 'gbdt',
        'objective': 'binary',
        'metric':'auc',
        'learning_rate': 0.1,
        'is_unbalance': 'true',  #because training data is unbalance (replaced with scale_pos_weight)
        'num_leaves': 31,  # we should let it be smaller than 2^(max_depth)
        'max_depth': 6, # -1 means no limit
        'subsample' : 0.78
    }

# Cross-validate
cv_results = lgb.cv(lgb_params, dtrain, num_boost_round=1500, nfold=10, 
                    verbose_eval=10, early_stopping_rounds=40)

nround = cv_results['auc-mean'].index(np.max(cv_results['auc-mean']))
print(nround)

model = lgb.train(lgb_params, dtrain, num_boost_round=nround)


preds = model.predict(test_feats)

preds = [1 if x >= 0.5 else 0 for x in preds]

Я запустил CV, чтобы получить лучшую модель и лучший раунд. Я получил 0,994 AUC на CV и аналогичный балл в наборе валидации.

Но когда я прогнозирую на тестовом наборе, я получаю очень плохие результаты. Я уверен, что состав поезда отобран идеально.

Какие параметры необходимо настроить.? В чем причина проблемы.? Должен ли я сделать повторную выборку набора данных так, чтобы уменьшился самый высокий класс ??

1 Ответ

0 голосов
/ 05 июля 2018

Проблема заключается в том, что, несмотря на крайний дисбаланс классов в вашем наборе данных, вы все еще используете пороговое значение «по умолчанию», равное 0,5, при принятии окончательной жесткой классификации в

preds = [1 if x >= 0.5 else 0 for x in preds]

Здесь не .

Это довольно большая тема, и я настоятельно рекомендую вам провести собственное исследование (попробуйте поискать в поисках порог или , чтобы исключить несбалансированность данных ), но вот несколько указателей на Начало работы ...

Из соответствующего ответа на Перекрестная проверка (выделение добавлено):

Не забывайте, что вы должны разумно устанавливать пороги , чтобы делать предсказания. Не всегда лучше прогнозировать 1, когда вероятность модели больше 0,5. Другой порог может быть лучше. Для этого вам следует изучить кривые эксплуатационных характеристик приемника (ROC) вашего классификатора, а не только прогнозирующий успех с порогом вероятности по умолчанию.

Из соответствующей академической статьи Нахождение лучшего порога классификации в несбалансированной классификации :

2,2. Как установить порог классификации для набора тестирования

Прогноз Результаты являются в конечном счете определенный согласно в прогнозирование вероятности. порог является типично задавать в 0,5. Если прогнозирование вероятность превышает 0,5, образец является предсказанный в быть положительны; иначе, отрицательный. Тем не мение, 0,5 является не идеальный за немного случаи, в частности за несбалансированный наборы данных.

Пост Оптимизация вероятностных порогов для дисбалансов классов из (настоятельно рекомендуется) блога «Прикладное прогнозирующее моделирование» также имеет значение.

Возьмите домашний урок из всего вышесказанного: AUC достаточно редко, но сама ROC кривой часто является вашим лучшим другом ...


На более общем уровне относительно роли самого порога в процессе классификации (который, по крайней мере, по моему опыту, многие практики ошибаются), проверьте также Порог вероятности классификации нить (и предоставленные ссылки) на Cross Validated; ключевой момент:

статистический компонент вашего упражнения заканчивается, когда вы выводите вероятность для каждого класса новой выборки. Выбор порога, по которому вы классифицируете новое наблюдение как 1 против 0, больше не является частью статистики . Он является частью компонента решения .

...