Czy prosta regresja liniowa może pobić na głowę SVM i Random Forest?

Znajomy brał udział w projekcie, w którym na podstawie historii należało wykonać predykcję w przód cechy Y. Problem polegał na tym, że cecha Y wykazywała tendencje do wzrostu. Na potrzeby tego wpisu Y to może być mleczność krów lub zapotrzebowanie na energię czy cokolwiek innego co z czasem średnio rośnie.

Rozmawialiśmy trochę o tym co może się sprawdzić w tego typu analizach. Jako benchmark wykorzystaliśmy współczesne techniki pozwalające na podgrzanie procesora typu lasy losowe czy SVM. Okazuje się jednak (po fakcie, jest to nawet zgodne z intuicją ;-), że jeżeli występuje w miarę stabilny trend to zakres wartości obserwowanych w przyszłości może być inny niż zakres wartości obserwowanych w przeszłości. W tym przypadku techniki takie jak zwykła regresja liniowa mogą dać lepsze wyniki niż wspomniane SVM i RF.

Rozważmy taki przykład. Mamy do dyspozycji N predyktorów, chcemy przewidzieć rozwój cechy Y. W rzeczywistości ta cecha zależy tylko od pierwszego z N predyktorów. W szranki postawimy SVM, RandomForest, regresję liniową i regresję z regularyzacją typu lasso.

Przykład będzie czysto symulacyjny.

Zacznijmy od wylosowania danych, po 100 obserwacji i N=25 predyktorów. Zbiór testowy będzie poza domeną zbioru uczącego, wszystkie zmienne przesuwamy o +1.

library(dplyr)
library(lasso2)
library(e1071)
library(randomForest)
library(ggplot2)
 
# will be useful in simulations
getData <- function(n = 100, N = 25 ){
  x <- runif(N*n) %>%
    matrix(n, N)
  # artificial out-of-domain [0-1]
  x_test <- x + 1
 
  list(x = x, 
       y = x[,1] * 5 + rnorm(n), 
       x_test = x_test, 
       y_test = x_test[,1] * 5 + rnorm(n))  
}
 
# let's draw a dataset
gdata <- getData()
head(gdata$y)
# [1] -0.5331184  3.1140116  4.9557897  3.2433499  2.8986888  5.2478431
dim(gdata$x)
# [1] 100  25

Czytaj dalej Czy prosta regresja liniowa może pobić na głowę SVM i Random Forest?