SKLearn — Понимание несоответствия между LogisticRegressionCV classification_report и оценками_

#python #scikit-learn #logistic-regression #cross-validation

#python #scikit-учиться #логистическая регрессия #перекрестная проверка

Вопрос:

Я сталкиваюсь со странной ситуацией, когда моя LogisticRegressionCV модель sklearn, по-видимому, получает 100% точность (отсутствие перетасовки является преднамеренным). Однако, когда я прошу модель сообщить свои оценки точности, оценки точности для обратной регуляризации намного ниже 100%. Что я делаю не так?

Модель:

     
    decoder = LogisticRegressionCV(
        penalty='l1',                       # want sparse parameters
        cv=KFold(n_splits=5, shuffle=False),
        Cs=np.logspace(-1, 2, 3),
        random_state=0,                     # reproducibility
        dual=False,                         # Prefer dual=False when n_samples > n_features.
        solver='liblinear',                 # for l1 penalty, must use liblinear or saga
        max_iter=1e5,                       # give plenty of time to get good performance
        fit_intercept=False,
        class_weight='balanced',
    ).fit(X, y)
    
    y_hat = decoder.predict(X)
    
    y_hat_probs = decoder.predict_proba(X)
    
    print(classification_report(y, y_hat))
    print(confusion_matrix(y, y_hat))
 

результаты

               precision    recall  f1-score   support

         0.0       1.00      1.00      1.00       374
         1.0       1.00      1.00      1.00       105

    accuracy                           1.00       479
   macro avg       1.00      1.00      1.00       479
weighted avg       1.00      1.00      1.00       479

[[374   0]
 [  0 105]]
 

Запрос значений decoder.scores_ результатов не приближается к 100%:

 {1.0: array([[0.35416667, 0.60416667, 0.61458333],
        [0.64583333, 0.64583333, 0.65625   ],
        [0.59375   , 0.65625   , 0.64583333],
        [0.54166667, 0.57291667, 0.59375   ],
        [0.17894737, 0.61052632, 0.65263158]])}
 

Почему существует это несоответствие?

Ответ №1:

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

y_hat = decoder.predict(X) — Здесь вы вычисляете показатели на обучающем наборе. Модель видела все эти данные во время обучения, поэтому у нее было легче сделать правильные прогнозы по сравнению с примером CV.

Вы не хотите оценивать свою модель на обучающем наборе, потому что результат такой оценки может быть чрезмерно оптимистичным.

Наличие большой разницы между точностью прогнозирования в обучающем наборе по сравнению с набором проверки обычно означает, что модель переобучает данные — вместо изучения полезных представлений она просто запоминает отображение ввода / вывода.