2015-08-12 2 views
0

J'essaie d'obtenir une intrigue AUC fonctionnant en utilisant le paquet AUC dans R. Je ne suis pas sûr de l'erreur et nouveau à ce fit est le modèle formé: test est les données de testAUC package - erreur AUC - programmation 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) 

Je reçois la sortie ici:

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 

le code du package est:

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

Et le message d'avertissement est:

message d'avertissement: En is.na (x): is.na() appliquée à la non (liste ou vecteur) de type 'NULL'

Mise à jour:

# 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") 

zone get sous la courbe

performance(roc_pred,"auc")@y.values ​​ tête (dt)

+0

Qu'est-ce que 'str (submit $ predictions)' et 'str (submit $ already_crossed)' return? Y a-t-il des valeurs 'NA' dans' already_crossed'? – bjoseph

+0

Je pense que la colonne "prédictions" comprend des informations de prédire les succès et les échecs (1s et 0s). Essayez simplement d'utiliser "submit $ predictionb" au lieu de "submit $ predictions" dans votre dernier morceau de code. – AntoniosK

+0

Vous passez deux vecteurs comme prédiction et vous avez un vecteur pour les valeurs réelles quand vous faites: auc (sensibilité (soumettez $ predictions, soumettez $ already_crossed)) et vous cassez le modèle. De plus, vous n'avez que 0 prédictions et la courbe ROC ne sera pas obtenue. Je vais vous envoyer un exemple bientôt .... – AntoniosK

Répondre

0

Essayez pour ajuster ce script à votre jeu de données (à l'aide du package 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 

Vous pouvez aussi le faire avec votre approche (utilisation de l'ASC du package):

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))) 

Comme je l'ai dit avant que vous devez passer un seul vecteur de prédictions. En outre, vous devez enregistrer les classes réelles (0 et 1) comme facteurs, sinon la fonction de sensibilité se casse. Cependant, je pense que ce que vous voulez calculer (en utilisant votre méthode) est la suivante:

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

Salut merci pour cette bonne explication utile je reçois maintenant l'erreur: Erreur dans approxfun (x.values.2, y.values.2, méthode = "constante", f = 1,: zéro points non-NA – tony

+0

Dans quelle fonction est-ce? Assurez-vous que vous alimentez chaque fonction le type de variables/vecteurs dont il a besoin.Par conséquent, certains d'entre eux ont besoin de variables factorielles (comme le paquet AUC), mais l'autre J'ai besoin d'une partie de mise à jour, et maintenant je reçois l'erreur $ dt $ submit_pred: $ operator est invalide pour atomic – AntoniosK

+0

Merci, j'ai ajouté une partie mise à jour, et maintenant je reçois l'erreur dt $ submit_pred: $ operator est invalide pour atomic vecteurs --- sur la ligne roc_pred? Merci – tony