2017-10-18 12 views
1

J'ai des données avec la réponse binaire YES/NO Class. Utilisation du code suivant pour l'exécution du modèle RF. J'ai un problème pour obtenir le résultat de la matrice de confusion.Matrice de confusion pour la forêt aléatoire dans R Caret

dataR <- read_excel("*:/*.xlsx") 
Train <- createDataPartition(dataR$Class, p=0.7, list=FALSE) 
training <- dataR[ Train, ] 
testing <- dataR[ -Train, ] 

model_rf <- train( Class~., tuneLength=3, data = training, method = 
"rf", importance=TRUE, trControl = trainControl (method = "cv", number = 
5)) 

Résultats:

Random Forest 

3006 samples 
82 predictor 
2 classes: 'NO', 'YES' 

No pre-processing 
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 2405, 2406, 2405, 2404, 2404 
Addtional sampling using SMOTE 

Resampling results across tuning parameters: 

mtry Accuracy Kappa  
    2 0.7870921 0.2750655 
    44 0.7787721 0.2419762 
87 0.7767760 0.2524898 

Accuracy was used to select the optimal model using the largest value. 
The final value used for the model was mtry = 2. 

Jusqu'à présent, très bien, mais quand je lance ce code:

# Apply threshold of 0.50: p_class 
class_log <- ifelse(model_rf[,1] > 0.50, "YES", "NO") 

# Create confusion matrix 
p <-confusionMatrix(class_log, testing[["Class"]]) 

##gives the accuracy 
p$overall[1] 

Je reçois cette erreur:

Error in model_rf[, 1] : incorrect number of dimensions 

J'apprécie si vous les gars peuvent m'aider à obtenir le résultat de la matrice de confusion.

+0

Imprime 'model_rf [, 1]' sur la console et regarde-la. – jsb

+0

Si vous incluez un [exemple reproductible minimal] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) dans votre question, il serait plus facile de vous aider. – jsb

Répondre

1

Comme je comprends que vous souhaitez obtenir obtenir la matrice de confusion pour la validation croisée dans caret.

Pour cela, vous devez spécifier savePredictions dans trainControl. S'il est défini sur "final", les prédictions pour le meilleur modèle sont enregistrées. En spécifiant classProbs = T, les probabilités pour chaque classe seront également enregistrées.

data(iris) 
iris_2 <- iris[iris$Species != "setosa",] #make a two class problem 
iris_2$Species <- factor(iris_2$Species) #drop levels 

library(caret) 
model_rf <- train(Species~., tuneLength = 3, data = iris_2, method = 
         "rf", importance = TRUE, 
        trControl = trainControl(method = "cv", 
              number = 5, 
              savePredictions = "final", 
              classProbs = T)) 

prédictions sont:

model_rf$pred 

triés selon fols CV, pour faire un tri selon la trame de données d'origine:

model_rf$pred[order(model_rf$pred$rowIndex),2] 

pour obtenir une matrice de confusion:

confusionMatrix(model_rf$pred[order(model_rf$pred$rowIndex),2], iris_2$Species) 
#output 
Confusion Matrix and Statistics 

      Reference 
Prediction versicolor virginica 
    versicolor   46   6 
    virginica   4  44 

       Accuracy : 0.9    
       95% CI : (0.8238, 0.951) 
    No Information Rate : 0.5    
    P-Value [Acc > NIR] : <2e-16   

        Kappa : 0.8    
Mcnemar's Test P-Value : 0.7518   

      Sensitivity : 0.9200   
      Specificity : 0.8800   
     Pos Pred Value : 0.8846   
     Neg Pred Value : 0.9167   
      Prevalence : 0.5000   
     Detection Rate : 0.4600   
    Detection Prevalence : 0.5200   
     Balanced Accuracy : 0.9000   

     'Positive' Class : versicolor 

Dans un réglage à deux classes souvent spécifié ying 0,5 car la probabilité de seuil est sous-optimale. Le seuil optimal peut être trouvé après l'entraînement en optimisant la statistique J de Kappa ou de Youden (ou tout autre préféré) en fonction de la probabilité. Voici un exemple:

sapply(1:40/40, function(x){ 
    versicolor <- model_rf$pred[order(model_rf$pred$rowIndex),4] 
    class <- ifelse(versicolor >=x, "versicolor", "virginica") 
    mat <- confusionMatrix(class, iris_2$Species) 
    kappa <- mat$overall[2] 
    res <- data.frame(prob = x, kappa = kappa) 
    return(res) 
}) 

ici le plus haut kappa est pas obtenue à threshold == 0.5 mais à 0,1. Cela doit être utilisé avec précaution car cela peut entraîner un sur-ajustement.

+0

Merci. Un seul problème, Dans ce code cm préd modèle ne fonctionne que lorsque je définis train comme ensemble de données. Je pense que pour pred j'ai besoin de définir l'ensemble de données de test. Quand je code le code $ Class il donne cette erreur: Erreur dans la table (données, référence, dnn = dnn, ...): tous les arguments doivent avoir la même longueur – Mike

+0

Ce code conduit à la matrice de confusion pour les plis de validation croisée dans le caret . Comme la validation croisée est effectuée sur le train, elle n'est valable que pour le train. Pour obtenir une matrice de confusion sur l'ensemble de test, il faut d'abord prédire la classe des échantillons de l'ensemble de tests et la comparer à la classe vraie par la fonction 'confusionMatrix'. – missuse

1

Vous pouvez essayer de créer la matrice de confusion et de vérifier l'exactitude

m <- table(class_log, testing[["Class"]]) 
m #confusion table 

#Accuracy 
(sum(diag(m)))/nrow(testing) 
+0

Merci, mais je reçois une erreur lors de l'exécution de la partie class_log. J'ai édité ma question – Mike

0

Le morceau de code class_log <- ifelse(model_rf[,1] > 0.50, "YES", "NO") est un if-else déclaration qui effectue le test suivant:

In the first column of model_rf , if the number is greater than 0.50, return "YES", else return "NO", and save the results in object class_log .

Ainsi, le code crée essentiellement un vecteur de caractère d'étiquettes de classe, "OUI" et "NON", basé sur un vecteur numérique.

0

Vous devez appliquer votre modèle à l'ensemble de test.

prediction.rf <- predict(model_rf, testing, type = "prob")

Puis faire class_log <- ifelse(prediction.rf > 0.50, "YES", "NO")

+0

merci. Le code class_log fonctionne pour la classe de réponse binaire Y/N? – Mike

+0

'prediction.rf' aura des valeurs réelles (notez le' type = "prob" '). Vous pouvez également faire 'type =" raw "' pour obtenir un binaire tout de suite, mais cela ne vous permet pas de contrôler le seuil. Voir '? Predict.train' –