Оптимальный порог для проблемы несбалансированной бинарной классификации - PullRequest
0 голосов
/ 13 февраля 2020

У меня проблемы с оптимизацией порога для бинарной классификации. Я использую 3 модели: Logisti c Regression, Catboost и Sklearn RandomForestClassifier.

Для каждой модели я делаю следующие шаги:

1) подходит модель

2) получает 0,0 отзыва для первого класса (который принадлежит 5% набора данных) и 1,0 отзыв для нулевого класса. (это нельзя исправить с помощью gridsearch и class_weight = сбалансированного параметра.)>: (* ​​1007 *

3) Найти оптимальный порог

fpr, tpr, thresholds = roc_curve(y_train, model.predict_proba(X_train)[:, 1])
optimal_threshold = thresholds[np.argmax(tpr - fpr)]

4) Наслаждайтесь ~ 70 коэффициентами отзыва для обоих классы.

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

Здесь возникает вопрос: когда я снова запускаю код и снова, если я не исправляю random_state, оптимальный порог является вариантом и резко меняется. Это приводит к драматическим c изменениям метрик точности на основе тестового образца.

Нужно ли рассчитывать некоторый средний порог и использовать его в качестве постоянного жесткого значения? Или, может быть, я должен исправить везде random_state? Или, возможно, метод нахождения оптимального_порога не верен?

1 Ответ

1 голос
/ 14 февраля 2020

Если вы не установите random_state на фиксированные значения, результаты будут отличаться при каждом запуске. Чтобы получить воспроизводимые результаты, установите random_state везде, где требуется фиксированное значение, или используйте фиксированное numpy случайное начальное число numpy.random.seed.

https://scikit-learn.org/stable/faq.html#how -do-i-set-a-random- состояние для полного выполнения

В Scikit FAQ упоминается, что лучше использовать random_state там, где это необходимо, вместо глобального случайного состояния.

Пример глобального случайного состояния:

import numpy as np
np.random.seed(42)

Некоторые примеры локальных настроек random_state:

X_train, X_test, y_train, y_test = train_test_split(sample.data, sample.target, test_size=0.3, random_state=0)

skf =  StratifiedKFold(n_splits=10, random_state=0, shuffle=True)

classifierAlgorithm = LGBMClassifier(objective='binary', random_state=0)
...