Как отрегулировать смещение оценок меток в задаче классификации? - PullRequest
4 голосов
/ 20 марта 2020

В настоящее время я работаю над convolutional neural network для обнаружения патологических изменений на x-ray images. Это простая binary classification задача. В начале проекта мы собрали около 6000 x-rays и попросили 3 разных врачей (экспертов в области) label. Каждое из них получило около 2000 случайно выбранных изображений (и эти 3 набора были разделены - одно изображение было помечено только одним врачом).

После того, как labelling было закончено, я хотел проверить, сколько случаев было у каждого врача помечены having и non-having изменениями, и вот что я получил:

# A tibble: 3 x 3
  doctor no_changes (%) changes (%)
   <int>      <dbl>       <dbl>
1      1       15.9        84.1
2      2       54.1        45.9
3      3       17.8        82.2

С моей точки зрения, если каждый из врачей получил случайно выбранный набор данных x-rays,% случаи с изменениями и без них должны быть практически одинаковыми для каждого из них, если предположить, что они «думают одинаково», что здесь не так.

Мы разговаривали с одним из врачей, и он сказал нам, что вполне возможно, что один врач может сказать, что есть изменения в x-ray, а другой может сказать что-то другое, потому что обычно они не смотрят на изменения в двоичном виде - так, например, amount/size изменений могут быть решены в маркировке, и каждый из докторов может иметь разные cutoff в уме.

Зная, что я начал думать о removing/centering labels bias. Вот что я придумала:

  1. Поскольку я знаю доктора 1 (скажем, он лучший эксперт), я решила «переместить» ярлыки доктора 2 и 3 в направлении доктора 1.
  2. Я собрал 300 новых изображений и попросил всех 3 из них label их (так что на этот раз 3 разных врача были labelled). Чем я проверил распределение этикеток между докторами 1 и 2/3. Например, для доктора 1 и 2 я получил что-то вроде:
doctor2             no_changes changes all
doctor1  no_changes 15         3       18
         changes    154        177     331
         all        169        180

Из этого я вижу, что у доктора 2 было 169 случаев, когда у него lebeled не было изменений, и доктор 1 согласился с ним только в 15 случаях. Зная, что я изменил метки (вероятности) для доктора 2 в случае без изменений с [1, 0] на [15/169, 1-15/169]. Точно так же у доктора 2 было 180 случаев изменений в x-rays, и доктор 1 согласился с ним в 177 случаях, поэтому я изменил метки (вероятности) для доктора 2 в случае изменений с [0, 1] на [1 - 177/180, 177/180].

Сделайте то же самое для доктора 3

Сделав так, что я переобучил нейронную сеть с потерей cross-entropy.

Мой вопрос, правильное ли мое решение или я должен сделать что-то по-другому? Есть ли другие варианты решения этой проблемы?

1 Ответ

1 голос
/ 21 марта 2020

Это выглядит правильно.

1002 * С кросс-энтропии вы на самом деле сравнить вывод распределения вероятностей по модели с некоторой эталонной вероятностью P(changes = 1). В бинарной классификации мы обычно предполагаем, что наши обучающие данные следуют эмпирическому распределению, которое дает либо 1.0, либо 0.0 в зависимости от метки. Как вы уже отметили, это не обязательно должно иметь место, например, в случае, когда мы не имеем полной уверенности в наших данных.

Вы можете express вашу исходную вероятность как:

P(changes = 1) = P(changes = 1, doc_k = 0) + P(changes = 0, doc_k = 1)

Мы просто исключаем все возможные решения врача. Это похоже на P(changes = 0). Каждое совместное распределение может быть дополнительно расширено:

P(changes = 1, doc_k = L) = P(changes = 1 | doc_k = X) P(doc_k = L)

Условная константа, которую вы вычисляете, сравнивая каждого врача с oracle доктором 1. Я не могу придумать лучшего способа приблизить эту вероятность, учитывая данные у вас есть. (Однако вы можете попытаться улучшить его с помощью некоторых дополнительных аннотаций). Вероятность P(doc_k = X) составляет всего 0 или 1, потому что мы точно знаем, какую аннотацию дал каждый врач.

Все эти дополнения соответствуют вашему решению. Для примера без изменений, обнаруженных 2-м врачом:

P(changes = 0) = P(changes = 0 | doc_2 = 0) * 1 + 0 = 15/169

и для примера с изменениями:

P(changes = 1) = 0 + P(changes = 1 | doc_2 = 1) * 1 = 177/180

В обоих случаях приходят константы 0 и 1 от значения вероятности P(doc_2 = L).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...