2016-05-17 1 views
1

Я тестирую простой случай, используя пакет ROCR в R. В принципе, вот мой код. У меня есть набор истинных значений, и для каждого значения у меня есть набор прогнозов, а мои метки - 1, если предсказание находится в пределах | 2 | истинного значения, и 0 в противном случае, как это:ROCR пакет ... что я не получаю?

ID<- c(1,2,3,4,5) 
    preds<-c(6,3,2,1,4) 
    truevals<- c(8,4,2,1,7) 
    df<-data.frame(ID, preds,truevals) 
    df<- mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
    predtest<-prediction(df$preds, df$labels) 
    auc <- performance(predtest, 'auc') 

Но мой расчетный АУК 0, т.е.

> [email protected][[1]] 
[1] 0 

Мой вопрос, что я делаю неправильно? Ясно, что некоторые из классификаций являются «правильными», так почему же AUC равна нулю? Что я не понимаю? Мои значения упорядочены по идентификатору, т. Е. Я предполагаю, что они являются измерениями людей с идентификаторами от 1 до 5. Есть ли какая-то проблема с заказом, которую я не рассматриваю? Благодарю.

+0

Оба хороших ответа – roccomay

ответ

1

Чтобы понять, что происходит, нарисовать окно график ваших данных:

boxplot(preds ~ labels, data = df) 

Boxplot of predictions as a function of labels

Обратите внимание, как прогнозы на 0 класса выше чем те из 1 класса.

Теперь посмотрим на определение ППК из Википедии:

[АУК] равна вероятности того, что классификатор будет ранжировать случайно выбранный положительный пример выше, чем случайно выбранный отрицательный (предполагая «положительные» ранги выше «отрицательного»). (1)

Теперь по соглашению, 1 s обычно считается позитивы и негативы 0 сек. Как мы только что видели, ваши 1 s, теперь позитивы, ранг ниже чем негативов (0 с), поэтому вероятность того, что они выше 0.

У вас есть 3 варианта:

A. Если ваши 1 s являются негативы, ROCR имеет label.ordering аргумент:

predtest <- prediction(df$preds, df$labels, label.ordering = c(1, 0)) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

B. Если 1 s действительно положительные, вы можете обратить свои предсказания, так что позитивы выше (обратите внимание на - сиговых п перед df$labels):

predtest <- prediction(df$preds, -df$labels) 
auc <- performance(predtest, 'auc') 
[email protected][[1]] 
[1] 1 

C. Можно также обратить определение ППК, так что становится вероятность того, что классификатор будет ранжировать случайно выбранный положительный экземпляр нижний чем случайно выбранный отрицательным. ROCR не поддерживает это, но другие пакеты делают и могут даже выбрать это автоматически для вас.

В конце концов, важно не то, является ли ваша AUC выше или ниже 0,5, но насколько это далеко от диагонали. Если он меньше 0,5 или «хуже, чем случайный», вам нужно только отменить свою интерпретацию, чтобы она выполнялась лучше, чем случайная.

2

Ваши данные четко отделимы. pred От 1 до 3 с label 1 и 4 и 6 идут с меткой 0.

Это должно дать вам AUC, равный 1, что совпадает с AUC равным 0. Это просто вопрос ссылки.

Вот пример:

library(ROCR) 
ID = c(1,2,3,4,5) 
preds = c(6,3,2,1,4) 
truevals = c(8,4,2,1,7) 
df = data.frame(ID, preds,truevals) 
df = mutate(df, labels = ifelse(abs(df$preds - df$truevals) < 2, 1, 0)) 
#Changing the labels is just a matter of reference 
#the algorithm is oblivious to their meaning 
df$labels = 1 - df$labels 
predtest = prediction(df$preds, df$labels) 
auc = performance(predtest, "auc") 

Выходные:

> [email protected][[1]] 
[1] 1 

Переключение этикетки поднять вопрос о утечки, хотя, но я полагаю, что это не входит в сферу вопроса.

EDIT: AUC - это мера разделимости, это вероятность того, что вы оцениваете случайный положительный экземпляр выше случайного отрицательного. Кривая ROC - это просто x: 1-Специфичность и y: Чувствительность, учитывая различный порог для классификации вашего предиктора.

Таким образом, в отношении:

[...] если у меня есть произвольное множество значений и множество предсказаний этих значений, как я могу получить кривую ROC? Я действительно смущен. Предполагаю чем ближе прогноз, тем лучше? Я просто не знаю, как это сделать . Я не знаю, как назначить классы истинным значениям. Не стоит , что-то должно быть ранжирование ???

У вас есть набор бинарных категориальных данных, а также непрерывный предиктор. Теперь установите порог в предсказателе, классифицируя наблюдения выше этого порога одного класса или иным образом другого класса. Измерьте специфичность и чувствительность и отметьте эту точку в своей кривой. Попробуйте другие пороги (существует ограниченное число возможностей, которые изменяют Sens и Spec) и начертите эти точки на кривой. Это кривая ROC.

AUC будет выше, чем более разделены ваши классы относительно предсказателя. Чем больше наложено, тем ниже AUC.

+0

А? Это не полезно. Когда я рисую кривую ROC, это НИЖЕ диагональ. Это неправильно. – roccomay

+0

Но эти ярлыки предназначены для обозначения того, является ли прогноз правильным или нет .... что, если у меня не было разделимых данных? Как это изменится? – roccomay

+0

0.5 - это AUC линии без дискриминации a.k.a. случайного случайного предсказания. Это худший результат. –

Смежные вопросы