# Лабораторная работа №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 аномалий, что соответствует ожидаемому поведению при адекватной настройке порога.