# Лабораторная работа №2: Обнаружение аномалий с помощью автокодировщиков Выполнили: Фонов А.Д., Хнытченков А.М. Вариант 3 ### Цель работы Получить практические навыки создания, обучения и применения искусственных нейронных сетей типа автокодировщик. Исследовать влияние архитектуры автокодировщика и количества эпох обучения на области в пространстве признаков, распознаваемые автокодировщиком после обучения. Научиться оценивать качество обучения автокодировщика на основе ошибки реконструкции и новых метрик EDCA. Научиться решать актуальную задачу обнаружения аномалий в данных с помощью автокодировщика как одноклассового классификатора. ## ЗАДАНИЕ 1: Работа с двумерными синтетическими данными ### Импорт библиотек и настройка окружения ```python import os os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2') import lab02_lib import numpy as np ``` **Описание:** Импортируются необходимые библиотеки и устанавливаются параметры для варианта 2. ### Генерация индивидуального набора двумерных данных ```python k = 3 data = lab02_lib.datagen(k, k, 1000, 2) print('Исходныеданные:') print(data) print('Размерностьданных:') print(data.shape) ``` **Результат выполнения:** ``` Исходные данные: k = 3 data = lab02_lib.datagen(k, k, 1000, 2) print('Исходныеданные:') print(data) print('Размерностьданных:') print(data.shape) ``` ![Синтетические данные](./out/train_set.png) ### Создание и обучение автокодировщика AE1 ```python epoch = 1000 patience = 100 ae_trainned, IRE_array, IREth = lab02_lib.create_fit_save_ae(data, 'out/AE_1.h5','out/AE_1_ire_th.txt', epoch, True, patience) print(f"IREth: {IREth}") lab02_lib.ire_plot('training', IRE_array, IREth, 'AE1') ``` ![Результаты AE1](./out/IRE_trainingAE1.png) IREth: 1.71 ### Создание и обучение автокодировщика AE2 ```python patience = 500 ae2_trained, IRE2, IREth2= lab02_lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt', 3000, True, patience) lab02_lib.ire_plot('training', IRE2, IREth2, 'AE2') print(f"IREth: {IREth2}") ``` ![Результаты AE2](./out/IRE_trainingAE2.png) IREth: 0.44 ### Расчет характеристик качества обучения автокодировщиков ```python numb_square= 20 xx,yy,Z1=lab02_lib.square_calc(numb_square,data, ae_trainned ,IREth,'1',True) ``` **Результат выполнения:** ![AE1 Граница класса](./out/AE1_train_def.png) ``` amount: 18 amount_ae: 101 ``` ![Площадь обучающего множества и площадь деформированного множества](./out/XtXd_1.png) ![Избыток. Дефицит. Покрытие](./out/XtXd_1_metrics.png) ``` Оценка качества AE1 IDEAL = 0. Excess: 4.611111111111111 IDEAL = 0. Deficit: 0.0 IDEAL = 1. Coating: 1.0 summa: 1.0 IDEAL = 1. Extrapolation precision (Approx): 0.1782178217821782 ``` ```python xx,yy,Z2=lab02_lib.square_calc(numb_square,data,ae2_trained,IREth2,'1',True) ``` **Результат выполнения:** ![AE2 Граница класса](./out/image.png) ``` amount: 19 amount_ae: 40 ``` ![Площадь обучающего множества и площадь деформированного множества](./out/image%20copy.png) ![Избыток. Дефицит. Покрытие](./out/image%20copy%202.png) ``` Оценка качества AE2 IDEAL = 0. Excess: 1.0 IDEAL = 0. Deficit: 0.0 IDEAL = 1. Coating: 1.0 summa: 1.0 IDEAL = 1. Extrapolation precision (Approx): 0.5 ``` ```python lab02_lib.plot2in1(data,xx,yy,Z1,Z2) ``` ![Сравнение AE1 и AE2](./out/AE1_AE2_train_def.png) ### Тестирование автокодировщиков ```python data_test= np.loadtxt('data_test.txt', dtype=float) lab02_lib.anomaly_detection_ae(predicted_labels1, ire1, IREth) lab02_lib.ire_plot('test', ire1, IREth, 'AE1') lab02_lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2) lab02_lib.ire_plot('test', ire1, IREth, 'AE2') ``` ![Сравнение результатов классификации](./out/AE1_AE2_train_def_anomalies.png) --- ## ЗАДАНИЕ 2: Работа с реальными данными Cardio ### Загрузка и изучение данных Cardio ```python train = np.loadtxt('cardio_train.txt', dtype=float) test = np.loadtxt('cardio_test.txt', dtype=float) ``` **Описание:** Загружаются данные Cardio, которые содержат измерения частоты сердечных сокращений плодаи сокращений матки на кардиотокограммах. ### Создание и обучение автокодировщика ```python from time import time start = time() ae3_trained, IRE3, IREth3 = lab02_lib.create_fit_save_ae(train,'out/AE3.h5','out/AE3_ire_th.txt', 85000, False, 7500, early_stopping_delta = 0.004) print("Время на обучение: ", time() - start) ``` **Результаты обучения:** Время на обучение: 2023.5726425647736 - loss: 0.0381 Порог IREth3: 3.12 ```python predicted_labels3, ire3 = lab02_lib.predict_ae(ae3_trained, test, IREth3) ``` ### Тестирование автокодировщика ```python lab02_lib.anomaly_detection_ae(predicted_labels3, ire3, IREth3) lab02_lib.ire_plot('test', ire3, IREth3, 'AE3') ``` **Описание:** Применяется обученный автокодировщик к тестовой выборке для обнаружения аномалий. **Результаты обнаружения аномалий:** ``` i Labels IRE IREth 97 [1.] [2.89] 2.83 98 [0.] [1.98] 2.83 99 [0.] [2.1] 2.83 100 [0.] [1.67] 2.83 101 [0.] [1.94] 2.83 102 [0.] [2.2] 2.83 103 [0.] [2.12] 2.83 104 [0.] [2.08] 2.83 105 [0.] [2.38] 2.83 106 [0.] [1.9] 2.83 107 [0.] [1.57] 2.83 108 [1.] [4.19] 2.83 Обнаружено 84.0 аномалий ``` ![Результаты тестирования AE3](./out/BlabLalFa.png) --- ## ИТОГОВЫЕ РЕЗУЛЬТАТЫ ### Таблица 1 - Результаты задания №1 | | Количество скрытых слоев | Количество нейронов в скрытых слоях | Количество эпох обучения | Ошибка MSE_stop | Порог ошибки реконструкции | Значение показателя Excess | Значение показателя Approx | Количество обнаруженных аномалий | |---|---|---|---|---|---|---|---|---| | **AE1** | 1 | 1 | 1000 | 0.0134 | 0.56 | 2.(1) | 0.321 | | | **AE2** | 5 | 3 2 1 2 3 | 3000 | 0.0096 | 0.48 | 1.2(7) | 0.439 | | ### Таблица 2 - Результаты задания №2 | Dataset name | Количество скрытых слоев | Количество нейронов в скрытых слоях | Количество эпох обучения | Ошибка MSE_stop | Порог ошибки реконструкции | % обнаруженных аномалий | |--------------|--------------------------|-------------------------------------|--------------------------|-----------------|----------------------------|-------------------------| | Cardio | 15 | 21 19 17 15 17 19 21 | 31000 | 0.0381 | 0.482 | 77% | --- ## ВЫВОДЫ ### Требования к данным для обучения - Обучающая выборка должна содержать только нормальные (неаномальные) образцы. - Данные необходимо нормализовать, чтобы обеспечить стабильность и сходимость обучения. - Объём выборки должен быть достаточным для покрытия характерных паттернов нормального поведения (в экспериментах использовалось ≥1000 образцов). ### Влияние архитектуры автокодировщика - Простая архитектура (AE1) быстро обучается, но даёт грубую аппроксимацию границы нормальных данных, что приводит к высокому значению показателя Excess и низкой точности экстраполяции. - Более глубокая и симметричная архитектура (AE2) лучше моделирует сложную форму распределения, уменьшая избыточное покрытие и повышая чувствительность к аномалиям. ### Влияние количества эпох обучения - Недостаточное число эпох (как у AE1) приводит к недообучению и завышенному порогу IRE. - Увеличение количества эпох (до 3000 у AE2 и 7000 у AE3) позволяет достичь более низкой ошибки реконструкции и стабильного порога, особенно на реальных данных. ### Порог обнаружения аномалий - Порог IREth, вычисляемый как 95-й перцентиль ошибки реконструкции на обучающей выборке, обеспечивает разумный компромисс между полнотой и точностью. - Более низкий порог (как у AE2 и AE3) повышает чувствительность к выбросам, но требует тщательной настройки, чтобы избежать ложных срабатываний. ### Оценка качества через метрики EDCA - Метрики Excess, Deficit, Coating и Extrapolation precision позволяют количественно сравнивать границы, формируемые разными моделями. - AE2 продемонстрировал лучшее качество аппроксимации по сравнению с AE1: меньший избыток и в 2.8 раза выше точность экстраполяции. - Для реальных данных (Cardio) автокодировщик AE3 обнаружил 84 аномалий, что соответствует ожидаемому поведению при адекватной настройке порога.