Как работает этот метод или формула для вычисления ROC AUC?

#machine-learning #metrics #roc #auc

#машинное обучение #показатели #ОКР #auc

Вопрос:

Я пытался вычислить AUC с помощью MySQL для данных в таблице, как показано ниже:

 y   p
1   0.872637
0   0.130633
0   0.098054
...
...
1   0.060190
0   0.110938
  

Я наткнулся на следующий SQL-запрос, который выдает правильную оценку AUC (я проверил с помощью метода sklearn).

  SELECT (sum(y*r) - 0.5*sum(y)*(sum(y) 1)) / (sum(y) * sum(1-y)) AS auc
 FROM ( 
   SELECT y, row_number() OVER (ORDER BY p) r
   FROM probs
 ) t

 Using pandas this can be done as follows:

 temp = df.sort_values(by="p")
 temp['r'] = np.arange(1, len(df) 1, 1)
 temp['yr'] = temp['y']*temp['r']
 print( (sum(temp.yr) - 0.5*sum(temp.y)*(sum(temp.y) 1)) / (sum(temp.y) * sum(1-temp.y)) )

  

Я не понял, как мы можем вычислять AUC с помощью этого метода. Может кто-нибудь, пожалуйста, дать интуицию за этим?

Я уже знаком с трапециевидным методом, который включает суммирование площади небольших трапеций под кривой ROC.

Ответ №1:

Краткий ответ: это статистика Уилкоксона-Манна-Уитни, см. https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve На странице также есть доказательства.

Нижняя часть вашей формулы идентична формуле в вики. Верхняя часть сложнее. f в вики соответствует p в ваших данных и t_0 и t_1 являются индексами во фрейме данных. Обратите внимание, что сначала мы сортируем по p , что упрощает нашу жизнь.

Обратите внимание, что двойная сумма может быть разложена как

 Sum_{t_1 such that y(t_1)=1} #{t_0 such that p(t_0) < p(t_1) and y(t_0)=0}
  

Здесь # обозначает общее количество таких индексов.

Для каждого индекса строки t_1 (такого, что y(t_1) =1 ), сколько t_0 таких, что p(t_0) < p(t_1) и y(t_0)=0 ? Мы знаем, что точно t_1 есть значения p , которые меньше или равны, чем t_1 потому, что значения отсортированы. Мы приходим к выводу, что

 #{t_0: p(t_0) < p(t_1) and y(t_0)=1) = t_1 - #{t_0: t_0 <= t_1 and y(t_0)=1}
  

Теперь представьте прокрутку отсортированного фрейма данных. В первый раз, когда мы встречаемся y=1 , #{t_0: t_0 <= t_1 and y(t_0)=1}=1 , во второй раз, когда мы встречаемся y=1 , то же количество равно 2, в третий раз, когда мы встречаемся y=1 , количество равно 3, и так далее. Поэтому, когда мы суммируем равенство по всем индексам t_1 , когда y=1 мы получаем

 Sum_{t_1: y(t_1)=1}#{t_0: p(t_0) < p(t_1) and y(t_0)=1) = Sum_{t_1: y(t_1)=1} t_1 - (1   2   3   ...   n),
  

где n общее количество единиц в y столбце. Теперь нам нужно сделать еще одно упрощение. Обратите внимание, что

 Sum_{t_1: y(t_1)=1} t_1 = Sum_{t_1: y(t_1)=1} t_1 y(t_1)
  

Если y(t_1) не равно единице, оно равно нулю. Поэтому,

 Sum_{t_1: y(t_1)=1} t_1 = Sum_{t_1: y(t_1)=1} t_1 y(t_1) = Sum_{t} t y(t)
  

Подключаем это к нашей формуле и используем это

 1   2  3   ...   n = n(n 1)/2
  

закончил доказательство найденной вами формулы.

PS Я думаю, что публикация этого вопроса в math или stats overflow имела бы больше смысла.