2016-04-06 8 views
0

このエラーは引き続き発生しますが、原因を特定できません。e1071 SVM:予測しようとしてエラーが発生しました

scale.defaultで

エラー(NEWDATA "スケール:中心" [、FALSE =ドロップ、$スケーリングされたオブジェクト]、中心 =オブジェクト$ x.scaleの$、 '中央' の長さの数に等しくなければなりません

「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

[this](http://stackoverflow.com/questions/22149280/support-vector-machine-works-on-training-set-but-not-on-test-set-in-r-using -e10)リンクを使用すると、いくつかの洞察が得られるかもしれません。 – steveb

答えて

0

はい、答えは残念ながら非常に難しいです(データセットによって異なります)。問題は、虹彩データセットには3つのレベルの分類があることです。私はクラスをペアに分割しているので、それぞれのモデルは2つのレベルのクラスしか持っていません。

あなたが訓練したモデルを予測する場合、テストしている値は両方とも同じレベルでなければなりません。したがって、(少なくともこの場合は)厄介な部分は、各ペアから不要なレベルを削除しています。

revalue関数としてライブラリplyrを使用することをお勧めします。特定のレベルを削除するには、レベルを上げて各レベルの名前を変更して、既存のレベルに名前を変更します(本質的に破壊します)。

このポーランドのブロガーは、方向: http://ppiotrow.blogspot.com/2013/04/solved-r-svm-test-data-does-not-match.html

私の具体的な問題を解決するには、迅速かつ簡単な方法は、単にhahaを呼び出すすべての液滴を削除することでした。 SVMは未使用レベルを引き出すポイントを見つけることができないため、外来レベルを残すことに実際の問題はありません。

マイク

0

私は同じ問題を経験しました。テストセット内のすべての予測子を正しいクラス、つまりas.factor,as.numericに変換することでエラーを修正しました。

たとえば、トレーニングセット内のnumericプレディクタ変数がテストセット内のcharacter変数としてメモリにある場合、このエラーが発生します。私はこれが役立つことを願っています

関連する問題