数据集: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)
该算法适用于内核和类型的任何其他组合。这是唯一有问题的问题。
答案 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')