【问题标题】:Error in predict.svm method for regression?predict.svm 回归方法中的错误?
【发布时间】:2020-10-29 05:40:23
【问题描述】:

我从“e1071”包中创建了一个 svm 公式,使用以下 GDP:

library(e1071)

set.seed(100)
x <- seq(0.1, 5, by = 0.05)
w <- runif(x, min = 5, max = 6)
y <- log(x) + w ^ 2 + rnorm(x, sd = 0.2)

dt <- as.data.frame(cbind(y,x,w))

dt_train <- dt[(1:(length(x)-1)),]

dt_test <- dt[length(x),]

model <- svm(y ~ ., data = dt_train, type = "eps-regression", kernel =
    "radial", gamma = 1, cost = 1, epsilon = 0.1)

为了在样本外生成预测:

predict(model, newdata = dt_test)

28.13943

更改 dt_test 时:

dt_test[1,] <- 100:102
predict(model, newdata = dt_test)

31.00455

但是,当再次更改 dt_test 时,我们会得到相同的答案:

dt_test[1,] <- c(0,78,1000)
predict(model, newdata = dt_test)

31.00455

如果我再改,答案还是一样的:

dt_test[1,] <- rnorm(3)
predict(model, newdata = dt_test)

31.00455

当我想使用 svm 回归对时间序列进行预测时,这个错误是一个障碍。 任何反馈将不胜感激。

【问题讨论】:

    标签: r svm predict


    【解决方案1】:

    TL/DR:你的测试数据离你的训练数据太远了

    比较一下您的训练数据与测试数据的分布情况。

    (M = sapply(dt, mean))
            y         x         w 
    31.204838  2.550000  5.517325 
    (S = sapply(dt, sd))
           y        x        w 
    3.131271 1.436141 0.262107 
    
    (100:102 - M)/S
            y         x         w 
     21.97036  68.55178 368.10419 
    (c(0,78,1000) - M)/S
             y          x          w 
      -9.96555   52.53664 3794.18628 
    (rnorm(3) - M)/S
             y          x          w 
     -9.118284  -1.747814 -15.895867 
    

    您的第一个数据点与平均值相差 368 个标准差。
    您的第二个数据点与平均值相差 3794 个标准差。
    您的第三个数据点与平均值仅相差 16 个标准差。
    这些点基本上是无穷大。

    您发现远离训练数据,您的模型预测的是一个常数。但是如果你从你的训练数据中获取小于 3 个标准差的数据点,你会发现模型不是恒定的。

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多