sklearn LogisticRegression и изменение порога по умолчанию для классификации

Я использую LogisticRegression из пакета sklearn и имею быстрый вопрос о классификации. Я построил кривую ROC для своего классификатора, и оказалось, что оптимальный порог для моих данных обучения составляет около 0,25. Я предполагаю, что порог по умолчанию при создании прогнозов равен 0.5. Как изменить этот параметр по умолчанию, чтобы узнать, какова точность в моей модели при выполнении 10-кратной перекрестной проверки? В принципе, я хочу, чтобы моя модель предсказывала "1" для тех, кто больше чем 0.25, а не 0.5. Я просмотрел всю документацию и, кажется, ничего не нашел.

заранее спасибо за вашу помощь.

2 ответов


это не встроенная функция. Вы можете "добавить" его, обернув класс LogisticRegression в свой собственный класс, и добавив threshold атрибут, который вы используете внутри пользовательского predict() метод.

однако, некоторые предостережения:

  1. порог по умолчанию фактически равен 0. LogisticRegression.decision_function() возвращает подписанное расстояние до выбранной разделительной гиперплоскости. Если вы смотрите на predict_proba(), тогда вы смотрите на logit() на расстояние гиперплоскости с порогом 0.5. Но это дороже вычислить.
  2. выбрав" оптимальный " порог, вы используете информацию после обучения, которая портит ваш тестовый набор (т. е. ваш тест или набор проверки больше не обеспечивает объективную оценку ошибки вне выборки). Таким образом, вы можете вызвать дополнительную подгонку, если вы не выберете порог внутри цикла перекрестной проверки только в своем учебном наборе, а затем использовать его и обученный классификатор с тестом набор.
  3. рассмотрите возможность использования class_weight если у вас есть неуравновешенная проблема, а не ручная установка порога. Это должно заставить классификатор выбрать гиперплоскость дальше от класса серьезного интереса.

Я хотел бы дать практический ответ

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, recall_score, roc_auc_score, precision_score

X, y = make_classification(
    n_classes=2, class_sep=1.5, weights=[0.9, 0.1],
    n_features=20, n_samples=1000, random_state=10
)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

clf = LogisticRegression(class_weight="balanced")
clf.fit(X_train, y_train)
THRESHOLD = 0.25
preds = np.where(clf.predict_proba(X_test)[:,1] > THRESHOLD, 1, 0)

pd.DataFrame(data=[accuracy_score(y_test, preds), recall_score(y_test, preds),
                   precision_score(y_test, preds), roc_auc_score(y_test, preds)], 
             index=["accuracy", "recall", "precision", "roc_auc_score"])

изменение THRESHOLD to 0.25 можно найти recall и precision баллы снижаются. Однако, удалив