2015-08-12 3 views
0

Я пытаюсь получить участок AUC, работающий с использованием пакета AUC в R. Я не уверен в ошибке и новичок в этом fit - это обученная модель: test - это тестовые данныеAUC package - ошибка AUC - r программирование

test$going_to_cross <- predict(fit, test, type="prob") 

prediction <- predict(fit, test, type="prob") 
submit <- data.frame(cust_id = test$cust_id, already_crossed = test$flag_cross_over, predictions = prediction) 
write.csv(submit, file = "../predictions /cross_sell_predictionsRF.csv", row.names = FALSE) 

head(submit, 5) 

print("predictions") 
colnames(prediction) <- c("predictiona", "predictionb") 
head(prediction) 
which(submit$going_to_cross == 1) 


print("names submit") 
names(submit) 

#predict_cross <- submit$going_to_cross.0 
head(predict_cross, 5) 

Я получаю выход здесь:

cust_id already_crossed predictions.0 predictions.1 
280 14080465 0   0.436 0.564 
281 24047747 0   0.218 0.782 
282 10897483 0   0.606 0.394 
283 14005276 0   0.448 0.552 
284 18488402 0   0.284 0.716 

[1] "predictions" 

Out[317]: 
    predictiona predictionb 
280 0.436 0.564 
281 0.218 0.782 
282 0.606 0.394 
283 0.448 0.552 
284 0.284 0.716 
285 0.104 0.896 

код из пакета:

auc(sensitivity(submit$predictions, submit$already_crossed)) 

И сообщение предупреждение:

сообщение

Внимание: В is.na (х): is.na() применяется к непредставленных (список или вектор) из 'NULL' типа

Обновление:

# get the data into single vectors 
submit_pred <- matrix(submit$predictions.1) 
submit_cross <- matrix(submit$already_crossed) 

dt <- cbind(submit_pred, submit_cross) 
    dt <- matrix(dt) 


    names(dt) <- c("submit_pred", "submit_cross") 

roc_pred <- prediction(dt$submit_pred, dt$submit_cross) 
perf <- performance(roc_pred, "tpr", "fpr") 
plot(perf, col="red") 
abline(0,1,col="grey") 

площади залезть под кривой

performance(roc_pred,"auc")@y.values ​​ головки (дт)

+0

Что делает 'str (submit $ forecastions)' и 'str (submit $ already_crossed)' return? существуют ли какие-либо значения 'NA' в' already_crossed'? – bjoseph

+0

Я думаю, что столбец «предсказания» содержит информацию от предсказания успехов и неудач (1 с и 0 с). Просто попробуйте использовать «submit $ predictionb» вместо «submit $ прогнозов» в вашем последнем фрагменте кода. – AntoniosK

+0

Вы проезжаете два вектора в качестве прогноза, и когда вы делаете один вектор для фактических значений: auc (чувствительность (submit $ predions, submit $ already_crossed)), и вы нарушаете модель. Кроме того, у вас есть только 0 прогнозов, и кривая ROC не будет получена. Я скоро пришлю вам пример ... – AntoniosK

ответ

0

Try для настройки этого сценария на ваш набор данных (с использованием пакета ROCR).

library(ROCR) 

# example dataset with some 0 and some 1 values as actual observations 
dt = data.frame(matrix(data=c(
14080465 , 0 , 0.436 , 0.564, 
24047747 , 1 , 0.218 , 0.782 , 
10897483 , 0 , 0.606 , 0.394, 
14005276 , 0 , 0.448 , 0.552, 
18488402 , 1 , 0.284 , 0.716 
), nrow = 5, ncol = 4, byrow = T)) 

names(dt) = c("cust_id", "already_crossed", "predictions.0", "predictions.1") 

# obtain ROC curve 
roc_pred <- prediction(dt$predictions.1, dt$already_crossed) 
perf <- performance(roc_pred, "tpr", "fpr") 
plot(perf, col="red") 
abline(0,1,col="grey") 

# get area under the curve 
performance(roc_pred,"auc")@y.values 

Вы также можете сделать это с вашим подходом (с использованием пакета ППК):

library(AUC) 

# example dataset with some 0 and some 1 values as actual observations 
dt = data.frame(matrix(data=c(
14080465 , 0 , 0.436 , 0.564, 
24047747 , 1 , 0.218 , 0.782 , 
10897483 , 0 , 0.606 , 0.394, 
14005276 , 0 , 0.448 , 0.552, 
18488402 , 1 , 0.284 , 0.716 
), nrow = 5, ncol = 4, byrow = T)) 

names(dt) = c("cust_id", "already_crossed", "predictions.0", "predictions.1") 

auc(sensitivity(dt$predictions.1, as.factor(dt$already_crossed))) 
plot(sensitivity(dt$predictions.1, as.factor(dt$already_crossed))) 

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

auc(roc(dt$predictions.1, as.factor(dt$already_crossed))) 
plot(roc(dt$predictions.1, as.factor(dt$already_crossed))) 
+0

Привет, спасибо за это полезное объяснение. Теперь я получаю ошибку: Ошибка в approxfun (x.values.2, y.values.2, method = "constant", f = 1,: zero non-NA points – tony

+0

В какой функции это? Удостоверьтесь, что вы подаете каждой функции тип переменных/векторов, в которых она нуждается. Поэтому некоторым из них нужны переменные факторов (например, пакет AUC), а другой Нужно указать числовые значения.Проверьте это и сообщите мне или отправьте мне точно, где вы получите эту ошибку. – AntoniosK

+0

Спасибо, я добавил часть обновления, и теперь я получаю ошибку dt $ submit_pred: $ operator недопустим для атомарного vectors --- на строке roc_pred? Спасибо – tony