Возможно ли получить только 0 и 1 для мультиклассовой задачи с несколькими метками в tenorflow.keras.models.Sequential.predict? - PullRequest
0 голосов
/ 13 апреля 2019

Допустим, у меня есть 3 класса, и каждый образец может принадлежать к любому из этих классов.Этикетки выглядят следующим образом.

[
    [1 0 0]
    [0 1 0]
    [0 0 1]
    [1 1 0]
    [1 0 1]
    [0 1 1]
    [1 1 1]
]

Я установил свой вывод как Dense (3, активации = "сигмоид"), и я скомпилировал с помощью optimizer = "adam", loss = "binary_crossentropy".По выводам Keras я получаю 0.05 для потерь и 0.98 для точности.

Я думал, что получу только 1 или 0 для значений прогноза, если я использую sigmoid и binary_crossentropy.Тем не менее, model.predict (Training-Features) дал мне значения от 1 до 0, как 0,0026.Я перепробовал все 4 комбинации между категорийным_кросентропией и двоичным_кросентропией с сигмоидом и софтмаксом.Model.predict всегда возвращает значение от 0 до 1 с формой n_samples по n_classes.В приведенном выше примере это будет 7x3.

Затем я обрезал значения на 0,5, как показано ниже, и проверил точность_отчёта (training_labels, preds).Счет упал до 0,1.

preds[preds>=0.5] = 1
preds[preds<0.5] = 0

Буду признателен, если кто-нибудь даст мне несколько советов о том, как мне следует подходить к этой проблеме.

Спасибо!

1 Ответ

1 голос
/ 13 апреля 2019

Согласно вашему описанию, это проблема классификации по нескольким меткам, и поэтому вы должны использовать sigmoid в качестве функции активации последнего слоя и binary_crossentropy в качестве функции потерь. Это потому, что мы считаем классификацию каждой метки независимой от всех других меток. Поэтому использование softmax или 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
...