2014-01-23 2 views
1

Предположим, что у меня есть решения о классификации и конфиденции в качестве записей, есть ли способ получить кривую точности/отзыва через SQL? Другими словами, есть ли способ свернуть следующий набор запросов в один?вычислить точность/кривую отзыва в SQL

select avg(predicted_label=correct_label) from t where confidence<0 
select avg(predicted_label=correct_label) from t where confidence<1 
select avg(predicted_label=correct_label) from t where confidence<2 
select avg(predicted_label=correct_label) from t where confidence<3 
select avg(predicted_label=correct_label) from t where confidence<4 
select avg(predicted_label=correct_label) from t where confidence<5 
select avg(predicted_label=correct_label) from t where confidence<6 
.... 

ответ

1

Чтобы получить avg из predicted_label для диапазонов доверия попробовать это.
EDIT: А объединение на <=

SELECT FLOOR(t1.confidence), AVG(t2.predicted_label) 
FROM Table t1 
    JOIN Table t2 ON t2.confidence <= t1.Confidence 
GROUP BY FLOOR(t1.confidence) 
+0

Интересно, не закончилось ли синтаксис <= b ", какие двигатели поддерживают это? –

+0

@YaroslavBulatov AFAIK все двигатели db поддерживают такие соединения. Убедитесь, что колонка сравнения индексирована для повышения производительности. Вот ссылка [Oracle] (http://docs.oracle.com/cd/B25016_08/doc/dl/bi/B13916_04/joins.htm#i1014451). Также [this] (http://stackoverflow.com/questions/7870155/difference-between-a-theta-join-equijoin-and-natural-join) может помочь. – user2989408

+0

Я вижу. Кажется, что это не в Google Cloud SQL (пока) –

0

Если у вас есть таблица (назовем его numbers с одной колонкой num), содержащим соответствующие цифры от 0 до некоторого достаточно большого количества, то вы можете просто сказать :

select avg(t.predicted_label=t.correct_label) 
    from t join numbers on t.confidence < numbers.num 
where numbers.num < 100 -- or whatever makes sense 
group by numbers.num 
Смежные вопросы