Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
9144.pdf
Скачиваний:
18
Добавлен:
25.11.2023
Размер:
2.34 Mб
Скачать

Реализации алгоритмов машинного обучения

Вданном блоке представлены регресионные алгоритмы машинного обучения:

1.LinearRegression - линейная ргерессия;

2.RandomForestRegressor - регрессия случайного леса;

3.KNeighborsRegressor - регрессия по типу к - соседних;

4.SVR (Support Vector Machine) - машина опорных векторов;

5.MLPRegressor (Multi-layer Perceptron regressor) - многослойная нейронная сеть по типу перцептрона.

Целью является произвести прогнозирование временного ряда 'Consumption' (энергопотребление). Для этого необходимо произвести тренировку модели МО по данным дф data['Consumption'], т.е. использовать в качестве изменяемой величины значение энергопотребления, а неизменяемой - время. Чтобы провести дальнейшую оценку точности обученной модели исходный датасет в начале делится на две части - тренировочную (X_train и y_train) и тестовую (X_test и y_test), где к переменной X относится неизменяемая составляющая (пр. время и ее составляющие), а к y - изменяемая, т.е. в текущем случае значения энергопотребления (дф data['Consumption']). Проверка обученной модели выполняется при помощи функции regression_results(), которая возвращает набор различных метрик оценки точности обученной модели. Строятся графики сравнения реального временного хода значений энергопотребления y_test и спрогнозированног (y_pred) на идентичный период времени.

import warnings warnings.filterwarnings('ignore')

#Импорт библиотеки деления датасета на выборки (TimeSeriesSplit) и перекрестного анализа (cross_val_score)

from sklearn.model_selection import TimeSeriesSplit, cross_val_score

#Импорт библиотек МО

from sklearn.linear_model import LinearRegression from sklearn.neural_network import MLPRegressor from sklearn.neighbors import KNeighborsRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.svm import SVR

# Копирование исхолного дф data_consumption = data[['Consumption']]

# Добавление новой колонки со вчерашними значениями (сдвиг колонки

'Consumption' на шаг назад) data_consumption.loc[:,'Yesterday'] = data_consumption.loc[:,'Consumption'].shift()

#Добавление колонки с разностью между значениями одно и двух дневной давности

data_consumption.loc[:,'Yesterday_Diff'] = data_consumption.loc[:,'Yesterday'].diff()

#Удаление из дф значений NaN

data_consumption = data_consumption.dropna()

12

# Формаирование тренировочнйо части датасета

X_train = data_consumption[:'2016'].drop(['Consumption'], axis = 1) y_train = data_consumption.loc[:'2016', 'Consumption']

# Формирование тестовой части датасета

X_test = data_consumption['2017'].drop(['Consumption'], axis = 1) y_test = data_consumption.loc['2017', 'Consumption']

#Объявление алгоритмов МО и аккумуляция их в массив

#для удобной работы в цикле

models = [] # Лист для хранения моделей models.append(('LR', LinearRegression()))

models.append(('NN', MLPRegressor(solver = 'lbfgs'))) # solver - определение ядра принятия решений

models.append(('KNN', KNeighborsRegressor())) models.append(('RF', RandomForestRegressor(n_estimators = 50))) # n_estimators - число деревьев в ансамбле

models.append(('SVR', SVR(gamma='auto', kernel='rbf'))) # kernel - ядро по которому формируется опорный вектор

# Рассчетный цикл

results = [] # Лист для хранения результата оценки модели names = [] # Лист для хранения имени модели

# Начало цикла for

for name, model in models:

#TimeSeriesSplit определяет количество частей на которые будет разбит датасет,

#переменная tscv используется как атрибут функции cross_val_score(), т.е.

#определяет количество частей датасета по которым будет проведен перекрестный

#анализ (валидация результатов по метрике R^2)

tscv = TimeSeriesSplit(n_splits=10)

cv_results = cross_val_score(model, X_train, y_train, cv=tscv, scoring='r2')

# Добавление результатов в лист results и names results.append(cv_results)

names.append(name)

# Вывод результатов

print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))

#График сравнения используемых алгоритмов plt.boxplot(results, labels=names) plt.title('Algorithm Comparison') plt.show()

#Цикл выполнения прогноза и сравнения реального временого хода

#со спрогнозированный результатом

for name, model in models:

#Функция .fit() выполняет обучение модели (подгонку)

#на основе тренировочного набора данных

13

model = model.fit(X_train, y_train)

#Функция .predict() выполняет прогнозирование

#на основе тестового промежутка времени.

y_pred = model.predict(X_test)

#Далее выполняется передача результатов

#прогнозирования y_pred и реального временного

#хода y_test в функцию regression_results(), с целью

#оценки точности итоговой модели.

regression_results(y_test, y_pred, model)

# Построение графика спрогнозированного и реальных временных ходов. fig, ax = plt.subplots(figsize = (18,8))

ax.plot(X_test.index, y_pred, linewidth=2, label='Prediction') ax.plot(X_test.index, y_test, linewidth=2, label='Real') ax.set_title('Data Comparison')

ax.legend() ax.set_xlabel('Year')

ax.set_ylabel('Consumption (GWh)') plt.show()

LR: 0.343747 (0.029773)

NN: 0.407222 (0.218062)

KNN: 0.646307 (0.083185)

RF: 0.635358 (0.083829)

SVR: -0.117944 (0.157755)

LinearRegression() r2: 0.3802

14

MAE: 104.2855

MSE: 16785.2379

RMSE: 129.5579

MLPRegressor(solver='lbfgs') r2: 0.5999

MAE: 80.7819 MSE: 10834.9559 RMSE: 104.0911

KNeighborsRegressor() r2: 0.7109

MAE: 53.5502

MSE: 7830.2964

RMSE: 88.489

15

RandomForestRegressor(n_estimators=50) r2: 0.6754

MAE: 57.0611

MSE: 8791.6715

RMSE: 93.7639

SVR(gamma='auto') r2: -0.0134 MAE: 136.5488 MSE: 27442.8101 RMSE: 165.6587

16

Пояснение к графику сравнения результатов моделей

17

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]