Лабораторные работы / intel_lab2
.pdfОтчет по лабораторной работе № 2 по дисциплине «Интеллектуальные системы»
на тему «Обнаружение аномалий»
Цель работы
Получить практические навыки создания, обучения и применения искусственных нейронных сетей типа автокодировщик. Научиться загружать данные и проводить их предварительную обработку. Исследовать влияние архитектуры автокодировщика и количества эпох обучения на области в пространстве признаков, распознаваемые автокодировщиком после обучения. Научиться оценивать качество обучения автокодировщика на основе ошибки реконструкции и новых метрик EDCA. Научиться решать актуальную задачу обнаружения аномалий в данных с помощью автокодировщика как одноклассового классификатора.
Задание 1
1) В среде Google Colab создадим новый блокнот (notebook). Импортируем необходимые для работы библиотеки и модули.
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/Lab2')
# импорт модулей import numpy as np import lab02_lib as lib
2) Сгенерируем индивидуальный набор двумерных данных в пространстве признаков с координатами центра (22, 22). Выведем полученные данные на рисунок и в консоль.
# генерация датасета
data = lib.datagen(22, 22, 1000, 2)
1
# вывод данных и размерности print('Исходные данные:') print(data)
print('Размерность данных:') print(data.shape)
Исходные данные: [[22.10978971 21.97373741] [21.93911476 21.99157633] [21.872857 21.8962997 ]
...
[21.91337005 22.13011268] [21.91655809 22.10014979] [21.95680791 21.91179582]]
Размерность данных: (1000, 2)
3) Создадим и обучим автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения.
# обучение AE1 patience = 300
ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(data,'out/AE1.h5','out/AE1_ire_th.txt', 300, True, patience)
Задать архитектуру автокодировщиков или использовать архитектуру по умолчанию? (1/2): 1 Задайте количество скрытых слоёв (нечетное число) : 1 Задайте архитектуру скрытых слоёв автокодировщика, например, в виде 3 1 3 : 1
2
4) Зафиксируем ошибку MSE, на которой обучение завершилось. Построим график ошибки реконструкции обучающей выборки. Зафиксируем порог ошибки реконструкции – порог обнаружения аномалий.
Epoch 300/300
1/1 [==============================] - 0s 4ms/step - loss: 456.8507
# Построение графика ошибки реконструкции lib.ire_plot('training', IRE1, IREth1, 'AE1')
5) Создадим и обучим второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения.
# обучение AE2 patience = 1000
ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt', 1000, True, patience)
Задать архитектуру автокодировщиков или использовать архитектуру по умолчанию? (1/2): 2
6) Зафиксируем ошибку MSE, на которой обучение завершилось. Построим график ошибки реконструкции обучающей выборки. Зафиксируем второй порог ошибки реконструкции – порог обнаружения аномалий.
Epoch 1000/1000
3
1/1 [==============================] - 0s 11ms/step - loss: 261.3800
# Построение графика ошибки реконструкции lib.ire_plot('training', IRE2, IREth2, 'AE2')
Повторим пункты 3)-6) с новыми параметрами обучения, так как значения ошибки MSE, на которых завершилось обучение АЕ1 и АЕ2, достаточно велики.
3) Создадим и обучим автокодировщик AE1 простой архитектуры, задав большее количество эпох обучения, чем было задано для обучения предыдущего А1.. Зафиксируем в таблице вида табл.1 количество скрытых слоёв и нейронов в них.
# обучение AE1 patience = 300
ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(data,'out/AE1.h5','out/AE1_ire_th.txt', 12000, True, patience)
Задать архитектуру автокодировщиков или использовать архитектуру по умолчанию? (1/2): 1 Задайте количество скрытых слоёв (нечетное число) : 1 Задайте архитектуру скрытых слоёв автокодировщика, например, в виде 3 1 3 : 1
4) Зафиксируем ошибку MSE, на которой обучение завершилось. Построим график ошибки реконструкции обучающей выборки. Зафиксируем порог ошибки реконструкции – порог обнаружения аномалий.
4
Epoch 12000/12000
1/1 [==============================] - 0s 3ms/step - loss: 2.8649
# Построение графика ошибки реконструкции lib.ire_plot('training', IRE1, IREth1, 'AE1')
5) Создадим и обучим второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения, чем было задано для обучения предыдущего А2.
# обучение AE2 patience = 1000
ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt', 10000, True, patience)
Задать архитектуру автокодировщиков или использовать архитектуру по умолчанию? (1/2): 2
6) Зафиксируем ошибку MSE, на которой обучение завершилось. Построим график ошибки реконструкции обучающей выборки. Зафиксируем второй порог ошибки реконструкции – порог обнаружения аномалий.
Epoch 10000/10000
1/1 [==============================] - 0s 24ms/step - loss: 0.0100
# Построение графика ошибки реконструкции lib.ire_plot('training', IRE2, IREth2, 'AE2')
5
7) Рассчитаем характеристики качества обучения EDCA для AE1 и AE2. Визуализируем и сравним области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Для автокодировщика АЕ1:
#построение областей покрытия и границ классов
#расчет характеристик качества обучения
numb_square = 20
xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True)
amount: 22 amount_ae: 258
6
Оценка качества AE1
IDEAL = 0. Excess: 10.727272727272727 IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0 summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.08527131782945736
Для автокодировщика АЕ2:
#построение областей покрытия и границ классов
#расчет характеристик качества обучения
numb_square = 20
xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)
amount: 22 amount_ae: 24
7
Оценка качества AE2
IDEAL = 0. Excess: 0.13636363636363635 IDEAL = 0. Deficit: 0.045454545454545456 IDEAL = 1. Coating: 0.9545454545454546 summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.9166666666666667
# сравнение характеристик качества обучения и областей аппроксимации lib.plot2in1(data, xx, yy, Z1, Z2)
8
Вывод:
Из приведенного выше рисунка видно, что область точек в пространстве признаков, которую автокодировщик АЕ1 будет относить к целевому классу, значительно больше области, которую занимают обучающие данные, следовательно, АЕ1 будет пропускать аномалии и не пригоден для их качественного обнаружения. Область точек в пространстве признаков, которую автокодировщик АЕ2 будет относить к целевому классу, соответствует области, которую занимают обучающие данные, следовательно, АЕ2 подходит для качественного обнаружения аномалий.
8) Изучим сохраненный набор данных и пространство признаков. Создадим тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии.
Для создания тестовой выборки возьмем 5 точек с координатами: (X; Y) = (21; 22,5), (21; 22), (21; 21), (22; 21), (23; 21)
# загрузка тестового набора
data_test = np.loadtxt('test.txt', dtype=np.float)
9) Применим обученные автокодировщики AE1 и AE2 к тестовым данным и выведем значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль.
# тестирование АE1
predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1) lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1) lib.ire_plot('test', ire1, IREth1, 'AE1')
Аномалий не обнаружено
9
# тестирование АE2
predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2) lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2) lib.ire_plot('test', ire2, IREth2, 'AE2')
i |
Labels |
IRE |
IREth |
0 |
[1.] |
[1.41] |
0.36 |
1 |
[1.] |
[1.] |
0.36 |
2 |
[1.] |
[1.] |
0.36 |
3 |
[1.] |
[1.42] |
0.36 |
4 |
[1.] |
[1.11] |
0.36 |
Обнаружено 5.0 аномалий
10) Визуализируем элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2.
10