Контекст

Набор данных, содержащий цену на электроэнергию для центра обработки данных, а также факторы, которые могут повлиять на цену.

Описание столбцов:

DateTime: строка, определяющая дату и время выборки.

Праздник: Строка, дает название праздника, если день является выходным днем

HolidayFlag: целое число, 1, если день выходной, в противном случае ноль.

DayOfWeek: целое число (0–6), 0 понедельник, день недели

WeekOfYear: целое число, текущая неделя в году от этой даты

Целое число дня: день даты

Целое число месяца: месяц даты

Целое число года: год даты

Целое число PeriodOfDay: обозначает получасовой период дня (0–47).

SystemLoadEA: национальный прогноз нагрузки на этот период

SMPEA: прогноз цен на этот период

ORKTemperature: фактическая температура, измеренная в аэропорту Корка.

ORKWindspeed: фактическая скорость ветра, измеренная в аэропорту Корка.

CO2Intensity: фактическая интенсивность CO2 в (г/кВтч) для произведенной электроэнергии.

ActualWindProduction: фактическое производство энергии ветра за этот период.

SystemLoadEP2: фактическая загрузка национальной системы за этот период.

SMPEP2: фактическая цена за этот период времени, прогнозируемое значение

Научно-исследовательская работа

https://www.sciencedirect.com/science/article/pii/S030626191830196X

Импорт необходимых библиотек

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from math import sqrt
import keras
from keras.models import Sequential
from keras.layers import Dense
from sklearn.preprocessing import StandardScaler

Чтение набора данных

df = pd.read_csv("/content/electricity_prices.csv", na_values=['?'])
df.head()
df.shape

(38014, 18)

Набор данных содержит 38 014 строк и 18 столбцов.

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 38014 entries, 0 to 38013
Data columns (total 18 columns):
 #   Column                  Non-Null Count  Dtype  
---  ------                  --------------  -----  
 0   DateTime                38014 non-null  object 
 1   Holiday                 38014 non-null  object 
 2   HolidayFlag             38014 non-null  int64  
 3   DayOfWeek               38014 non-null  int64  
 4   WeekOfYear              38014 non-null  int64  
 5   Day                     38014 non-null  int64  
 6   Month                   38014 non-null  int64  
 7   Year                    38014 non-null  int64  
 8   PeriodOfDay             38014 non-null  int64  
 9   ForecastWindProduction  38009 non-null  float64
 10  SystemLoadEA            38012 non-null  float64
 11  SMPEA                   38012 non-null  float64
 12  ORKTemperature          37719 non-null  float64
 13  ORKWindspeed            37715 non-null  float64
 14  CO2Intensity            38007 non-null  float64
 15  ActualWindProduction    38009 non-null  float64
 16  SystemLoadEP2           38012 non-null  float64
 17  SMPEP2                  38012 non-null  float64
dtypes: float64(9), int64(7), object(2)
memory usage: 5.2+ MB

Проверка нулевых значений

df.isnull().sum()
DateTime                    0
Holiday                     0
HolidayFlag                 0
DayOfWeek                   0
WeekOfYear                  0
Day                         0
Month                       0
Year                        0
PeriodOfDay                 0
ForecastWindProduction      5
SystemLoadEA                2
SMPEA                       2
ORKTemperature            295
ORKWindspeed              299
CO2Intensity                7
ActualWindProduction        5
SystemLoadEP2               2
SMPEP2                      2
dtype: int64

ForecastWindProduction , SystemLoadEA , SMPEA ,ORKTemperature ,ORKWindspeed ,CO2Intensity ActualWindProduction , SystemLoadEP2 и SMPEP2 имеют нулевые значения.

Удаление пустых значений

df = df.dropna()

Построение целевой функции

plt.plot("SMPEP2", data=df)

График корреляции независимых атрибутов

plt.figure(figsize=(9,7))
sns.heatmap(df.corr(), annot=True, square=True, fmt='.1f', cbar=False);

График распределения целевой функции

sns.distplot(df['SMPEP2'])

Разделение независимых функций и целевой функции

X = df[['ActualWindProduction', 'SystemLoadEP2', 'SMPEA', 'SystemLoadEA', 'ForecastWindProduction', 
     'DayOfWeek', 'Year', 'ORKWindspeed', 'CO2Intensity', 'PeriodOfDay']]
y = df['SMPEP2']

Разделение Train-Validation (90% набор Train и 10% набор Validation)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state = 42)
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Построение модели с использованием нейронных сетей

model = keras.Sequential([
        keras.layers.Dense(512, activation="relu", input_shape=[10]),
        keras.layers.Dense(800, activation="relu"),
        keras.layers.Dropout(0.3),
        keras.layers.Dense(1024, activation="relu"),
        keras.layers.Dropout(0.3),
        keras.layers.Dense(1, activation = 'linear'),
        ])
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_4 (Dense)              (None, 512)               5632      
_________________________________________________________________
dense_5 (Dense)              (None, 800)               410400    
_________________________________________________________________
dropout_2 (Dropout)          (None, 800)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 1024)              820224    
_________________________________________________________________
dropout_3 (Dropout)          (None, 1024)              0         
_________________________________________________________________
dense_7 (Dense)              (None, 1)                 1025      
=================================================================
Total params: 1,237,281
Trainable params: 1,237,281
Non-trainable params: 0

Компиляция модели

model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])

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

early_stopping = keras.callbacks.EarlyStopping(patience = 10, min_delta = 0.001, restore_best_weights =True )
history = model.fit(
    X_train, y_train,
    validation_data=(X_test, y_test),
    batch_size=50,
    epochs=100,
    callbacks=[early_stopping],
    verbose=1, 
)

Оценка модели на тестовом наборе

from sklearn.metrics import mean_absolute_error,r2_score
predictions = model.predict(X_test)
print(f"MAE: {mean_absolute_error(y_test, predictions)}")

print(f"R2_score: {r2_score(y_test, predictions)}")

MAE: 10,99616479512835
R2_score: 0,5678318389935775

Модель регрессора XG Boost

from xgboost import XGBRegressor
model2 = XGBRegressor(n_estimators = 8000, max_depth=17, eta=0.1, subsample=0.7, colsample_bytree=0.8)
model2.fit(X_train, y_train)
pred = model2.predict(X_test)
r2_score(y_test, pred)

Оценка R2 составляет 0,6137340486115418.

mean_absolute_error(y_test, pred)

Средняя абсолютная ошибка равна 9,415647364373736.

Окончательные прогнозы модели XG Boost

pred
array([ 45.052734,  58.09632 ,  66.80695 , ...,  63.155807,  40.944473,
       182.29193 ], dtype=float32)

Дамп модели в файл рассола

model2.predict(X_test)
pkl_out = open("train_classifier","wb")
pkl.dump(model2,pkl_out)

Вывод

Используя этот анализ, мы можем прогнозировать цены на электроэнергию, которые являются фактическими ценами на этот период времени, и прогнозировать будущие бизнес-стратегии.

Вы можете подписаться на меня в Linkedin, Github и Kaggle.

Ссылка на гитхаб

https://github.com/ratul442/Прогнозирование цены на электроэнергию

Каггл Ссылка

https://www.kaggle.com/ratul6

LinkedIn Ссылка



Спасибо за чтение!!