Вы немного озадачены тем, что знаете об основах кривых ROC и автоэнкодеров ...
Цитирование из документации scikit-learn из roc_curve
:
roc_curve (y_true, y_score, pos_label = None, sample_weight = None, drop_intermediate = True)
Параметры:
y_true: массив, форма = [n_samples]
Истинные двоичные метки.Если метки не являются {-1, 1} или {0, 1}, тогда явно указывается pos_label.
y_score: array, shape = [n_samples]
Целевые оценки могут быть оценками вероятности положительного класса, доверительными значениями илимера решений, не имеющая порогового значения (возвращаемая функцией «function_function» для некоторых классификаторов).
Другими словами, оба входа в roc_curve
должны быть простыми одномерными массивами скалярных чисел, первоеодин содержит истинные классы, а второй - прогнозируемые баллы.
Теперь, несмотря на то, что вы не показываете образец своих собственных данных, и хотя я не сомневаюсь, что ваш Y_test.argmax(axis=1)
может соответствовать этой спецификации, скорее всего, ваш decoded_imgs.argmax(axis=1)
(однакоВы изменили это) не .Зачем?Из-за самой природы автоэнкодера.
В отличие от моделей, подобных классификатору Random Forest, вы также пытаетесь использовать в (теперь удаленной) части вашего кода, автоэнкодеры не являются классификаторами : их функция состоит в том, чтобы восстановить (введенную в исходное состояние, сжатую и т. д.) версию их входных данных, а , а не для создания предсказаний классов (см. небольшой учебник в блоге Keras для быстрого ознакомленияориентация).Что, в вашем случае, означает, что ваши decoded_imgs
на самом деле являются преобразованными изображениями (или изображениями, подобными данным, в любом случае), а не оценками класса, требуемыми для roc_curve
, следовательно, ошибка (которая, технически говоря, на самом делеиз-за того, что decoded_imgs
не является одномерным массивом, но, надеюсь, вы поняли).
Даже если бы вы использовали классификатор вместо автоэнкодера здесь, вы бы столкнулись с другой проблемой: кривые ROCиспользуются для бинарных классификационных задач, а не для многоклассовых, таких как MNIST (на самом деле есть некоторые подходы, применяющие их к мультиклассовым данным, но они не используются AFAIK широко).Это правда, что внешне roc_curve
scikit-learn будет работать даже в мультиклассовой настройке:
import numpy as np
from sklearn import metrics
y = np.array([0, 1, 1, 2, 2]) # 3-class problem
scores = np.array([0.05, 0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2) # works OK, no error
, но на самом деле это происходит только потому, что мы явно определили, что pos_label=2
, следовательно, подХуд, scikit-learn рассматривает все метки, кроме 2
, как отрицательные, и впоследствии обрабатывает остальные вычисления, как если бы наша задача была двоичной (т. е. класс 2
против всех других классов).
В вашем случае (MNIST) вы должны задать себе вопрос: что именно является "положительным" в наборе данных MNIST из 10 классов? И имеет ли этот вопрос смысл? Надеюсь, вы сможете убедить себя, что ответ не простой, как в двоичном (0/1) случае.
Подведем итог: кодировка отсутствует1075 * ошибка здесь для исправления;Основная причина вашей проблемы заключается в том, что вы пытаетесь сделать что-то бессмысленное и недопустимое, поскольку авто-кодеры не генерируют предсказания классов, поэтому их выходные данные нельзя использовать для вычисления кривой ROC.Я любезно предлагаю сначала получить четкое представление о соответствующих понятиях и концепциях, прежде чем переходить к заявкам ...