Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

689 строки
30 KiB
Markdown

# Отчёт по лабораторной работе №2
**Касимов Азамат, Немыкин Никита — А-01-22**
---
## Задание 1
### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули.
```python
# импорт модулей
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2')
```
```python
import lab02_lib as lib
```
### 2) Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (6, 6), где 6 – номер бригады. Вывели полученные данные на рисунок и в консоль.
```python
# генерация датасета
data = lib.datagen(6, 6, 1000, 2)
# вывод данных и размерности
print('Исходные данные:')
print(data)
print('Размерность данных:')
print(data.shape)
```
![o](images/1.png)
```output
Исходные данные:
[[5.85155463 5.90866047]
[5.89835027 5.87217268]
[5.95502834 6.13788939]
...
[5.97194799 6.15187645]
[6.24367408 6.18137502]
[6.04890409 6.24554664]]
Размерность данных:
(1000, 2)
```
### 3) Создали и обучили автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения. Зафиксировали в таблице вида табл.1 количество скрытых слоёв и нейронов в них
```python
# обучение AE1
patience = 300
ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(data,'out/AE1.h5','out/AE1_ire_th.txt',
1000, True, patience)
```
4) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий.
Ошибка MSE_AE1 = 16.0985
```python
# Построение графика ошибки реконструкции
lib.ire_plot('training', IRE1, IREth1, 'AE1')
```
![o](images/2.png)
### 5) Создали и обучили второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения
```python
# обучение AE2
ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt',
3000, True, patience)
```
### 6) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали второй порог ошибки реконструкции – порог обнаружения аномалий.
Ошибка MSE_AE2 = 0.0112
```python
# Построение графика ошибки реконструкции
lib.ire_plot('training', IRE2, IREth2, 'AE2')
```
![o](images/3.png)
### 7) Рассчитали характеристики качества обучения EDCA для AE1 и AE2. Визуализировали и сравнили области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Сделали вывод о пригодности AE1 и AE2 для качественного обнаружения аномалий.
```python
# построение областей покрытия и границ классов
# расчет характеристик качества обучения
numb_square = 20
xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True)
```
![o](images/4.png)
```output
amount: 21
amount_ae: 301
```
![o](images/5.png)
![o](images/6.png)
```output
Оценка качества AE1
IDEAL = 0. Excess: 13.333333333333334
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.06976744186046512
```
```python
# построение областей покрытия и границ классов
# расчет характеристик качества обучения
numb_square = 20
xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)
```
![o](images/7.png)
```output
amount: 21
amount_ae: 36
```
![o](images/8.png)
![o](images/9.png)
```output
Оценка качества AE2
IDEAL = 0. Excess: 0.7142857142857143
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.5833333333333335
```
```python
# сравнение характеристик качества обучения и областей аппроксимации
lib.plot2in1(data, xx, yy, Z1, Z2)
```
![o](images/10.png)
### 8) Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8).
Полученные показатели EDCA для автокодировщика AE2 нас устраивают.
### 9) Изучили сохраненный набор данных и пространство признаков. Создали тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии.
```python
# загрузка тестового набора
data_test = np.loadtxt('data_test.txt', dtype=float)
print(data_test)
```
```output
[[4.85155463 4.90866047]
[4.89835027 4.87217268]
[4.95502834 4.13788939]
[4.9958611 4.8697867 ]]
```
### 10) Применили обученные автокодировщики AE1 и AE2 к тестовым данным и вывели значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль.
```python
# тестирование АE1
predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1)
```
```python
# тестирование АE1
lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1)
lib.ire_plot('test', ire1, IREth1, 'AE1')
```
```output
Аномалий не обнаружено
```
![o](images/11.png)
```python
# тестирование АE2
predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2)
```
```python
# тестирование АE2
lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2)
lib.ire_plot('test', ire2, IREth2, 'AE2')
```
```output
i Labels IRE IREth
0 [1.] [1.48] 0.44
1 [1.] [1.47] 0.44
2 [1.] [2.04] 0.44
3 [1.] [1.41] 0.44
Обнаружено 4.0 аномалий
```
![o](images/12.png)
### 11) Визуализировали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2.
```python
lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)
```
![o](images/13.png)
### 12) Результаты исследования занесли в таблицу:
Табл. 1 Результаты задания №1
| | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | Значение показателя<br>Excess | Значение показателя<br>Approx | Количество обнаруженных<br>аномалий |
|-----:|------------------------------|----------------------------------------|-----------------------------|--------------------|-------------------------------|-------------------------------|--------------------------------|-------------------------------------|
| AE1 | 1 | 1 | 1000 | 16.0985 | 6 | 13.333333333333334 | 0.06976744186046512 | 0 |
| AE2 | 5 | 3,2,1,2,3 | 3000 | 0.0112 | 0.44 | 0.7142857142857143 | 0.5833333333333335 | 4 |
### 13) Сделали выводы о требованиях к:
- данным для обучения,
- архитектуре автокодировщика,
- количеству эпох обучения,
- ошибке MSE_stop, приемлемой для останова обучения,
- ошибке реконструкции обучающей выборки (порогу обнаружения
аномалий),
- характеристикам качества обучения EDCA одноклассового
классификатора
для качественного обнаружения аномалий в данных.
1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение
2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 3-5
3) В рамках данного набора данных оптимальное кол-во эпох 3000 с patience 300 эпох
4) Оптимальная ошибка MSE-stop в районе 0.01, желательно не меньше для предотвращения переобучения
5) Значение порога в районе 0.45
6) Значение Excess не больше 0.75, значение Deficit равное 0, значение Coating равное 1, значение Approx не меньше 0.58
## Задание 2
### 1) Изучить описание своего набора реальных данных, что он из себя представляет
Бригада 6 => набор данных Cardio. Это реальный набор данных, который состоит из измерений частоты сердечных сокращений плода и
сокращений матки на кардиотокограммах, классифицированных экспертами
акушерами. Исходный набор данных предназначен для классификации. В нем
представлено 3 класса: «норма», «подозрение» и «патология». Для обнаружения
аномалий класс «норма» принимается за норму, класс «патология» принимается за
аномалии, а класс «подозрение» был отброшен.
| Количество<br>признаков | Количество<br>примеров | Количество<br>нормальных примеров | Количество<br>аномальных примеров |
|-------------------------:|-----------------------:|----------------------------------:|-----------------------------------:|
| 21 | 1764 | 1655 | 109 |
### 2) Загрузить многомерную обучающую выборку реальных данных Cardio.txt.
```python
# загрузка обчуающей выборки
train = np.loadtxt('cardio_train.txt', dtype=float)
```
### 3) Вывести полученные данные и их размерность в консоли.
```python
print('train:\n', train)
print('train.shape:', np.shape(train))
```
```output
train:
[[ 0.00491231 0.69319077 -0.20364049 ... 0.23149795 -0.28978574
-0.49329397]
[ 0.11072935 -0.07990259 -0.20364049 ... 0.09356344 -0.25638541
-0.49329397]
[ 0.21654639 -0.27244466 -0.20364049 ... 0.02459619 -0.25638541
1.1400175 ]
...
[ 0.85144861 -0.91998844 -0.20364049 ... 0.57633422 -0.65718941
1.1400175 ]
[ 0.85144861 -0.91998844 -0.20364049 ... 0.57633422 -0.62378908
-0.49329397]
[ 1.0630827 -0.51148142 -0.16958144 ... 0.57633422 -0.65718941
-0.49329397]]
train.shape: (1654, 21)
```
### 4) Создать и обучить автокодировщик с подходящей для данных архитектурой. Выбрать необходимое количество эпох обучения.
```python
# **kwargs
# verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000)
# early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01)
# early_stopping_value = значение для ранней остановки (по умолчанию - 0.0001)
from time import time
patience = 4000
start = time()
ae3_v1_trained, IRE3_v1, IREth3_v1 = lib.create_fit_save_ae(train,'out/AE3_V1.h5','out/AE3_v1_ire_th.txt',
100000, False, patience, early_stopping_delta = 0.001)
print("Время на обучение: ", time() - start)
```
```output
Время на обучение: 1232.8548789024353
```
### 5) Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий.
Скрытых слоев 7, нейроны: 46->26->14->10->14->26->48
Ошибка MSE_AE3_v1 = 0.0137
```python
lib.ire_plot('training', IRE3_v1, IREth3_v1, 'AE3_v1')
```
![o](images/14.png)
### 6) Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6).
```python
# **kwargs
# verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000)
# early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01)
# early_stopping_value = значение для ранней остановки (по умолчанию - 0.0001)
from time import time
patience = 4000
start = time()
ae3_v2_trained, IRE3_v2, IREth3_v2 = lib.create_fit_save_ae(train,'out/AE3_V2.h5','out/AE3_v2_ire_th.txt',
100000, False, patience, early_stopping_delta = 0.001)
print("Время на обучение: ", time() - start)
```
```output
Время на обучение: 1298.1322848796844
```
Скрытых слоев 11, нейроны: 48->36->28->22->16->12->16->22->28->36->48
Ошибка MSE_AE3_v1 = 0.0077
```python
# Построение графика ошибки реконструкции
lib.ire_plot('training', IRE3_v2, IREth3_v2, 'AE3_v2')
```
![o](images/15.png)
### 7) Изучить и загрузить тестовую выборку Cardio.txt.
```python
#загрузка тестовой выборки
test = np.loadtxt('cardio_test.txt', dtype=float)
print('\n test:\n', test)
print('test.shape:', np.shape(test))
```
```output
test:
[[ 0.21654639 -0.65465178 -0.20364049 ... -2.0444214 4.987467
-0.49329397]
[ 0.21654639 -0.5653379 -0.20364049 ... -2.1133887 6.490482
-0.49329397]
[-0.3125388 -0.91998844 6.9653692 ... -1.1478471 3.9186563
-0.49329397]
...
[-0.41835583 -0.91998844 -0.16463485 ... -1.4926834 0.24461959
-0.49329397]
[-0.41835583 -0.91998844 -0.15093411 ... -1.4237162 0.14441859
-0.49329397]
[-0.41835583 -0.91998844 -0.20364049 ... -1.2857816 3.5846529
-0.49329397]]
test.shape: (109, 21)
```
### 8) Подать тестовую выборку на вход обученного автокодировщика для обнаружения аномалий. Вывести график ошибки реконструкции элементов тестовой выборки относительно порога.
```python
# тестирование АE3
predicted_labels3_v1, ire3_v1 = lib.predict_ae(ae3_v1_trained, test, IREth3_v1)
```
```python
# Построение графика ошибки реконструкции
lib.ire_plot('test', ire3_v1, IREth3_v1, 'AE3_v1')
```
![o](images/16.png)
```python
# тестирование АE3
predicted_labels3_v2, ire3_v2 = lib.predict_ae(ae3_v2_trained, test, IREth3_v2)
```
```python
# Построение графика ошибки реконструкции
lib.ire_plot('test', ire3_v2, IREth3_v2, 'AE3_v2')
```
![o](images/17.png)
```python
# тестирование АE1
lib.anomaly_detection_ae(predicted_labels3_v1, IRE3_v1, IREth3_v1)
```
```output
i Labels IRE IREth
0 [1.] 0.62 1.82
1 [1.] 0.81 1.82
2 [1.] 0.68 1.82
3 [1.] 0.68 1.82
4 [1.] 1.14 1.82
5 [1.] 0.64 1.82
6 [1.] 0.84 1.82
7 [1.] 0.87 1.82
8 [1.] 0.51 1.82
9 [1.] 0.46 1.82
10 [1.] 0.5 1.82
11 [1.] 0.67 1.82
12 [1.] 0.74 1.82
13 [1.] 0.9 1.82
14 [1.] 0.66 1.82
15 [1.] 1.33 1.82
16 [1.] 0.66 1.82
17 [1.] 0.5 1.82
18 [1.] 0.64 1.82
19 [1.] 0.5 1.82
20 [1.] 0.4 1.82
21 [1.] 0.49 1.82
22 [1.] 0.43 1.82
23 [1.] 0.61 1.82
24 [1.] 0.43 1.82
25 [1.] 0.98 1.82
26 [1.] 0.49 1.82
27 [1.] 0.92 1.82
28 [1.] 0.91 1.82
29 [0.] 0.41 1.82
30 [1.] 0.55 1.82
31 [1.] 0.55 1.82
32 [1.] 0.58 1.82
33 [1.] 0.39 1.82
34 [1.] 0.73 1.82
35 [1.] 0.4 1.82
36 [1.] 0.22 1.82
37 [1.] 0.62 1.82
38 [0.] 0.36 1.82
39 [0.] 0.31 1.82
40 [0.] 0.38 1.82
41 [0.] 0.5 1.82
42 [1.] 0.84 1.82
43 [1.] 0.38 1.82
44 [1.] 1.03 1.82
45 [1.] 0.3 1.82
46 [1.] 0.3 1.82
47 [1.] 0.8 1.82
48 [0.] 0.67 1.82
49 [1.] 0.6 1.82
50 [1.] 0.59 1.82
51 [1.] 0.66 1.82
52 [1.] 0.71 1.82
53 [1.] 0.48 1.82
54 [0.] 0.25 1.82
55 [1.] 0.95 1.82
56 [1.] 0.33 1.82
57 [1.] 0.6 1.82
58 [1.] 0.6 1.82
59 [1.] 0.71 1.82
60 [1.] 0.39 1.82
61 [0.] 0.33 1.82
62 [0.] 0.57 1.82
63 [0.] 0.93 1.82
64 [0.] 0.78 1.82
65 [0.] 0.4 1.82
66 [1.] 0.44 1.82
67 [1.] 0.71 1.82
68 [1.] 0.57 1.82
69 [1.] 0.32 1.82
70 [1.] 0.27 1.82
71 [1.] 0.47 1.82
72 [1.] 0.62 1.82
73 [1.] 0.46 1.82
74 [1.] 0.61 1.82
75 [1.] 1.2 1.82
76 [1.] 0.38 1.82
77 [1.] 1.46 1.82
78 [1.] 0.58 1.82
79 [1.] 0.92 1.82
80 [1.] 0.51 1.82
81 [1.] 0.9 1.82
82 [1.] 0.99 1.82
83 [1.] 0.56 1.82
84 [1.] 0.55 1.82
85 [1.] 0.58 1.82
86 [1.] 0.76 1.82
87 [1.] 0.65 1.82
88 [1.] 0.34 1.82
89 [1.] 0.98 1.82
90 [1.] 0.52 1.82
91 [1.] 0.22 1.82
92 [1.] 0.57 1.82
93 [1.] 0.46 1.82
94 [1.] 0.29 1.82
95 [1.] 0.37 1.82
96 [1.] 0.38 1.82
97 [1.] 0.51 1.82
98 [1.] 0.54 1.82
99 [1.] 0.61 1.82
100 [1.] 0.47 1.82
101 [1.] 0.57 1.82
102 [1.] 0.48 1.82
103 [1.] 0.46 1.82
104 [1.] 0.45 1.82
105 [1.] 0.43 1.82
106 [1.] 0.19 1.82
107 [1.] 0.24 1.82
108 [1.] 0.71 1.82
Обнаружено 97.0 аномалий
```
Для AE3_v1 точность составляет 92%
```python
# тестирование АE2
lib.anomaly_detection_ae(predicted_labels3_v2, IRE3_v2, IREth3_v2)
```
```output
i Labels IRE IREth
0 [1.] 0.37 1.15
1 [1.] 0.43 1.15
2 [1.] 0.36 1.15
3 [1.] 0.57 1.15
4 [1.] 1.03 1.15
5 [1.] 0.37 1.15
6 [1.] 0.56 1.15
7 [1.] 0.6 1.15
8 [1.] 0.5 1.15
9 [1.] 0.5 1.15
10 [1.] 0.28 1.15
11 [1.] 0.57 1.15
12 [1.] 0.69 1.15
13 [1.] 0.54 1.15
14 [1.] 0.89 1.15
15 [1.] 0.48 1.15
16 [1.] 0.4 1.15
17 [1.] 0.48 1.15
18 [1.] 0.37 1.15
19 [1.] 0.18 1.15
20 [1.] 0.48 1.15
21 [1.] 0.31 1.15
22 [1.] 0.39 1.15
23 [1.] 0.52 1.15
24 [1.] 0.35 1.15
25 [1.] 0.62 1.15
26 [1.] 0.28 1.15
27 [1.] 0.44 1.15
28 [1.] 0.53 1.15
29 [0.] 0.38 1.15
30 [1.] 0.24 1.15
31 [1.] 0.6 1.15
32 [1.] 0.25 1.15
33 [1.] 0.18 1.15
34 [1.] 0.47 1.15
35 [1.] 0.25 1.15
36 [1.] 0.13 1.15
37 [1.] 0.38 1.15
38 [0.] 0.21 1.15
39 [0.] 0.21 1.15
40 [0.] 0.28 1.15
41 [1.] 0.51 1.15
42 [1.] 0.67 1.15
43 [1.] 0.2 1.15
44 [1.] 0.67 1.15
45 [1.] 0.31 1.15
46 [1.] 0.31 1.15
47 [1.] 0.25 1.15
48 [1.] 0.25 1.15
49 [1.] 0.29 1.15
50 [1.] 0.28 1.15
51 [1.] 0.31 1.15
52 [1.] 0.41 1.15
53 [1.] 0.35 1.15
54 [0.] 0.19 1.15
55 [1.] 0.43 1.15
56 [1.] 0.25 1.15
57 [1.] 0.52 1.15
58 [1.] 0.61 1.15
59 [1.] 0.49 1.15
60 [1.] 0.39 1.15
61 [0.] 0.31 1.15
62 [0.] 0.42 1.15
63 [0.] 0.47 1.15
64 [0.] 0.57 1.15
65 [0.] 0.21 1.15
66 [1.] 0.37 1.15
67 [1.] 0.58 1.15
68 [1.] 0.19 1.15
69 [1.] 0.34 1.15
70 [1.] 0.18 1.15
71 [1.] 0.26 1.15
72 [1.] 0.3 1.15
73 [1.] 0.3 1.15
74 [1.] 0.51 1.15
75 [1.] 0.51 1.15
76 [1.] 0.22 1.15
77 [1.] 1.05 1.15
78 [1.] 0.36 1.15
79 [1.] 0.81 1.15
80 [1.] 0.38 1.15
81 [1.] 0.56 1.15
82 [1.] 0.55 1.15
83 [1.] 0.3 1.15
84 [1.] 0.44 1.15
85 [1.] 0.37 1.15
86 [1.] 0.43 1.15
87 [1.] 0.39 1.15
88 [1.] 0.27 1.15
89 [1.] 0.74 1.15
90 [1.] 0.44 1.15
91 [1.] 0.2 1.15
92 [1.] 0.45 1.15
93 [1.] 0.24 1.15
94 [1.] 0.25 1.15
95 [1.] 0.41 1.15
96 [1.] 0.43 1.15
97 [1.] 0.35 1.15
98 [1.] 0.41 1.15
99 [1.] 0.42 1.15
100 [1.] 0.5 1.15
101 [1.] 0.42 1.15
102 [1.] 0.47 1.15
103 [1.] 0.49 1.15
104 [1.] 0.29 1.15
105 [1.] 0.14 1.15
106 [1.] 0.16 1.15
107 [1.] 0.13 1.15
108 [1.] 0.73 1.15
Обнаружено 99.0 аномалий
```
Для AE3_v2 точность составляет 92%
### 9) Если результаты обнаружения аномалий не удовлетворительные (обнаружено менее 70% аномалий), то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (9)
Результаты обнаружения аномалий удовлетворены.
### 10) Параметры наилучшего автокодировщика и результаты обнаружения аномалий занести в таблицу:
Табл. 2 Результаты задания №2
| Dataset name | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | % обнаруженных<br>аномалий |
|:-------------|:-----------------------------|:----------------------------------------|:-----------------------------|:-------------------|:-------------------------------|:---------------------------|
| Cardio | 11 | 48, 36, 28, 22, 16, 10, 16, 22, 28, 36, 48 | 100000 | 0.0077 | 1 | 99% |
### 11) Сделать выводы о требованиях к:
- данным для обучения,
- архитектуре автокодировщика,
- количеству эпох обучения,
- ошибке MSE_stop, приемлемой для останова обучения,
- ошибке реконструкции обучающей выборки (порогу обнаружения
аномалий)
для качественного обнаружения аномалий в случае, когда размерность
пространства признаков высока.
1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение
2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 7-11.
3) В рамках данного набора данных оптимальное кол-во эпох 100000 с patience 4000 эпох
4) Оптимальная ошибка MSE-stop в районе 0.001, желательно не меньше для предотвращения переобучения
5) Значение порога 1 - идеальное