- •Лабораторная работа №1
- •Загрузка, инициализация и анализ данных
- •Подготовка временных меток
- •Построение автокорреляционной функции (АКФ)
- •Блок построения временных трендов с усреднением по 7 и 365 дней по колонке 'Consumption'
- •Формирование функции вычисления точности прогнозной модели
- •Реализации алгоритмов машинного обучения
- •Корректировки стационарности временного ряда, улучшение точности прогнозирования
- •Блок корректировки стационарности временного ряда
- •Функция генерирования дополнительных временных признаком
- •Лаборатоное задание
- •Лабораторная работа №2
- •Решение задач классификации машинного обучения
- •Теоретические сведения
- •Практическая часть
- •Лабораторная работа №3
- •«Создание баз знаний в Visual Prolog»
- •Задание на лабораторную работу:
- •Решение.
- •Результат:
- •Лабораторная работа №4
- •Пример сети распознавания цифры с помощью библиотеки Keras
- •Лабораторное задание
Реализации алгоритмов машинного обучения
Вданном блоке представлены регресионные алгоритмы машинного обучения:
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