9

残念ながら、次の簡単な例で predict() を使用すると問題が発生します。

library(e1071)

x <- c(1:10)
y <- c(0,0,0,0,1,0,1,1,1,1)
test <- c(11:15)

mod <- svm(y ~ x, kernel = "linear", gamma = 1, cost = 2, type="C-classification")

predict(mod, newdata = test)

結果は次のとおりです。

> predict(mod, newdata = test)
   1    2    3    4 <NA> <NA> <NA> <NA> <NA> <NA> 
   0    0    0    0    0    1    1    1    1    1 

predict() がトレーニング サンプル (x,y) の適合値のみを提供し、テスト データを気にしない理由を説明できる人はいますか?

ご助力ありがとうございます!

リチャード

4

2 に答える 2

11

これは、 への数式インターフェイスを誤用したためと思われますsvm()。通常、数式内の変数が検索されるデータ フレームまたは同様のオブジェクトを指定します。ベスト プラクティスでなくても、通常はこれを行わなくても問題ありませんが、予測したい場合は、変数をデータ フレームに入れないと、混乱してしまいます。newdataトレーニング データが返される理由は、名前が付けられたコンポーネントを含むオブジェクトを提供していないためですx。したがって、新しいデータを見つけることができないためx、適合値を返します。predictこれは、私が知っているほとんどの R メソッドに共通しています。

その場合の解決策は、i) トレーニング データをデータ フレームに入れ、svmこれを引数として渡し、ii) (from ) todataを含む新しいデータ フレームを提供することです。例えば:xtestpredict()

> DF <- data.frame(x = x, y = y)
> mod <- svm(y ~ x, data = DF, kernel = "linear", gamma = 1, cost = 2,
+ type="C-classification")
> predict(mod, newdata = data.frame(x = test))
1 2 3 4 5 
1 1 1 1 1 
Levels: 0 1
于 2010-12-16T15:10:43.937 に答える
6

newdata が同じ形式である必要があります。つまり、data.frame を使用すると役立ちます。

R> library(e1071)
Loading required package: class
R> df <- data.frame(x=1:10, y=sample(c(0,1), 10, rep=TRUE))
R> mod <- svm(y ~ x, kernel = "linear", gamma = 1, 
+             cost = 2, type="C-classification", data=df)
R> newdf <- data.frame(x=11:15)
R> predict(mod, newdata=newdf)
1 2 3 4 5
0 0 0 0 0
Levels: 0 1
R>

ちなみに、これは次のヘルプページにも表示されていますsvm()

 ## density-estimation

 # create 2-dim. normal with rho=0:
 X <- data.frame(a = rnorm(1000), b = rnorm(1000))
 attach(X)

 # traditional way:
 m <- svm(X, gamma = 0.1)

 # formula interface:
 m <- svm(~., data = X, gamma = 0.1)
 # or:
 m <- svm(~ a + b, gamma = 0.1)

 # test:
 newdata <- data.frame(a = c(0, 4), b = c(0, 4))
 predict (m, newdata)

要するに、フォーミュラ インターフェイスを使用して data.frame を指定するということです。これが、基本的に Rのすべてのモデリング関数が機能する方法です。

于 2010-12-16T15:09:35.953 に答える