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