#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 имела бы больше смысла.