[英]e1071 SVM: Error trying to predict
我一直收到此错误,我不知道为什么。
scale.default(newdata [,object $ scaled,drop = FALSE],center = object $ x.scale $“ scaled:center”,:“ center”的长度必须等于'x'的列数
我正在使用默认的虹膜数据集,这是我的所有代码。 这是尝试使用成对方法实现多类SVM的尝试。
# pass in the dataframe & the number of classes
multiclass.svm <- function(data) {
class.vec = data[,length(data)]
levels = levels(class.vec)
pair1 <- data[which(class.vec == levels[1]),]
pair1 <- droplevels(pair1)
pair2 <- data[which(class.vec == levels[length(levels)]),]
pair2 <- droplevels(pair2)
pairs = list(rbind(pair1, pair2))
# print(pairs)
for(i in 2:length(levels)){
L1 <- data[which(class.vec == levels[i-1]),]
L1 <- droplevels(L1)
L2 <- data[which(class.vec == levels[i]),]
L2 <- droplevels(L2)
pair <- list(rbind(L1, L2))
pairs <- c(pairs, pair)
}
# now we construct our (n choose 2) binary models
models = list()
for(pair in pairs){
classifier = pair[,length(pair)]
p.svm = svm(formula=classifier~., data=pair)
models = c(models, list(p.svm))
}
for(model in models){
test = iris[1,]
print(predict(model, test))
}
return(models)
}
测试/用途:
> h = multiclass.svm(iris)
Show Traceback
Rerun with Debug
Error in scale.default(newdata[, object$scaled, drop = FALSE], center = object$x.scale$"scaled:center", :
length of 'center' must equal the number of columns of 'x'
>
任何帮助将不胜感激...我发现了关于此主题的其他一些问题,无济于事。 谢谢。
好的,因此,不幸的是,答案是非常棘手的(取决于您的数据集。)问题在于,虹膜数据集中存在三级分类。 由于我将类分为两对,因此我的每个模型都只有两个分类级别。
在使用预测模型时,您要训练的模型以及要测试的值都必须具有相同的水平。 因此,棘手的部分(至少在这种情况下)是从每对中删除不必要的级别。
我建议将库plyr用于其重估功能。 要删除特定级别(代替所有未使用的“删除级别”功能),可以使用重估并将每个不需要的级别重命名为现有级别(实质上是将其销毁)。
归功于这位波兰博客作者,他为我指引了正确的方向: http : //ppiotrow.blogspot.com/2013/04/solved-r-svm-test-data-does-not-match.html
但是,解决我的特定问题的快速简便的方法只是删除所有的droplevel调用haha。 由于SVM在未使用的级别上找不到任何要点,因此保留无关级别并没有实际问题。
希望这可以帮助某人。 麦克风
我也遇到过同样的问题。 我通过将测试集中的所有预测变量转换为它们的正确类(即as.factor
, as.numeric
。
例如,如果训练集中的numeric
预测变量作为测试集中的character
变量存储在内存中,则会出现此错误。 我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.