我正在运行类似于插入符指南中的预测的预测:
predictions <- predict(caretfit, testing, type = "prob")
但我收到错误:
Error in apply(x, 1, paste, collapse = ",") :
dim(X) must have a positive length
我想知道1)诊断这些错误的一般方法,这些错误是由于输入到这样的函数中的错误导致的,或2)为什么我的代码失败。
1) 所以看错误它与X&#39;有关。哪个参数是x?显然,第一个应用&#39;,但是预测中的哪个参数最终会通过以适用?看看traceback():
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行的预测函数:
但在此之后,我不确定逻辑在哪里流动。我没有看到“makeDataFile&#39;在插入源中的任何地方,或者,如果它在另一个包中,它是如何到达那里的。我也尝试过Rstudio调试,debug()和browser()。没有提供我期望从其他语言的堆栈跟踪。当您不知道错误消息的含义时,有关如何遵循代码的任何建议吗?
2)至于我的特殊投入,&#39; caretfit&#39;只是插入符号的结果,测试数据是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 :(得分:0)
1退出程序
您可以使用一些功能查明问题。
虽然似乎仍然无法在代码中获得带有行号的完整堆栈跟踪(Boo!),但您可以使用从回溯中获得的函数并使用函数getAnywhere()来搜索你正在寻找的功能。例如,你可以这样做:
getAnywhere(makeDataFile)
查看位置和来源。 (当这些库经常捆绑在二进制文件中时,它在windows中也很有用。)然后你必须使用source或github来查找特定的行号或跟踪代码的逻辑。
如果我跑的话,在我的特定问题中:
newdata <- testing
caseString <- C50:::makeDataFile(x = newdata, y = NULL)
(请注意三个“:”。)我可以看到此步骤在此级别完成,因此看起来好像在我的训练数据集中发生了某些事情。
所以在我的追踪中反复使用gitAnywhere()和github,我可以手动找到行号(嘘!)
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中单步执行库源并不能很好地工作),请回答或评论。