#python #tensorflow #keras #deep-learning #multilabel-classification
#python #тензорный поток #keras #глубокое обучение #multilabel-классификация
Вопрос:
Допустим, у меня есть 3 класса, и каждый образец может принадлежать любому из этих классов. Метки выглядят так.
[
[1 0 0]
[0 1 0]
[0 0 1]
[1 1 0]
[1 0 1]
[0 1 1]
[1 1 1]
]
Я установил свой вывод как плотный (3, активация =»сигмоид»), и я скомпилировал с optimizer =»adam», loss =»binary_crossentropy».
Я получаю 0,05 для потерь и 0,98 для точности, согласно выводам Keras.
Я думал, что получу только 1 или 0 для значений прогнозирования, если я использую сигмоид и binary_crossentropy . Однако model.predict(training-features) дал мне значения от 1 до 0, например, 0.0026. Я перепробовал все 4 комбинации между categorical_crossentropy и binary_crossentropy с помощью sigmoid и softmax. Model.predict всегда возвращает значение от 0 до 1 с формой n_samples по n_classes . В приведенном выше примере это было бы 7×3.
Затем я обрезал значения на 0,5, как показано ниже, и проверил accuracy_score (training_labels, preds). Оценка упала до 0.1.
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
Я был бы признателен, если бы кто-нибудь мог дать мне некоторые рекомендации о том, как мне следует подойти к этой проблеме.
Спасибо!
Ответ №1:
Согласно вашему описанию, это проблема классификации с несколькими метками, и поэтому вы должны использовать sigmoid
ее как функцию активации последнего слоя и binary_crossentropy
как функцию потерь. Это потому, что мы считаем, что классификация каждой метки не зависит от всех других меток. Поэтому использование softmax
or categorical_crossentropy
в этом сценарии неверно.
Несоответствие между точностью, сообщаемой Keras, и точностью, вычисленной с помощью sklearn.metrics.accuracy_score()
функции, не связано с округлением; на самом деле Keras выполняет то же округление (или обрезку), которое вы сделали для вычисления точности. Скорее, разница связана с тем фактом, что accuracy_score
функция в режиме классификации с несколькими метками считает выборку правильно классифицированной только тогда, когда все истинные метки и предсказанные метки для этой выборки совпадают друг с другом. Это было четко указано в документации:
В классификации с несколькими метками эта функция вычисляет точность подмножества: набор меток, предсказанных для выборки, должен точно соответствовать соответствующему набору меток в y_true .
Однако в Keras binary_accuracy
функция сообщает среднюю долю правильно классифицированных меток (т.Е. Допустимо частичное совпадение). Чтобы лучше понять это, рассмотрим следующий пример:
True labels | Predictions | Keras binary acc | accuracy_score
-----------------------------------------------------------------
[1 0 0] | [1 0 1] | 2 correct = 0.66 | not match = 0.00
[0 1 1] | [0 1 1] | 3 correct = 1.00 | match = 1.00
[1 0 1] | [0 0 1] | 2 correct = 0.66 | not match = 0.00
=================================================================
average reported acc | 0.77 | 0.33
Комментарии:
1. Спасибо за объяснение. Если я использую сигмоид и binary_crossentropy, мне все равно придется вручную обрезать (preds>= 0.5 = 1, preds<05 = 0), или есть лучший способ сделать это?
2. @jl303 Вы должны это сделать, если хотите получить прогнозы в виде 0 или 1 (т. Е. Округление не может быть выполнено в модели). Хотя, один более чистый способ сделать это после получения прогнозов — использовать
np.around
function:preds = np.around(preds)
.3. Спасибо @today! Функция Round определенно чище! Изучив документацию, на которую вы указали, я нашел label_ranking_loss и label_ranking_average_precision_score, но оценки по-прежнему намного ниже, чем потери и оценки от Keras. Оценки Keras на секунду меня взволновали, но оценки SciKit-learn заставляют мою модель выглядеть очень плохо! 🙁 В общем, на каких показателях я должен сосредоточиться для улучшения многоклассовых многоклассовых задач?
4. @jl303 Вы можете получить некоторые сведения из соответствующего раздела в документе sklearn. Похоже, что потеря Хэмминга — хороший вариант. Хотя я думаю, что метрики, используемые для классификации с несколькими метками, установлены не так сильно, как те, которые используются для классификации с несколькими классами или двоичной классификации. Вы должны выполнить поиск соответствующих наборов данных классификации с несколькими метками и их соответствующих документов и посмотреть, какие показатели используются для сравнения различных методов.