web-dev-qa-db-ja.com

Rでe1071パッケージからSVMをトレーニングしているときに「(添字)論理添字が長すぎます」というエラーが発生する

私はtraindataを使用してSVMをトレーニングしています。 (Rのe1071パッケージ)。以下は私のデータに関する情報です。

> str(train)
'data.frame':   891 obs. of  10 variables:
$ survived: int  0 1 1 1 0 0 0 0 1 1 ...
$ pclass  : int  3 1 3 1 3 3 1 3 3 2 ...
$ name    : Factor w/ 15 levels "capt","col","countess",..: 12 13 9 13 12 12 12 8 13 13 
$ sex     : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
$ age     : num  22 38 26 35 35 ...
$ ticket  : Factor w/ 533 levels "110152","110413",..: 516 522 531 50 473 276 86 396 
$ fare    : num  7.25 71.28 7.92 53.1 8.05 ...
$ cabin   : Factor w/ 9 levels "a","b","c","d",..: 9 3 9 3 9 9 5 9 9 9 ...
$ embarked: Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...
$ family  : int  1 1 0 1 0 0 0 4 2 1 ...

以下のように訓練します。

library(e1071)
model1 <- svm(survived~.,data=train, type="C-classification")

ここで問題ありません。しかし、私が次のように予測した場合:

pred <- predict(model1,test)

次のエラーが発生します。

Error in newdata[, object$scaled, drop = FALSE] : 
(subscript) logical subscript too long

また、トレーニングデータとテストデータの両方から「チケット」予測子を削除してみました。しかし、それでも同じエラーです。何が問題ですか?

15
Ayush Raj Singh

「テスト」データセットの要素の1つでレベル数に違いがある可能性があります。

str(test)を実行し、因子変数が 'train'データセット内の対応する変数と同じレベルであることを確認します。

つまり、以下の例はmy.test $ fooが4レベルしかないことを示しています。

str(my.train)
'data.frame':   554 obs. of  7 variables:
 ....
 $ foo: Factor w/ 5 levels "C","Q","S","X","Z": 2 2 4 3 4 4 4 4 4 4 ...

str(my.test)
'data.frame':   200 obs. of  7 variables:
 ...
 $ foo: Factor w/ 4 levels "C","Q","S","X": 3 3 3 3 1 3 3 3 3 3 ...
16

正しい列車データには、乗船のための2つの空白が含まれています。これは、空白のために1つの余分なカテゴリ値があり、このエラーが発生しているためです。

$乗船:4レベルの係数 ""、 "C"、 "Q"、 "S":4 2 4 4 4 3 4 4 4 2 ...

最初は空白です

2
user2378089

今日も同じ問題に遭遇しました。 e1071パッケージのsvmモデルはオブジェクトとして行のみを使用できることがわかりました。つまり、1つの行は列ではなく1つのサンプルです。列をサンプル、行を変数として使用すると、このエラーが発生します。

1
Xu Haifeng

おそらくあなたのデータは優れており(テストデータに新しいレベルはありません)、小さなトリックが必要なだけで、予測は問題ありません。

test.df = rbind(train.df[1,],test.df)
test.df = test.df[-1,]

このトリックは Rランダムフォレスト-新しいデータの予測子のタイプが一致しない によるものです。今日、私はこの問題に遭遇し、上記のトリックを使用して、問題を解決しました。

0

私もそのデータセットで遊んでいます。私はこれがずっと前だったことを知っていますが、できることの1つは、モデルに追加する列だけを明示的に含めることです。

fit <- svm(Survived~Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, data=train)

これにより、関連するデータを持たない(チケット番号など)何も提供しない列を排除することで、問題が解消されました。

0
sconfluentus