R |外部函数调用中的NA / NaN / Inf | e1071 SVM

时间:2015-06-24 07:28:04

标签: r machine-learning svm libsvm

数据集:https://archive.ics.uci.edu/ml/datasets/Chess+%28King-Rook+vs.+King-Pawn%29

代码:

require("e1071")

# Load the data into bank
bank <- read.csv("~/R/SVM/kr-vs-kp.data")
colnames(bank)[ncol(bank)] <- 'to.classify'
bank$to.classify <- as.factor(bank$to.classify)

# Divide the data into TRAIN and TEST sets
index <- 1:nrow(bank)
testIndex <- sample(index, trunc(length(index)/3))
testSet <- bank[testIndex,]
trainSet <- bank[-testIndex,]

# Learning sigmoid tuned nu-classification model
svm.nu.tune.model.sigmoid <- best.svm(to.classify ~ ., data = trainSet, coef0 = c(0,1,10,20,30), gamma = c(0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30), cost = c(1,3,10,30,100), nu = c(0.1,0.3,0.5,0.7,0.9), na.action = na.omit, kernel = 'sigmoid',  type = 'nu-classification')
print(svm.nu.tune.model.sigmoid)

错误:

Error in predict.svm(ret, xhold, decision.values = TRUE) : 
  NA/NaN/Inf in foreign function call (arg 8)

该算法适用于内核和类型的任何其他组合。这是唯一有问题的问题。

2 个答案:

答案 0 :(得分:2)

我终于明白了。

对于给定的数据集,似乎 nu coef0 的某些值是不可行的,而不是跳过它们,它决定抛弃整个工作并反而崩溃。 / p>

coef0 - 显然这些值来自区间0 <= coef0 <= 1。虽然这些信息无处可寻。对于大于1的任何内容,它只会因NaN / Inf错误而崩溃。

nu - 对于kr-vs-kp数据集大于0.7的任何内容,都会导致“nu不可行”错误。对于不同的较小数据集,不同的值(0 < x < 0.4)是不可行的。

我希望这有助于某人。

答案 1 :(得分:0)

问题似乎是您在同一个调用中混合参数。如果你只使用带有nu分类的nu参数(以及另一个调用中带有C分类的成本参数)那么它应该可以工作。

例如:

svm.nu.tune.model.sigmoid <- best.svm(to.classify ~ ., data = trainSet, nu = c(0.1,0.3,0.5,0.7,0.9), na.action = na.omit, kernel = 'sigmoid',  type = 'nu-classification')