#python #machine-learning #scikit-learn #classification #auc
#python #машинное обучение #scikit-learn #классификация #auc
Вопрос:
Исследуя некоторые модели классификации в Scikit learn, я заметил, что оценки, которые я получил за потерю журнала и за ROC AUC, были последовательно ниже при выполнении перекрестной проверки, чем при подгонке и прогнозировании всего обучающего набора (сделано для проверки на переобучение), что для меня не имело смысла. В частности, используя cross_validate
я устанавливаю оценки как ['neg_log_loss', 'roc_auc']
и при выполнении ручной подгонки и прогнозирования на обучающем наборе я использовал метрические функции log_loss'
и roc_auc_score
.
Чтобы попытаться выяснить, что происходит, я написал код для выполнения перекрестной проверки вручную, чтобы иметь возможность вручную вызывать метрические функции для различных сгибов и сравнивать результаты с результатами из cross_validate
. Как вы можете видеть ниже, я получил разные результаты даже таким образом!
from sklearn.model_selection import StratifiedKFold
kf = KFold(n_splits=3, random_state=42, shuffle=True)
log_reg = LogisticRegression(max_iter=1000)
for train_index, test_index in kf.split(dataset, dataset_labels):
X_train, X_test = dataset[train_index], dataset[test_index]
y_train, y_test = dataset_labels_np[train_index], dataset_labels_np[test_index]
log_reg.fit(X_train, y_train)
pr = log_reg.predict(X_test)
ll = log_loss(y_test, pr)
print(ll)
from sklearn.model_selection import cross_val_score
cv_ll = cross_val_score(log_reg, dataset_prepared_stand, dataset_labels, scoring='neg_log_loss',
cv=KFold(n_splits=3, random_state=42, shuffle=True))
print(abs(cv_ll))
Выводит:
4.795481869275026
4.560119170517534
5.589818973403791
[0.409817 0.32309 0.398375]
Выходные данные, выполняющие тот же код для ROC AUC:
0.8609669592272686
0.8678563239907938
0.8367147503682851
[0.925635 0.94032 0.910885]
Чтобы быть уверенным, что код написан правильно, я также попробовал код, использующий 'accuracy'
as scoring для перекрестной проверки и accuracy_score
как метрическую функцию, и результаты вместо этого согласованы:
0.8611584327086882
0.8679727427597955
0.838160136286201
[0.861158 0.867973 0.83816 ]
Может кто-нибудь объяснить мне, почему результаты в случае потери журнала и ROC AUC разные? Спасибо!
Ответ №1:
Log-loss и auROC нуждаются в прогнозах вероятности, а не в прогнозах жесткого класса. Поэтому измените
pr = log_reg.predict(X_test)
Для
pr = log_reg.predict_proba(X_test)[:, 1]
(подписка предназначена для получения вероятностей для положительного класса и предполагает, что вы выполняете двоичную классификацию).
Комментарии:
1. Большое спасибо, я пропустил это! (Я заметил, что auc_roc_score и log_loss также принимают прогноз без выбора столбцов для положительного класса, по крайней мере, для двоичной классификации)