Прогнозирование ежедневных цен на электроэнергию (отчет)
Материал из MachineLearning.
(«Прогнозирование ежедневных цен на электроэнергию (отчет)» переименована в «Daily electricity price forecasting (report)»: english) |
(→Ссылки) |
||
(9 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
- | # | + | ==Введение== |
+ | Эта статья является сильно сокращенным вариантом статьи | ||
+ | [[Daily electricity price forecasting (report)]]. | ||
+ | |||
+ | == Описание проекта == | ||
+ | |||
+ | === Цель проекта === | ||
+ | Цель проекта - прогнозирование ежедневных цен на электричество. Горизонт прогнозирования - один месяц. | ||
+ | === Обоснование проекта === | ||
+ | Полученные данные могут быть использованы для хеджинга или другой игры на свободном рынке цен на электричество. | ||
+ | === Описание данных === | ||
+ | У нас есть данные с 01/01/2003 до сегодняшнего дня. Данные для прогнозирования состоят из временного ряда, различных погодных параметров (температура, скорость ветра, относительная влажность, ...) и средних цен на электричество. | ||
+ | === Критерии качества === | ||
+ | Критерием качества служит скользящий контроль. Мы разбиваем данные на основную выборку - все данные без данных за последний месяц и контрольную выборку - данные за последний месяц. Эту процедуру можно повторить для всех месяцев полседнего года. Целевая функция MAPE (средняя абсолютная ошибка в процентах) для посленего месяца. | ||
+ | === Требования к проекту === | ||
+ | Месячная ошибка для нашего алгоритма должна быть меньше ошибки для алгоритма заказчика (LASSO). | ||
+ | === Выполнимость проекта === | ||
+ | В данных отсутствует информация о пиках, предсказание которых является отдельной задачей. | ||
+ | === Используемые методы === | ||
+ | Мы испольуем предположение о линейной зависимости откликов от признаков или их различных производных. Также модель должна использовать периодичность конечных данных. | ||
+ | == Постановка задачи == | ||
+ | |||
+ | У нас есть временной ряд из матрицы <tex>X</tex> признаков и вектора <tex>Y</tex> ответов. Нам необходимо восстановить вектор ответов <tex>\hat{Y}</tex> по матрице признаков <tex>\hat{X}</tex>. Известно, что временной ряд, который необходимо восстановить идет непосредственно после временного ряда, ответы для которого нам известны. | ||
+ | |||
+ | Предлагается использовать функционал качества MAPE: | ||
+ | |||
+ | : <tex>{ Q(\hat{Y}) = \sum_{i=1}^n \frac{|y_i-\hat{y}_i|}{|y_i|}</tex>, | ||
+ | |||
+ | где <tex>\hat{Y} = (\hat{y}_1, \hat{y}_2, \dots, \hat{y}_n )</tex> -- восстановленные ответы, а <tex>Y = (y_1, y_2, \dots , y_n)</tex> -- правильные ответы. | ||
+ | |||
+ | == Описание алгоритмов == | ||
+ | |||
+ | Для решения предложенной задачи было выбрано 2 алгоритма - [[LARS]] и локальный алгоритм, вариация [[Метод k ближайших соседей (пример)|метода k ближайших соседей]]. | ||
+ | Были использованы различные модификации для улучшения работы алгоритма на реальных данных. Мы применяли преобразования начальных признаков, ядерное сглаживание, фильтрацию выбросов и нормализацию. | ||
+ | |||
+ | ==Описание системы== | ||
+ | |||
+ | Цель этого раздела -- описание системной архитектуры проекта. | ||
+ | |||
+ | ===Общий взгляд на систему=== | ||
+ | |||
+ | ====Описание архитектуры проекта==== | ||
+ | |||
+ | Мы использовали стандарт <big>IDEF0</big> для описания архитектуры проекта. | ||
+ | |||
+ | [[Изображение:EPF S SystemA-0.PNG|400px]] | ||
+ | [[Изображение:EPF S SystemA0.PNG|400px]] | ||
+ | [[Изображение:EPF S SystemA2.PNG|400px]] | ||
+ | |||
+ | |||
+ | ====Описание данных==== | ||
+ | |||
+ | Для всех алгоритмов мы использовали данные из файла ''' | ||
+ | DayElectricityPrice.mat''', содержащего | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- bgcolor="#cccccc" | ||
+ | ! width=90 % |Name | ||
+ | ! width=70 % |Size | ||
+ | ! width=120 % | Description | ||
+ | |- | ||
+ | | '''xRegression''' || <tex>[n\times m]</tex> || матрица переменных | ||
+ | |- | ||
+ | | '''yRegression''' || <tex>[n\times 2]</tex> || матрица откликов | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | |||
+ | Каждый элемент матрицы -- целое либо действительное число, первый столбец каждой матрицы -- временной ряд. | ||
+ | |||
+ | |||
+ | Для алгоритмов DOW LARS и LARS мы модифицировали данные следующим образом: | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- bgcolor="#cccccc" | ||
+ | ! width=90 % |Имя | ||
+ | ! width=70 % |Размер | ||
+ | ! width=120 % | Описание | ||
+ | |- | ||
+ | | '''trainingX''' || <tex>[n\times m]</tex> || обучающая матрица переменных | ||
+ | |- | ||
+ | | '''trainingY''' || <tex>[n\times 1]</tex> || обучающий вектор откликов | ||
+ | |- | ||
+ | | '''testX''' || <tex>[n\times m]</tex> || контрольная матрица переменных | ||
+ | |- | ||
+ | | '''model''' || <tex>[10\times 1]</tex> || вектор параметров алгоритма | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | Для локального алгоритма Федоровой мы использовали следующие структуры: | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- bgcolor="#cccccc" | ||
+ | ! width=90 % |Имя | ||
+ | ! width=70 % |Размер | ||
+ | ! width=120 % |Описание | ||
+ | |- | ||
+ | | '''trainingY''' || <tex>[n\times 1]</tex> || обучающий вектор откликов | ||
+ | |- | ||
+ | | '''testX''' || ''int'' || горизонт прогнозирования | ||
+ | |- | ||
+ | | <tex>[k,\lambda]</tex> || <tex>[int,\mathbb{R}]</tex> || параметры алгоритма | ||
+ | |- | ||
+ | |}. | ||
+ | |||
+ | |||
+ | ===Описание модулей=== | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- bgcolor="#cccccc" | ||
+ | ! width=90 % |Алгоритм | ||
+ | ! width=100 % |MATLab файл | ||
+ | ! width=120 % | Описание | ||
+ | |- | ||
+ | | '''LARS''' || LARS.m,modLARS.m || реализует LARS | ||
+ | |- | ||
+ | | '''Local algorithm Fedorovoy''' || kMeans.m || реализует LAF | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | |||
+ | Каждый модуль снабжен комментариями и файлом '''Demo.m''' -- демонстрация возможностей его работы. | ||
+ | |||
+ | |||
+ | |||
+ | ==Отчет о вычислительном эксперименте== | ||
+ | |||
+ | ===Визуальный анализ=== | ||
+ | |||
+ | ====Модельные данные==== | ||
+ | |||
+ | Проверим корректность работы LARS на модельных данных и его свойство ухудшать прогноз для плохо обусловленных матриц. Модельные данные создаются на основе кода, приведенного ниже: | ||
+ | |||
+ | <code> | ||
+ | n = 100; | ||
+ | m = 20; | ||
+ | X = e*ones(n,m)+(1-e)*[diag(ones(m,1));zeros(n-m,m)]; | ||
+ | beta = (rand(m,1)-0.5); | ||
+ | Y = X*beta; | ||
+ | X = X + (rand(n,m) - 0.5)/10; | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | Для различных значений <tex>e</tex> мы получили плохо и хорошо обусловленные матрицы. Мы использовали <tex>e=0.1k, k=\overline{1,10}</tex>. Для небольших значений <tex>e</tex> матрица хорошо обусловлена и имеет практически нулевую корреляцию признаков. Для значений <tex>e</tex> близких к 1, мы получим матрицу состоящую только из единиц с небольшим шумом. Она плохо обусловлена. Направления векторов корреляции почти совпадают. | ||
+ | |||
+ | [[Изображение:EPF_10e=0.png|400px]] | ||
+ | [[Изображение:EPF_10e=1.png|400px]] | ||
+ | [[Изображение:EPF_10e=5.png|400px]] | ||
+ | [[Изображение:EPF_10e=8.png|400px]] | ||
+ | [[Изображение:EPF_10e=9.png|400px]] | ||
+ | [[Изображение:EPF_10e=10.png|400px]] | ||
+ | |||
+ | Эксперимент показывает, что реализованный нами алгоритм обладает предложенным свойством. | ||
+ | |||
+ | ====Описание данных==== | ||
+ | |||
+ | В нашей задаче мы используем следующие данные - матрицу переменных '''xRegression''' и вектор откликов '''yRegression'''. Мы будем обозначать их '''X''' и '''Y''' соответственно. Размер '''X''' | ||
+ | -- <tex>n\times m</tex>, где <tex>n</tex> -- количество объектов (временной ряд дней), а <tex>m</tex> -- количество переменных. Размер '''Y''' | ||
+ | -- <tex>n\times 1</tex>. | ||
+ | |||
+ | Первый столбец <tex>X</tex> и <tex>Y</tex> -- временной ряд. Второй столбец <tex>Y</tex> -- вектор откликов. Они нормализованы на среднегодичное значение. Количество переменных в <tex>X</tex> -- 26. Они представлены в таблице ниже. | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- bgcolor="#cccccc" | ||
+ | ! width=30 % |# | ||
+ | ! width=160 % | Описание | ||
+ | |- | ||
+ | | '''1''' || временной ряд | ||
+ | |- | ||
+ | | '''2-6''' || день недели | ||
+ | |- | ||
+ | | '''7-18''' || месяц | ||
+ | |- | ||
+ | | '''19''' || средняя температура | ||
+ | |- | ||
+ | | '''20''' || индекс HDD | ||
+ | |- | ||
+ | | '''21''' || индексCDD | ||
+ | |- | ||
+ | | '''22''' || максимальная температура | ||
+ | |- | ||
+ | | '''23''' || минимальная температура | ||
+ | |- | ||
+ | | '''24''' || относительная влажность | ||
+ | |- | ||
+ | | '''25''' || осадки | ||
+ | |- | ||
+ | | '''26''' || скорость ветра | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | ====Эксперимент с LARS==== | ||
+ | |||
+ | Для данных нашей задачи мы провели ряд вычислительных экспериментов. Для каждого эксперимента мы посчитали MAPE. | ||
+ | |||
+ | В первом случае мы использовали для решения задачи обычный LARS и не модифицированные данные. | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,0,0,0,0,0,0,0]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF SC LARSresults.png|600px]] | ||
+ | [[Изображение:EPF SC MAPEresults.png|600px]] | ||
+ | |||
+ | Среднее значение MAPE для всех месяцев -- 16.64%. | ||
+ | |||
+ | Во втором эксперименте мы модифицировали матрицу признаков, добавив квадраты и корни начальных переменных. | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,1,0,0,0,0,0,0]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF AV LARSresults.png|600px]] | ||
+ | [[Изображение:EPF AV MAPEresults.png|600px]] | ||
+ | |||
+ | Средняя MAPE для всех месяцев равняется 17.20%. | ||
+ | |||
+ | В третьем эксперименте мы использовали сглаженные и индикаторные переменные. | ||
+ | |||
+ | <code> | ||
+ | model = [1,0,0,1,0,0,0,0,0]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF SS LARSresults.png|600px]] | ||
+ | [[Изображение:EPF SS MAPEresults.png|600px]] | ||
+ | |||
+ | Средняя MAPE получилась равной 17.16%. | ||
+ | |||
+ | В следующем эксперименте мы использовали сглаженные и сглаженные квадраты переменных. | ||
+ | |||
+ | <code> | ||
+ | model = [1,0,0,1,1,0,0,0,0]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF CS LARSresults.png|600px]] | ||
+ | [[Изображение:EPF CS MAPEresults.png|600px]] | ||
+ | |||
+ | MAPE -- 19.2%. | ||
+ | |||
+ | В последнем эксперименте этого раздела мы использовали и сглаженные, и не сглаженные значения переменных | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,1,1,0,0,0,0,0]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF CSS LARSresults.png|600px]] | ||
+ | [[Изображение:EPF CSS MAPEresults.png|600px]] | ||
+ | |||
+ | Мы получили MAPE 16.89% в этом эксперименте. | ||
+ | |||
+ | Полученные результаты позволяют говорить о том, что для такого набора переменных значение MAPE -- между 16% и 18%. Сглаживание не способно сильно повлиять на ситуацию. Необходимо попробовать исключить выбросы из данных, что бы улучшить прогноз. | ||
+ | |||
+ | ====Фильтрация выбросов==== | ||
+ | |||
+ | В этом разделе мы использовали фильтрацию выбросов. Для оптимизации параметров фильтрации использовалась двухмерная оптимизация. | ||
+ | |||
+ | В первом эксперименте мы использовали начальный набор переменных и фильтацию. | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,0,0,0,0,0,0,0]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF P SimplePicks.png|600px]] | ||
+ | |||
+ | Минимальная MAPE равнаs 15.45\%( в точке | ||
+ | <tex>\{r_1,r_2\}=\{0.5,0.7\}</tex>). Мы получили меньшее значение MAPE , чем раньше. | ||
+ | |||
+ | В следующем эксперименте мы использовали модифицированные и сглаженные переменные. | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,1,1,0,0,0,0,0]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF P CompliPicks.png|600px]] | ||
+ | |||
+ | У функции MAPE локальный минимум в точке <tex>\{r_1,r_2\}=\{0.8,1.0\}</tex>, | ||
+ | значение функции -- 15.29%. Ниже представлены результаты для оптимальных параметров фильтрации. | ||
+ | |||
+ | [[Изображение:EPF P LARSresults.png|600px]] | ||
+ | [[Изображение:EPF P MAPEresults.png|600px]] | ||
+ | |||
+ | Мы получили результат лучше, чем в предыдущем разделе. | ||
+ | |||
+ | ====Авторегрессия==== | ||
+ | |||
+ | Давайте применим авторегрессию к решению этой задачи. | ||
+ | |||
+ | Как и раньше, для оптимизации мы используем двухмерную оптимизацию. | ||
+ | |||
+ | |||
+ | [[Изображение:EPF auto autoPicks.png|600px]] | ||
+ | |||
+ | Минимум значения MAPE -- в точке <tex>\{r_1,r_2\}=\{0.7,0.8\}</tex>. | ||
+ | Он равен 13.31%. | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,1,1,0,0,0,0.7,0.8]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF auto LARSresults.png|600px]] | ||
+ | [[Изображение:EPF auto MAPEresults.png|600px]] | ||
+ | |||
+ | |||
+ | Для каждого месяца: | ||
+ | |||
+ | [[Изображение:EPF EM LARSresults1.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults2.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults3.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults4.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults5.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults6.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults7.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults8.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults9.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults10.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults11.png|400px]] | ||
+ | [[Изображение:EPF EM LARSresults12.png|400px]] | ||
+ | |||
+ | Этот результат -- лучший из полученных нами. | ||
+ | |||
+ | ====Набор моделей для каждого дня недели==== | ||
+ | |||
+ | В данном разделе мы используем периодику предложенных данных для создания более точного прогноза. Для каждого мы построим отдельную модель регрессии. | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,1,1,0,0,0,0,0,s]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | <tex>S</tex> -- множитель для создания обучающей выборки. Ее размер | ||
+ | -- <tex>5\cdot s</tex>. | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- bgcolor="#cccccc" | ||
+ | ! width=90 % |Control set size | ||
+ | ! width=30 % | 4 | ||
+ | ! width=30 % | 8 | ||
+ | ! width=30 % | 12 | ||
+ | ! width=30 % | 16 | ||
+ | ! width=30 % | 20 | ||
+ | ! width=30 % | 24 | ||
+ | ! width=30 % | 28 | ||
+ | ! width=30 % | 32 | ||
+ | ! width=30 % | 36 | ||
+ | ! width=30 % | 40 | ||
+ | |||
+ | |- | ||
+ | | '''MAPE rate''' || 0.1740 || 0.1860 || 0.1790 || 0.1897 || 0.184 || 0.1826 || 0.1882 || 0.1831 || 0.1846 || 0.195 | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | |||
+ | Мы видим, что улучшения за счет использования периодичности данных путем создания отдельных моделей для каждого дня недели добиться не удается. | ||
+ | |||
+ | Попробуем удалить выбросы из выборки и снова применить данную идею. | ||
+ | |||
+ | |||
+ | [[Изображение:EPF AD AutoPicks.png|600px]] | ||
+ | |||
+ | |||
+ | MAPE равняется 14.79\%. | ||
+ | |||
+ | <code> | ||
+ | model = [1,1,1,0,0,0,6,0.3,0.3,1]; % model parameters | ||
+ | </code> | ||
+ | |||
+ | [[Изображение:EPF AD LARSresults.png|600px]] | ||
+ | [[Изображение:EPF AD MAPEresults.png|600px]] | ||
+ | |||
+ | Нам не удалось добиться улучшения качества прогнозирования путем создания отдельной модели для каждого дня недели. | ||
+ | |||
+ | ====Локальный алгоритм Федоровой==== | ||
+ | |||
+ | Мы используем алгоритм из работ (11) и (12). Мотивация для его использования -- наличие периодик в наших данных. Основная проблема -- наличие выбросов и шума в наших данных. В итоге мы получили результаты хуже, чем результаты для LARS. | ||
+ | |||
+ | Процедура оптимизации параметров алгоритма быстро сходится и дает результаты, представленные ниже. | ||
+ | |||
+ | [[Изображение:EPF L KNNresults.png|600px]] | ||
+ | [[Изображение:EPF L MAPEresults.png|600px]] | ||
+ | |||
+ | MAPE равняется 20.43%. | ||
+ | |||
+ | ===Сравнение алгоритмов=== | ||
+ | |||
+ | Подведем итог нашей работы. Вынесем результата работы наших алгоритмов в таблицу | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- bgcolor="#cccccc" | ||
+ | ! width=80 % |Algorithm | ||
+ | ! width=50 % | LARS | ||
+ | ! width=50 % | RS LARS | ||
+ | ! width=50 % | RS and autoLARS | ||
+ | ! width=50 % | DOW LARS | ||
+ | ! width=50 % | LAF | ||
+ | |- | ||
+ | | '''MAPE''' || 16.64% || 15.29% || 13.31% || 14.79% || 20.43% | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | |||
+ | Две основные трудности при попытке создания регрессионных моделей для наших данных -- наличие выбросов, резких скачков в векторе ответов и слабая корреляция между представленными матрицами переменных и откликов. | ||
+ | |||
+ | ==Отчет о результатах== | ||
+ | |||
+ | Для нашего лучшего алгоритма мы уменьшили MAPE на 4% по отношению к начальному алгоритму (Мы получили 13.31% по сравнению с начальными 17%). Что бы решить эту задачу мы применили различные дополнительные эвристики и модификации к LARS. Так же мы создали реализацию локального алгоритма к ближайших соседей и сравнили результаты работы наших алгоритмов с его результатом работы. | ||
+ | |||
+ | ==Смотри также== | ||
+ | |||
+ | [[Daily electricity price forecasting (report)]] | ||
+ | |||
+ | [[LARS]] | ||
+ | |||
+ | [[Метод k ближайших соседей (пример)]] | ||
+ | |||
+ | ==Ссылки== | ||
+ | |||
+ | [https://mlalgorithms.svn.sourceforge.net/svnroot/mlalgorithms/Group674/Zaitsev2009DEPF/ Отчет о выполнении проекта, архитектура проекта и код алгоритмов] | ||
+ | |||
+ | == Литература == | ||
+ | |||
+ | # {{книга | ||
+ | |автор = Hsiao-Tien Pao | ||
+ | |ссылка = http://www.springerlink.com/content/h422246780708564 | ||
+ | |заглавие = A Neural Network Approach to m-Daily-Ahead Electricity Price Prediction | ||
+ | |год = 2006 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = Wei Wu, Jianzhong Zhou,Li Mo and Chengjun Zhu | ||
+ | |ссылка = http://www.springerlink.com/content/m321712571941311/ | ||
+ | |заглавие = Forecasting Electricity Market Price Spikes Based on Bayesian Expert with Support Vector Machines | ||
+ | |год = 2006 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = S.Borovkova, J.Permana | ||
+ | |ссылка = http://www.springerlink.com/content/x808q22h14q2w070/ | ||
+ | |заглавие = Modelling electricity prices by the potential jump-diffusion | ||
+ | |год = 2006 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = R.Weron, A.Misiorek | ||
+ | |ссылка = http://mpra.ub.uni-muenchen.de/10428 | ||
+ | |заглавие = Forecasting spot electricity prices: A comparison of parametric and semiparametric time series models | ||
+ | |год = 2008 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = J.Cherry, H.Cullen, M.Vissbeck, A.Small and C.Uvo | ||
+ | |ссылка = http://www.springerlink.com/content/y3507q34185g7752 | ||
+ | |заглавие = Impacts of the North Atlantic Oscillation on Scandinavian Hydropower Production and Energy Markets | ||
+ | |год = 2005 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = Yuji Yamada | ||
+ | |ссылка = http://www.springerlink.com/content/b21h50524w1w5413 | ||
+ | |заглавие = Optimal Hedging of Prediction Errors Using Prediction Errors | ||
+ | |год = 2008 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |ссылка = http://en.wikipedia.org/Energy_in_germany | ||
+ | |заглавие = Wikipedia | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani | ||
+ | |ссылка = http://www-stat.stanford.edu/~tibs/ftp/lars.pdf | ||
+ | |заглавие = Least Angle Regression | ||
+ | |год = 2002 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = Robert Tibshirani | ||
+ | |ссылка = http://www-stat.stanford.edu/~tibs/lasso/lasso.pdf | ||
+ | |заглавие = Regression shrinkage selection and via the LASSO | ||
+ | |год = 1996 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = Vadim Strijov | ||
+ | |ссылка = http://www3.iam.metu.edu.tr/iam/images/9/9b/Strijov-ankara.pdf | ||
+ | |заглавие = Model Generation and its Applications in Financial Sector | ||
+ | |год = 2009 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = J. McNames | ||
+ | |ссылка = http://web.cecs.pdx.edu/~mcnames/Publications/Dissertation.pdf | ||
+ | |заглавие = Innovations in local modeling for time series prediction | ||
+ | |год = 1996 | ||
+ | }} | ||
+ | # {{книга | ||
+ | |автор = В. Федорова | ||
+ | |заглавие = Локальные методы прогнозирования временных рядов | ||
+ | |год = 2009 | ||
+ | }} | ||
+ | |||
+ | {{ЗаданиеВыполнено|Зайцев Алексей|В.В. Стрижов|15 декабря 2009|Likz|Strijov|}} | ||
+ | [[Категория:Практика и вычислительные эксперименты]] | ||
+ | __NOTOC__ |
Текущая версия
Введение
Эта статья является сильно сокращенным вариантом статьи Daily electricity price forecasting (report).
Описание проекта
Цель проекта
Цель проекта - прогнозирование ежедневных цен на электричество. Горизонт прогнозирования - один месяц.
Обоснование проекта
Полученные данные могут быть использованы для хеджинга или другой игры на свободном рынке цен на электричество.
Описание данных
У нас есть данные с 01/01/2003 до сегодняшнего дня. Данные для прогнозирования состоят из временного ряда, различных погодных параметров (температура, скорость ветра, относительная влажность, ...) и средних цен на электричество.
Критерии качества
Критерием качества служит скользящий контроль. Мы разбиваем данные на основную выборку - все данные без данных за последний месяц и контрольную выборку - данные за последний месяц. Эту процедуру можно повторить для всех месяцев полседнего года. Целевая функция MAPE (средняя абсолютная ошибка в процентах) для посленего месяца.
Требования к проекту
Месячная ошибка для нашего алгоритма должна быть меньше ошибки для алгоритма заказчика (LASSO).
Выполнимость проекта
В данных отсутствует информация о пиках, предсказание которых является отдельной задачей.
Используемые методы
Мы испольуем предположение о линейной зависимости откликов от признаков или их различных производных. Также модель должна использовать периодичность конечных данных.
Постановка задачи
У нас есть временной ряд из матрицы признаков и вектора ответов. Нам необходимо восстановить вектор ответов по матрице признаков . Известно, что временной ряд, который необходимо восстановить идет непосредственно после временного ряда, ответы для которого нам известны.
Предлагается использовать функционал качества MAPE:
- ,
где -- восстановленные ответы, а -- правильные ответы.
Описание алгоритмов
Для решения предложенной задачи было выбрано 2 алгоритма - LARS и локальный алгоритм, вариация метода k ближайших соседей. Были использованы различные модификации для улучшения работы алгоритма на реальных данных. Мы применяли преобразования начальных признаков, ядерное сглаживание, фильтрацию выбросов и нормализацию.
Описание системы
Цель этого раздела -- описание системной архитектуры проекта.
Общий взгляд на систему
Описание архитектуры проекта
Мы использовали стандарт IDEF0 для описания архитектуры проекта.
Описание данных
Для всех алгоритмов мы использовали данные из файла DayElectricityPrice.mat, содержащего
Name | Size | Description |
---|---|---|
xRegression | матрица переменных | |
yRegression | матрица откликов |
Каждый элемент матрицы -- целое либо действительное число, первый столбец каждой матрицы -- временной ряд.
Для алгоритмов DOW LARS и LARS мы модифицировали данные следующим образом:
Имя | Размер | Описание |
---|---|---|
trainingX | обучающая матрица переменных | |
trainingY | обучающий вектор откликов | |
testX | контрольная матрица переменных | |
model | вектор параметров алгоритма |
Для локального алгоритма Федоровой мы использовали следующие структуры:
Имя | Размер | Описание |
---|---|---|
trainingY | обучающий вектор откликов | |
testX | int | горизонт прогнозирования |
параметры алгоритма |
Описание модулей
Алгоритм | MATLab файл | Описание |
---|---|---|
LARS | LARS.m,modLARS.m | реализует LARS |
Local algorithm Fedorovoy | kMeans.m | реализует LAF |
Каждый модуль снабжен комментариями и файлом Demo.m -- демонстрация возможностей его работы.
Отчет о вычислительном эксперименте
Визуальный анализ
Модельные данные
Проверим корректность работы LARS на модельных данных и его свойство ухудшать прогноз для плохо обусловленных матриц. Модельные данные создаются на основе кода, приведенного ниже:
n = 100; m = 20; X = e*ones(n,m)+(1-e)*[diag(ones(m,1));zeros(n-m,m)]; beta = (rand(m,1)-0.5); Y = X*beta; X = X + (rand(n,m) - 0.5)/10;
Для различных значений мы получили плохо и хорошо обусловленные матрицы. Мы использовали . Для небольших значений матрица хорошо обусловлена и имеет практически нулевую корреляцию признаков. Для значений близких к 1, мы получим матрицу состоящую только из единиц с небольшим шумом. Она плохо обусловлена. Направления векторов корреляции почти совпадают.
Эксперимент показывает, что реализованный нами алгоритм обладает предложенным свойством.
Описание данных
В нашей задаче мы используем следующие данные - матрицу переменных xRegression и вектор откликов yRegression. Мы будем обозначать их X и Y соответственно. Размер X -- , где -- количество объектов (временной ряд дней), а -- количество переменных. Размер Y -- .
Первый столбец и -- временной ряд. Второй столбец -- вектор откликов. Они нормализованы на среднегодичное значение. Количество переменных в -- 26. Они представлены в таблице ниже.
# | Описание |
---|---|
1 | временной ряд |
2-6 | день недели |
7-18 | месяц |
19 | средняя температура |
20 | индекс HDD |
21 | индексCDD |
22 | максимальная температура |
23 | минимальная температура |
24 | относительная влажность |
25 | осадки |
26 | скорость ветра |
Эксперимент с LARS
Для данных нашей задачи мы провели ряд вычислительных экспериментов. Для каждого эксперимента мы посчитали MAPE.
В первом случае мы использовали для решения задачи обычный LARS и не модифицированные данные.
model = [1,1,0,0,0,0,0,0,0]; % model parameters
Среднее значение MAPE для всех месяцев -- 16.64%.
Во втором эксперименте мы модифицировали матрицу признаков, добавив квадраты и корни начальных переменных.
model = [1,1,1,0,0,0,0,0,0]; % model parameters
Средняя MAPE для всех месяцев равняется 17.20%.
В третьем эксперименте мы использовали сглаженные и индикаторные переменные.
model = [1,0,0,1,0,0,0,0,0]; % model parameters
Средняя MAPE получилась равной 17.16%.
В следующем эксперименте мы использовали сглаженные и сглаженные квадраты переменных.
model = [1,0,0,1,1,0,0,0,0]; % model parameters
MAPE -- 19.2%.
В последнем эксперименте этого раздела мы использовали и сглаженные, и не сглаженные значения переменных
model = [1,1,1,1,0,0,0,0,0]; % model parameters
Мы получили MAPE 16.89% в этом эксперименте.
Полученные результаты позволяют говорить о том, что для такого набора переменных значение MAPE -- между 16% и 18%. Сглаживание не способно сильно повлиять на ситуацию. Необходимо попробовать исключить выбросы из данных, что бы улучшить прогноз.
Фильтрация выбросов
В этом разделе мы использовали фильтрацию выбросов. Для оптимизации параметров фильтрации использовалась двухмерная оптимизация.
В первом эксперименте мы использовали начальный набор переменных и фильтацию.
model = [1,1,0,0,0,0,0,0,0]; % model parameters
Минимальная MAPE равнаs 15.45\%( в точке ). Мы получили меньшее значение MAPE , чем раньше.
В следующем эксперименте мы использовали модифицированные и сглаженные переменные.
model = [1,1,1,1,0,0,0,0,0]; % model parameters
У функции MAPE локальный минимум в точке , значение функции -- 15.29%. Ниже представлены результаты для оптимальных параметров фильтрации.
Мы получили результат лучше, чем в предыдущем разделе.
Авторегрессия
Давайте применим авторегрессию к решению этой задачи.
Как и раньше, для оптимизации мы используем двухмерную оптимизацию.
Минимум значения MAPE -- в точке . Он равен 13.31%.
model = [1,1,1,1,0,0,0,0.7,0.8]; % model parameters
Для каждого месяца:
Этот результат -- лучший из полученных нами.
Набор моделей для каждого дня недели
В данном разделе мы используем периодику предложенных данных для создания более точного прогноза. Для каждого мы построим отдельную модель регрессии.
model = [1,1,1,1,0,0,0,0,0,s]; % model parameters
-- множитель для создания обучающей выборки. Ее размер -- .
Control set size | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 |
---|---|---|---|---|---|---|---|---|---|---|
MAPE rate | 0.1740 | 0.1860 | 0.1790 | 0.1897 | 0.184 | 0.1826 | 0.1882 | 0.1831 | 0.1846 | 0.195 |
Мы видим, что улучшения за счет использования периодичности данных путем создания отдельных моделей для каждого дня недели добиться не удается.
Попробуем удалить выбросы из выборки и снова применить данную идею.
MAPE равняется 14.79\%.
model = [1,1,1,0,0,0,6,0.3,0.3,1]; % model parameters
Нам не удалось добиться улучшения качества прогнозирования путем создания отдельной модели для каждого дня недели.
Локальный алгоритм Федоровой
Мы используем алгоритм из работ (11) и (12). Мотивация для его использования -- наличие периодик в наших данных. Основная проблема -- наличие выбросов и шума в наших данных. В итоге мы получили результаты хуже, чем результаты для LARS.
Процедура оптимизации параметров алгоритма быстро сходится и дает результаты, представленные ниже.
MAPE равняется 20.43%.
Сравнение алгоритмов
Подведем итог нашей работы. Вынесем результата работы наших алгоритмов в таблицу
Algorithm | LARS | RS LARS | RS and autoLARS | DOW LARS | LAF |
---|---|---|---|---|---|
MAPE | 16.64% | 15.29% | 13.31% | 14.79% | 20.43% |
Две основные трудности при попытке создания регрессионных моделей для наших данных -- наличие выбросов, резких скачков в векторе ответов и слабая корреляция между представленными матрицами переменных и откликов.
Отчет о результатах
Для нашего лучшего алгоритма мы уменьшили MAPE на 4% по отношению к начальному алгоритму (Мы получили 13.31% по сравнению с начальными 17%). Что бы решить эту задачу мы применили различные дополнительные эвристики и модификации к LARS. Так же мы создали реализацию локального алгоритма к ближайших соседей и сравнили результаты работы наших алгоритмов с его результатом работы.
Смотри также
Daily electricity price forecasting (report)
Метод k ближайших соседей (пример)
Ссылки
Отчет о выполнении проекта, архитектура проекта и код алгоритмов
Литература
- Hsiao-Tien Pao A Neural Network Approach to m-Daily-Ahead Electricity Price Prediction. — 2006.
- Wei Wu, Jianzhong Zhou,Li Mo and Chengjun Zhu Forecasting Electricity Market Price Spikes Based on Bayesian Expert with Support Vector Machines. — 2006.
- S.Borovkova, J.Permana Modelling electricity prices by the potential jump-diffusion. — 2006.
- R.Weron, A.Misiorek Forecasting spot electricity prices: A comparison of parametric and semiparametric time series models. — 2008.
- J.Cherry, H.Cullen, M.Vissbeck, A.Small and C.Uvo Impacts of the North Atlantic Oscillation on Scandinavian Hydropower Production and Energy Markets. — 2005.
- Yuji Yamada Optimal Hedging of Prediction Errors Using Prediction Errors. — 2008.
- Wikipedia.
- Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani Least Angle Regression. — 2002.
- Robert Tibshirani Regression shrinkage selection and via the LASSO. — 1996.
- Vadim Strijov Model Generation and its Applications in Financial Sector. — 2009.
- J. McNames Innovations in local modeling for time series prediction. — 1996.
- В. Федорова Локальные методы прогнозирования временных рядов. — 2009.
Данная статья была создана в рамках учебного задания.
См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе. |