Прогнозирование с использованием регрессии опорных векторов в R

#r #machine-learning #forecasting

#r #машинное обучение #прогнозирование

Вопрос:

Я хочу спрогнозировать будущее потребление энергии, используя регрессию опорных векторов в R.У меня есть этот код, но я не уверен, правильно это или нет.

     `#gathering the data
data<-read.csv("C:\2003_smd_hourly.csv",header=TRUE) #these are the values which are used to train the given model#
data
#data1<-read.csv("C:\pr.csv",header=TRUE)#this file/ddata is used for checking the accuracy of prediction# 
#data1
#y1<-data1[,15] 
#x0<-data1[,2]  
y<-data[,15]    #sysload
x1<-data[,2]    #houroftheday
x2<-data[,13]     #drybulb temp(actualtemp)
x3<-data[,14]     #dewpnttemp
#train<-sample(744,447)
#train
library(e1071)
model<-svm(y~x1 x2 x3,data=data[1:48,],cost=2.52*10^11,epsilon=0.0150,gamma=1)
model
#pr<-data[-train,]
#pr
predict1<-predict(model,newdata=data[49:72,])
predict1
par(mfrow=c(2,2))
plot(x1,y,col="red",pch=4)
#par(new=TRUE)
plot(x1,predict1,col="blue",pch=5) #plotting the values that have been predicted
#par(new=TRUE)
plot(x0,y1,col="black",pch=1)
error=y1-predict1
error
mae <- function(error)
{
  mean(abs(error))
}
mae(error)

error <- y1 - predict1

error
rmse <- function(error)
{
  sqrt(mean(error^2))
}
svrPredictionRMSE <- rmse(error)
svrPredictionRMSE
max(error)
min(error)

mape <- function(y1,predict1)
mape
mean(abs((y1 - predict1)/y1))*100
mape
  

`Например: данные можно найти здесь http://pastebin.com/MUfWFCPM

Комментарии:

1. Какой код у вас уже есть?

2. Это он кодирует. Я обучаю модель, используя 48 значений, но я хочу, чтобы модель предсказывала только 24 значения

3. Я бы посоветовал отказаться от текущего метода, который вы используете для ввода данных. Настройте два data.frames , где они являются вашими наборами обучения и тестирования / проверки, и сначала укажите только обучающий набор, predict а затем при вызове используйте второй data.frame . Ваш текущий метод содержит избыточную информацию в вашей среде.

Ответ №1:

Используйте параметр newdata для прогнозирования (ваши новые данные для тестирования должны иметь тот же набор функций, что и обучающие данные). например, с набором данных mtcars

 library(e1071)
model<-svm(mpg~wt disp qsec,data=mtcars[1:24,],cost=512,epsilon=0.01)
model
predict1<-predict(model,newdata=mtcars[25:32,])
predict1 # prediction for the new 8 data points
Pontiac Firebird        Fiat X1-9    Porsche 914-2     Lotus Europa   Ford Pantera L     Ferrari Dino    Maserati Bora       Volvo 142E 
       28.514002        31.184527        23.022863        22.603601         6.228431        30.482475         6.801507        22.939945 
  

Комментарии:

1. Я попробовал ваш код, он работает нормально. Но это плохо работает с моими данными. Можете ли вы исправить любую ошибку, если таковая имеется, как указано в ссылке для передачи данных pastebin.com/MUfWFCPM

2. У вас есть только 48 точек данных, вы тренируетесь на всем наборе данных. Что вы хотите предсказать? ваш код пытается предсказать строки 49: 72, которых не существует @Akash Joshi

3. Сэр, извините, похоже, у меня есть некоторый концептуальный пробел, я хотел спросить, можно ли предсказать невидимые данные на следующий день, обучив модель в течение 2 дней?

Ответ №2:

Если вы хотите предсказать, что произойдет в ближайшие два дня, вам нужно обучить модель прогнозированию на два дня вперед. Давайте выберем простой пример, затем я перейду к SVR. Предположим, мы используем линейную модель прямого прогнозирования и с помощью некоторого метода определили, что двух лагов достаточно. Итак, у нас есть эта модель:

y_{t h} = alpha phi_1 y_{t} phi_2 y_{t-1} e_{t h}

В экономической литературе это называется прямым прогнозом, потому что он напрямую выводит y_{t h}, в отличие от косвенного получения y_ {t h} путем обеспечения рекурсивной взаимосвязи между прогнозами. Допустим, что «y» — это температура в градусах Цельсия, поэтому вы хотите спрогнозировать температуру через два дня, используя данные о температуре вплоть до сегодняшнего дня включительно. Предположим, мы используем ежедневные температуры за последний месяц.

Мы знаем, что обычные наименьшие квадраты — это сходящаяся оценка альфа, phi_1 и phi_2, поэтому мы можем сформировать матрицу X, содержащую столбец единиц, один столбец температур с отставанием в h раз и столбец температур с отставанием в h 1 раз. Затем вычислите линейную проекцию нашего вектора температуры y на X примерно так: оценено [alpha, phi_1, phi_2] = (X’X) ^-1X’Y.

Теперь у нас есть оценочные параметры для всей выборки. Если я хочу знать y_ {t h}, мне нужна константа (мы произвольно выбрали «1» для оценки модели, поэтому будем использовать «1»), температура сегодня и температура вчера. Предположим, что здесь h = 2:

прогнозируемая температура через два дня = альфа phi_1 x температура сегодня phi_2 x температура вчера

Видите ли, разница между обучением модели и применением модели заключается в простом сдвиге: y_ {t} = alpha phi_1 y_{t-h} phi_2 y_ {t-h-1} e_ {t} — это то, что мы поместили в обучающую выборку. Последнее прогнозирование в выборке, которое мы сделали с использованием этой модели, — это умеренный климат сегодня, используя температуру 3 и 4 дня назад, соответственно. Мы также создали прогнозы наименьших квадратов для всех других наблюдаемых температур, за исключением первых трех наблюдений — для прогнозирования с помощью этой модели нам нужно два наблюдения плюс двухдневный интервал.

Теперь, с SVM и SVR, точка очень похожа. Ваш прогнозируемый результат представляет собой вещественную метку в случае проблемы регрессии. Предположим, мы также хотим спрогнозировать температуру, также на два дня вперед, используя те же данные и те же регрессоры. Затем входное пространство нашего SVR определяется двумя векторами — теми же двумя запаздывающими векторами температур, которые мы использовали.

Когда мы обучаем SVR для всего набора данных, мы создаем прогнозы для каждого наблюдения в наборе данных — опять же, за исключением первых трех наблюдений.

Для нечувствительного к e SVR пусть K() — используемое нами ядро, x_i — опорный вектор (это одна точка в пространстве y_ {t}, y_ {t-1}), а n_sv — количество опорных векторов:

y_{t h} = сумма_{i=1} ^{n_sv} (alpha_i — alpha_i*) K(x_i, x)

Прогнозирование y_{t h} похоже на вопрос, какова вещественная метка x: вы вводите последние p (в данном случае p = 2) наблюдений в обученное правило принятия решений SVR, и оно выдает вам метку. Если бы это была машина опорных векторов для классификации, в результате обучения получилась бы расширяющаяся гиперплоскость, и вы бы определили метку любой точки, имеющей координаты во входном пространстве, спросив: «На какой стороне плоскости она находится?»… Здесь то же самое, за исключением того, что вы ищете реальное значение.

Итак, с точки зрения программирования вам просто нужно предоставить вектор с правильным размером для «прогнозирования»: predict(best_model_you_picked, newdata=appropriate_input_space_vector)

Обратите внимание, что если вы обучали свою модель на «всей выборке», но некоторые из используемых вами переменных являются запаздывающими переменными, модель не соответствует последним нескольким наблюдениям переменных без запаздывания… точно так же, как модель AR, оцененная OLS, не использует последние наблюдения h для прогнозирования в выборке.