2016-12-19 21 views
1

我運行一個預測在合適類似於是尖指南中找到:如何調試像錯誤:「暗淡(X)必須有一個積極的長度」與插入符號

Caret Measuring Performance

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

但我得到的錯誤:

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

我想知道1)一般的方法來診斷這些錯誤是壞投入這樣或2)爲什麼我的代碼失敗函數的結果。

1) 所以看錯誤這是'X'。哪個參數是x?顯然,第一個是「適用」的,但是預測中哪個論點最終通過了?縱觀回溯():

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

現在,這個問題很容易解決,如果我可以通過以下方式與代碼和理解的問題,而不是這些常規錯誤。我可以使用這個追溯到C5.0.R#59的代碼追蹤代碼。 (它看起來像有沒有辦法讓每一絲行號?)我可以儘量遵循這個代碼,因爲這59行,然後(我認爲)的預測功能上線44:

Github Caret C5.0 source

但在此之後,我不確定邏輯在哪裏流動。我沒有在插入符號源中的任何地方看到'makeDataFile',或者如果它在另一個包中,它是如何到達那裏的。我也嘗試過Rstudio調試,調試()和瀏覽器()。沒有提供我期望的其他語言的堆棧跟蹤。任何有關如何在不知道msg錯誤意味着什麼時遵循代碼的建議?

2)作爲用於我的特定輸入,「caretfit」簡單地是一個符的擬合結果和測試數據是300萬行乘59列:

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

你跟RStudio工作? – Christoph

+0

我正在使用nvim-r和vim。但我願意與RStudio一起用於調試目的。其實我一直在試圖與RStudio調試,問題是,當我試圖通過我的代碼步驟,要麼1)獲取似乎永遠不會完成2)不具備某些特定文件的源一步,我得到一個錯誤到這種效果(抱歉不記得錯誤) – Joe

+0

如果你提供一個可重複的例子,我可以看看它... – Christoph

回答

0

1調試運行過程

您可以使用一些功能來查明問題。

儘管在代碼中使用行號(Boo!)獲得完整的堆棧跟蹤似乎還沒有完成,但您可以使用從traceback獲得的函數並使用函數getAnywhere()來搜索你正在尋找的功能。舉例來說,你可以這樣做:

getAnywhere(makeDataFile) 

查看位置和來源。 (當庫經常捆綁在二進制文件中時,這在windows中也很有用)。然後你必須使用source或者github來查找特定的行號或者追蹤代碼的邏輯。

在我的特殊問題,如果我跑:

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

(注三「:」)。我可以看到,這一步在這個水平上完成,所以看起來好像有什麼東西是發生在我的訓練數據集。

因此,通過我的回溯反覆使用gitAnywhere()和github,我可以手動找到行號(Boo!)

    在插入符號
  1. /R/predict.train.R,predict.train(上線108定義的)上線 調用probFunction 153插入符號
  2. /R/probFunction,probFunction (第3行所定義)調用方法$概率函數,它是在配合對象caretfit存儲 功能$ $ modelInfo概率能夠通過輸入到控制檯此被 檢查。這是插入符號/模型/文件中找到/ C5.0.R上線58相同 函數,它們調用 「預測」上線59
  3. 東西插入符知道使用 C50/R/predict.C5.0 .R您可以通過與 getAnywhere()搜索見
  4. 這個函數運行makeDataFile上線25(的 部分C50包)
  5. 這就要求粘貼,這就要求應用,這與停止死亡

2的特殊與插入符號的問題預測

至於我的問題,我一直在檢查代碼,並在不同層次增加投入,它會成功完成。會發生什麼是一些修改發生在predict.train.R我的數據集導致它失敗。那麼事實證明,我不包括我的'na.action'參數,對於我的基於樹的數據,這個參數使用'na.pass'。如果我有這樣的說法:

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

它按預期工作。 predict.train的第126行利用這個參數來決定是否在預測中包含非完整情況。我的數據沒有完整的案例,因此它沒有抱怨需要一些長度正確的矩陣。

一會現在怎麼能夠知道這個問題的答案適用錯誤是由於缺少na.action說法並不明顯可言,因此需要一個很好的調試過程。如果有人知道其他調試方法(請記住,在Windows中,通過Rstudio中的庫源代碼不太好),請回答或評論。

相關問題