0

パッケージksvmからSVM を実行すると、最終モデルのコマンドからのすべての出力がスケーリングされます。これは私が開始したためであることはわかっていますが、SVM モデリングではデータのスケーリングが優先されることも知っています。スケーリングされていない予測を返すように簡単に指示するにはどうすればよいですか? そうでない場合、予測されたスケーリングされた値を生の値に操作する方法はありますか? ありがとう、コードは以下です:kernlabpredictscaled = Tksvm

svm1 <- ksvm(Y ~ 1
            + X1
            + X2
            , data = data_nn
            , scaled=T
            , type = "eps-svr"
            , kernel="anovadot"
            , epsilon = svm1_CV2$bestTune$epsilon
            , C = svm1_CV2$bestTune$C
            , kpar = list(sigma = svm1_CV2$bestTune$sigma
                          , degree=  svm1_CV2$bestTune$degree)  
            ) 

#Analyze Results
data_nn$svm_pred <- predict(svm1)
4

1 に答える 1

2

ドキュメントから:

argument scaled:
A logical vector indicating the variables to be scaled. If scaled is of length 1,
the value is recycled as many times as needed and all non-binary variables are scaled. 
Per default, data are scaled internally (both x and y variables) to zero mean and 
unit variance. The center and scale values are returned and used for later predictions.

ソリューションNO.1

次の例を見てみましょう。

#make random data set
y <- runif(100,100,1000) #the response variable takes values between 100 and 1000
x1 <- runif(100,100,500)
x2 <- runif(100,100,500)
df <- data.frame(y,x1,x2)

これを入力します:

svm1 <- ksvm( y~1+x2+x2,data=df,scaled=T,type='eps-svr',kernel='anovadot')

> predict(svm1)
               [,1]
  [1,]  0.290848927
  [2,] -0.206473246
  [3,] -0.076651875
  [4,]  0.088779924
  [5,]  0.036257375
  [6,]  0.206106048
  [7,] -0.189082081
  [8,]  0.245768175
  [9,]  0.206742751
 [10,] -0.238471569
 [11,]  0.349902743
 [12,] -0.199938921

スケーリングされた予測を行います。

ただし、上記のドキュメントに従って次のように変更すると、

svm1 <- ksvm( y~1+x2+x2,data=df,scaled=c(F,T,T,T),type='eps-svr',kernel='anovadot')
#I am using a logical vector here so predictions will be raw data.
#only the intercept x1 and x2 will be scaled using the above.
#btw scaling the intercept (number 1 in the formula), actually eliminates the intercept.

> predict(svm1)
           [,1]
  [1,] 601.2630
  [2,] 599.7238
  [3,] 599.7287
  [4,] 599.9112
  [5,] 601.6950
  [6,] 599.8382
  [7,] 599.8623
  [8,] 599.7287
  [9,] 601.8496
 [10,] 599.0759
 [11,] 601.7348
 [12,] 601.7249

ご覧のとおり、これは生データの予測です。

解決策その2

モデルの y 変数をスケーリングする場合は、予測を自分でスケーリング解除する必要があります。

モデルの前:

モデルを実行する前に、平均と標準偏差を計算します。

y2 <- scale(y) 
y_mean <- attributes(y2)$'scaled:center' #the mean
y_std <- attributes(y2)$'scaled:scale'   #the standard deviation

予測を生に変換します。

svm1 <- ksvm( y~1+x2+x2,data=df,scaled=T,type='eps-svr',kernel='anovadot')

> predict(svm1) * y_std + y_mean
           [,1]
  [1,] 654.3604
  [2,] 522.3578
  [3,] 556.8159
  [4,] 600.7259
  [5,] 586.7850
  [6,] 631.8674
  [7,] 526.9739
  [8,] 642.3948
  [9,] 632.0364
 [10,] 513.8646
 [11,] 670.0349
 [12,] 524.0922
 [13,] 673.7202

そして、あなたは生の予測を得ました!

于 2015-01-10T15:55:16.383 に答える