2016-12-19 2 views
1

Je suis en un prédire sur une forme similaire à ce qui se trouve dans le guide de caret:comment déboguer des erreurs telles que: « dim (x) doit avoir une longueur positive » avec caret

Caret Measuring Performance

predictions <- predict(caretfit, testing, type = "prob") 

Mais je reçois l'erreur:

Error in apply(x, 1, paste, collapse = ",") : 
dim(X) must have a positive length 

Je voudrais savoir 1) la manière générale de diagnostiquer ces erreurs qui sont le résultat de mauvaises entrées en fonctions comme celle-ci ou 2) pourquoi mon code échoue.

1) Donc, en regardant l'erreur C'est quelque chose à voir avec 'X'. Quel argument est x? Evidemment le premier dans 'apply', mais quel argument dans predict est finalement passé pour s'appliquer? En regardant retraçage():

10: stop("dim(X) must have a positive length") 
9: apply(x, 1, paste, collapse = ",") 
8: paste(apply(x, 1, paste, collapse = ","), collapse = "\n") 
7: makeDataFile(x = newdata, y = NULL) 
6: predict.C5.0(modelFit, newdata, type = "prob") 
5: predict(modelFit, newdata, type = "prob") at C5.0.R#59 
4: method$prob(modelFit = modelFit, newdata = newdata, submodels = param) 
3: probFunction(method = object$modelInfo, modelFit = object$finalModel, 
    newdata = newdata, preProc = object$preProcess) 
2: predict.train(caretfit, testing, type = "prob") 
1: predict(caretfit, testing, type = "prob") 

Maintenant, ce problème serait facile à résoudre si je pouvais suivre le code à travers et comprendre le problème, par opposition à ces erreurs générales. Je peux tracer le code en utilisant cette traceback au code à C5.0.R # 59. (On dirait qu'il n'y a aucun moyen d'obtenir les numéros de ligne sur chaque trace?) Je peux suivre ce code pour autant que cette ligne 59 et (je pense) la fonction de prédire la ligne 44:

Github Caret C5.0 source

Mais après cela, je ne suis pas sûr d'où la logique coule. Je ne vois pas 'makeDataFile' n'importe où dans la source du caret ou, si c'est dans un autre paquet, comment il est arrivé là. J'ai également essayé le débogage Rstudio, debug() et browser(). Aucun ne fournit la pile de chemin que j'attendrais d'autres langues. Toute suggestion sur la façon de suivre le code lorsque vous ne savez pas ce que signifie une erreur msg?

2) En ce qui concerne mes entrées particulières, 'caretfit' est tout simplement le résultat d'un caret ajustement et les données de test est 3millions lignes par 59 colonnes:

fitcontrol <- trainControl(method = "repeatedcv", 
         number = 10, 
         repeats = 1, 
         classProbs = TRUE, 
         summaryFunction = custom.summary, 
         allowParallel = TRUE) 


fml <- as.formula(paste("OUTVAR ~",paste(colnames(training[,1:(ncol(training)-2)]),collapse="+"))) 
caretfit <- train(fml, 
      data = training[1:200000,], 
      method = "C5.0", 
      trControl = fitcontrol, 
      verbose = FALSE, 
      na.action = na.pass) 
+0

Travaillez-vous avec RStudio? – Christoph

+0

Je travaille avec nvim-r et vim. MAIS je suis prêt à travailler avec RStudio à des fins de débogage. En fait, j'ai essayé le débogage avec RStudio, le problème est que lorsque j'essaie de parcourir mon code, soit 1) arrive à une étape qui ne semble jamais achevée 2) je n'ai pas la source d'un fichier particulier et je reçois un erreur à cet effet (désolé ne peut pas se souvenir de l'erreur) – Joe

+0

Si vous fournissez un exemple reproductible, je peux y jeter un oeil ... – Christoph

Répondre

0

1 debug Procédure

Vous pouvez identifier le problème en utilisant quelques fonctions.

Bien qu'il ne semble toujours pas nécessaire d'obtenir une pile complète avec des numéros de ligne dans le code (Boo!), Vous pouvez utiliser les fonctions que vous obtenez de la traceback et utiliser la fonction getAnywhere() pour rechercher la fonction que vous recherchez. Ainsi, par exemple, vous pouvez faire:

getAnywhere(makeDataFile) 

pour voir l'emplacement et la source. (Qui fonctionne également très bien dans les fenêtres lorsque les bibliothèques sont souvent regroupées dans des binaires.) Ensuite, vous devez utiliser source ou github pour trouver les numéros de ligne spécifiques ou pour suivre la logique du code.

Dans mon problème particulier si je cours:

newdata <- testing 
caseString <- C50:::makeDataFile(x = newdata, y = NULL) 

(Notez les trois « : ».) Je peux voir que cette étape se termine à ce niveau, donc il semble que quelque chose se passe à ma formation ensemble de données en cours de route.

Donc, en utilisant gitAnywhere() et github encore et encore à travers mon retraçage, je peux trouver le numéro de ligne manuellement (Boo!)

  1. dans caret/R/predict.train.R, predict.train (défini sur la ligne 108) appelle probFunction sur la ligne 153
  2. dans caret/R/probFunction, probFunction (défini sur la ligne 3) appelle la fonction $ prob qui est une fonction stockée dans l'objet d'ajustement caretfit $ modelInfo $ prob qui peut être inspecté en l'entrant dans la console. Ceci est la même fonction trouve dans caret/modèles/fichiers/C5.0.R en ligne 58 qui appelle « prévoir » sur la ligne 59
  3. quelque chose dans caret sait utiliser C50/R/predict.C5.0 .R que vous pouvez voir en recherchant avec getAnywhere()
  4. cette fonction fonctionne makeDataFile en ligne 25 (partie de le paquet C50)
  5. qui appelle la pâte, qui appelle appliquer, qui meurt avec arrêt

2 Particulier Problème avec le prédicteur

En ce qui concerne mon problème, j'ai continué à inspecter le code, et en ajoutant des entrées à différents niveaux et il se terminerait avec succès. Qu'est-ce qui se passe est que quelque modification arrive à mon ensemble de données dans predict.train.R qui l'amène à échouer. Eh bien, il se trouve que je n'incluais pas mon argument «na.action», qui, pour mes données arborescentes, utilisait «na.pass». Si j'inclus cet argument:

prediction <- predict(caretfit, testing, type = "prob", na.action = na.pass) 

cela fonctionne comme prévu. La ligne 126 de predict.train utilise cet argument pour décider d'inclure ou non des cas non complets dans la prédiction. Mes données n'ont pas de cas complets et donc il ne s'est pas plaint d'avoir besoin d'une matrice de longueur positive.

Maintenant comment on pourrait savoir que la réponse à cette erreur d'application est due à un argument na.action manquant n'est pas évident du tout, d'où la nécessité d'une bonne procédure de débogage. Si quelqu'un connaît d'autres façons de déboguer (en gardant à l'esprit que dans Windows, passer par la source de la bibliothèque dans Rstudio ne fonctionne pas très bien), s'il vous plaît répondre ou commenter.