Контекст
Набор данных, содержащий цену на электроэнергию для центра обработки данных, а также факторы, которые могут повлиять на цену.
Описание столбцов:
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/Прогнозирование цены на электроэнергию
Каггл Ссылка
LinkedIn Ссылка
Спасибо за чтение!!