我一直收到这个错误,我无法弄清楚原因。
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'
>
非常感谢任何帮助......我在这个主题上找到了一些其他问题但无济于事。谢谢。
答案 0 :(得分:0)
好的,不幸的是答案非常棘手(取决于您的数据集)。问题是在虹膜数据集中,有三个级别的分类。由于我将这些类分成两组,因此我的每个模型只有两个级别的分类。
使用预测您已经训练过的模型时,您测试的值必须具有相同的级别。因此,棘手的部分(至少在这种情况下)正在删除每对中不必要的级别。
我建议使用库plyr进行重估功能。要删除特定级别(而不是所有未使用的级别功能),您可以使用重估值并将每个不需要的级别重命名为现有级别(基本上将其销毁。)
相信这位波兰博主能够引导我朝着正确的方向前进: http://ppiotrow.blogspot.com/2013/04/solved-r-svm-test-data-does-not-match.html
但是,解决我的具体问题的简单方法就是删除所有的droplevels调用哈哈。由于SVM没有找到任何可以在未使用的级别上绘制的点,因此在保留无关级别时没有实际问题。
希望这有助于那里的人。 麦克
答案 1 :(得分:0)
我遇到过同样的问题。我通过将测试集中的所有预测变量转换为正确的类来修复错误,即as.factor
,as.numeric
。
例如,如果训练集中的numeric
预测变量在内存中作为测试集中的character
变量,则会出现此错误。我希望这会有所帮助。