ValueError: данные не являются двоичными, а pos_label не указывается
Я пытаюсь вычислить roc_auc_score
, но я получаю следующую ошибку.
"ValueError: Data is not binary and pos_label is not specified"
Мой фрагмент кода выглядит следующим образом:
import numpy as np
from sklearn.metrics import roc_auc_score
y_scores=np.array([ 0.63, 0.53, 0.36, 0.02, 0.70 ,1 , 0.48, 0.46, 0.57])
y_true=np.array(['0', '1', '0', '0', '1', '1', '1', '1', '1'])
roc_auc_score(y_true, y_scores)
Скажите, пожалуйста, что с этим не так.
Ответы
Ответ 1
Вам нужно только изменить y_true
чтобы он выглядел так:
y_true=np.array([0, 1, 0, 0, 1, 1, 1, 1, 1])
Объяснение: Если вы посмотрите на функции roc_auc_score
в https://github.com/scikit-learn/scikit-learn/blob/0.15.X/sklearn/metrics/metrics.py, вы увидите, что y_true
оценивается как следующим образом:
classes = np.unique(y_true)
if (pos_label is None and not (np.all(classes == [0, 1]) or
np.all(classes == [-1, 1]) or
np.all(classes == [0]) or
np.all(classes == [-1]) or
np.all(classes == [1]))):
raise ValueError("Data is not binary and pos_label is not specified")
В момент выполнения pos_label
есть None
, но пока вы определяете y_true
как массив символов, np.all
всегда false
и, поскольку все они отрицаются, условие if true
и исключение возникает.
Ответ 2
Ваш код в порядке, что в последней версии scikit-learn, это 0.20.+. Я не понимаю, какие модификации они делают между версией 0.19.2 и версией 0.20.0. В версии 0.19.2 такая же ситуация, но пропустил в версии 0.20.0
Ответ 3
У нас проблема в
y_true=np.array(['0', '1', '0', '0', '1', '1', '1', '1', '1'])
Преобразовать значения y_true в логическое значение
y_true= '1' <= y_true
print(y_true) # [False True False False True True True True True]