# Отчёт по лабораторной работе №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 | | Количество
скрытых слоев | Количество
нейронов в скрытых слоях | Количество
эпох обучения | Ошибка
MSE_stop | Порог ошибки
реконструкции | Значение показателя
Excess | Значение показателя
Approx | Количество обнаруженных
аномалий | |-----:|------------------------------|----------------------------------------|-----------------------------|--------------------|-------------------------------|-------------------------------|--------------------------------|-------------------------------------| | 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 класса: «норма», «подозрение» и «патология». Для обнаружения аномалий класс «норма» принимается за норму, класс «патология» принимается за аномалии, а класс «подозрение» был отброшен. | Количество
признаков | Количество
примеров | Количество
нормальных примеров | Количество
аномальных примеров | |-------------------------:|-----------------------:|----------------------------------:|-----------------------------------:| | 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 | Количество
скрытых слоев | Количество
нейронов в скрытых слоях | Количество
эпох обучения | Ошибка
MSE_stop | Порог ошибки
реконструкции | % обнаруженных
аномалий | |:-------------|:-----------------------------|:----------------------------------------|:-----------------------------|:-------------------|:-------------------------------|:---------------------------| | 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 - идеальное