@ -0,0 +1,6 @@
|
||||
5.528552372507079760e+00 5.559228990189748920e+00
|
||||
5.648388730839360328e+00 5.694735265167601135e+00
|
||||
6.034000861003956828e+00 6.014071576183726897e+00
|
||||
6.514146742942168800e+00 6.578190189984116643e+00
|
||||
6.639221608726088597e+00 6.634545308633034288e+00
|
||||
|
||||
|
После Ширина: | Высота: | Размер: 42 KiB |
|
После Ширина: | Высота: | Размер: 22 KiB |
|
После Ширина: | Высота: | Размер: 24 KiB |
|
После Ширина: | Высота: | Размер: 29 KiB |
|
После Ширина: | Высота: | Размер: 22 KiB |
|
После Ширина: | Высота: | Размер: 48 KiB |
|
После Ширина: | Высота: | Размер: 107 KiB |
|
После Ширина: | Высота: | Размер: 32 KiB |
|
После Ширина: | Высота: | Размер: 84 KiB |
|
После Ширина: | Высота: | Размер: 96 KiB |
|
После Ширина: | Высота: | Размер: 30 KiB |
|
После Ширина: | Высота: | Размер: 61 KiB |
|
После Ширина: | Высота: | Размер: 73 KiB |
|
После Ширина: | Высота: | Размер: 94 KiB |
|
После Ширина: | Высота: | Размер: 87 KiB |
|
После Ширина: | Высота: | Размер: 52 KiB |
|
После Ширина: | Высота: | Размер: 55 KiB |
@ -0,0 +1,871 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "1c1905f6-acba-4dba-aba9-4d2fe59298df",
|
||||
"metadata": {
|
||||
"id": "1c1905f6-acba-4dba-aba9-4d2fe59298df"
|
||||
},
|
||||
"source": [
|
||||
"## Задание 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "61f467d3-d1c1-481a-8560-f259a22e0824",
|
||||
"metadata": {
|
||||
"id": "61f467d3-d1c1-481a-8560-f259a22e0824"
|
||||
},
|
||||
"source": [
|
||||
"### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "58e787ca-562f-458d-8c62-e86b6fb1580a",
|
||||
"metadata": {
|
||||
"id": "58e787ca-562f-458d-8c62-e86b6fb1580a"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# импорт модулей\n",
|
||||
"import os\n",
|
||||
"os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2')\n",
|
||||
"\n",
|
||||
"import numpy as np\n",
|
||||
"import lab02_lib as lib"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5bbb8290-8806-4184-b33b-f1b0680bf563",
|
||||
"metadata": {
|
||||
"id": "5bbb8290-8806-4184-b33b-f1b0680bf563"
|
||||
},
|
||||
"source": [
|
||||
"### 2) Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (6, 6), где 6 – номер бригады. Вывели полученные данные на рисунок и в консоль."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "29603d03-8478-4341-b7ad-bb608ad88890",
|
||||
"metadata": {
|
||||
"id": "29603d03-8478-4341-b7ad-bb608ad88890"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# генерация датасета\n",
|
||||
"data = lib.datagen(6, 6, 1000, 2)\n",
|
||||
"\n",
|
||||
"# вывод данных и размерности\n",
|
||||
"print('Исходные данные:')\n",
|
||||
"print(data)\n",
|
||||
"print('Размерность данных:')\n",
|
||||
"print(data.shape)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "00ba79e5-d8f9-4c40-a065-e8fd21a68e21",
|
||||
"metadata": {
|
||||
"id": "00ba79e5-d8f9-4c40-a065-e8fd21a68e21"
|
||||
},
|
||||
"source": [
|
||||
"### 3) Создали и обучили автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения. Зафиксировали в таблице вида табл.1 количество скрытых слоёв и нейронов в них"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "bc736f50-204b-4b1d-8c1c-0dd34fb1f02b",
|
||||
"metadata": {
|
||||
"id": "bc736f50-204b-4b1d-8c1c-0dd34fb1f02b"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# обучение AE1\n",
|
||||
"patience = 300\n",
|
||||
"ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(data,'out/AE1.h5','out/AE1_ire_th.txt',\n",
|
||||
"1000, True, patience)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "ae9e6816-d300-455a-a4ee-77e4911e02f5",
|
||||
"metadata": {
|
||||
"id": "ae9e6816-d300-455a-a4ee-77e4911e02f5"
|
||||
},
|
||||
"source": [
|
||||
"### 4) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Ошибка MSE_AE1 = 19.5568"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Np8zquNSgtO9"
|
||||
},
|
||||
"id": "Np8zquNSgtO9"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "fb7eeae8-f478-4295-b6de-b5790b7861f2",
|
||||
"metadata": {
|
||||
"id": "fb7eeae8-f478-4295-b6de-b5790b7861f2"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Построение графика ошибки реконструкции\n",
|
||||
"lib.ire_plot('training', IRE1, IREth1, 'AE1')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "92fb420f-907e-4417-ab34-6d12308bed0b",
|
||||
"metadata": {
|
||||
"id": "92fb420f-907e-4417-ab34-6d12308bed0b"
|
||||
},
|
||||
"source": [
|
||||
"### 5) Создали и обучили второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "bb9f83e2-fecf-4118-8376-a712726d12d5",
|
||||
"metadata": {
|
||||
"id": "bb9f83e2-fecf-4118-8376-a712726d12d5"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# обучение AE2\n",
|
||||
"ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(data,'out/AE2.h5','out/AE2_ire_th.txt',\n",
|
||||
"3000, True, patience)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "03194c1b-c03e-42a5-93e5-f4d007ddb7c7",
|
||||
"metadata": {
|
||||
"id": "03194c1b-c03e-42a5-93e5-f4d007ddb7c7"
|
||||
},
|
||||
"source": [
|
||||
"### 6) Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали второй порог ошибки реконструкции – порог обнаружения аномалий."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Ошибка MSE_AE2 = 0.0108"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "6TBPoMskhCQp"
|
||||
},
|
||||
"id": "6TBPoMskhCQp"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "47cf147a-f97b-41d3-9d7c-b799da0115fe",
|
||||
"metadata": {
|
||||
"id": "47cf147a-f97b-41d3-9d7c-b799da0115fe"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Построение графика ошибки реконструкции\n",
|
||||
"lib.ire_plot('training', IRE2, IREth2, 'AE2')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "fd14d331-aad6-4b98-9926-5ab6a055beb0",
|
||||
"metadata": {
|
||||
"id": "fd14d331-aad6-4b98-9926-5ab6a055beb0"
|
||||
},
|
||||
"source": [
|
||||
"### 7) Рассчитали характеристики качества обучения EDCA для AE1 и AE2. Визуализировали и сравнили области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Сделали вывод о пригодности AE1 и AE2 для качественного обнаружения аномалий.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "58fd0b46-1064-4f2f-b04f-88307bf938d2",
|
||||
"metadata": {
|
||||
"id": "58fd0b46-1064-4f2f-b04f-88307bf938d2"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# построение областей покрытия и границ классов\n",
|
||||
"# расчет характеристик качества обучения\n",
|
||||
"numb_square = 20\n",
|
||||
"xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# построение областей покрытия и границ классов\n",
|
||||
"# расчет характеристик качества обучения\n",
|
||||
"numb_square = 20\n",
|
||||
"xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "ZG72thVfYMOy"
|
||||
},
|
||||
"id": "ZG72thVfYMOy",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# сравнение характеристик качества обучения и областей аппроксимации\n",
|
||||
"lib.plot2in1(data, xx, yy, Z1, Z2)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "RJWYYYHQbUIN"
|
||||
},
|
||||
"id": "RJWYYYHQbUIN",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d766b8f0-3ba7-4a73-94a0-7858eb2f5515",
|
||||
"metadata": {
|
||||
"id": "d766b8f0-3ba7-4a73-94a0-7858eb2f5515"
|
||||
},
|
||||
"source": [
|
||||
"### 8) Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Полученные показатели EDCA для автокодировщика AE2 нас устраивают."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "XbnbvTima5dv"
|
||||
},
|
||||
"id": "XbnbvTima5dv"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "cfa38b82-4c8e-4437-9c25-581d7fea0f2c",
|
||||
"metadata": {
|
||||
"id": "cfa38b82-4c8e-4437-9c25-581d7fea0f2c"
|
||||
},
|
||||
"source": [
|
||||
"### 9) Изучили сохраненный набор данных и пространство признаков. Создали тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d618382f-f65a-4c17-b0d0-3d2d0c4bc50e",
|
||||
"metadata": {
|
||||
"id": "d618382f-f65a-4c17-b0d0-3d2d0c4bc50e"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# загрузка тестового набора\n",
|
||||
"data_test = np.loadtxt('data_test.txt', dtype=float)\n",
|
||||
"print(data_test)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 10) Применили обученные автокодировщики AE1 и AE2 к тестовым данным и вывели значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "3Ce8wSVMdjBj"
|
||||
},
|
||||
"id": "3Ce8wSVMdjBj"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE1\n",
|
||||
"predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Hq8A0LyMcKXk"
|
||||
},
|
||||
"id": "Hq8A0LyMcKXk",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE1\n",
|
||||
"lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1)\n",
|
||||
"lib.ire_plot('test', ire1, IREth1, 'AE1')"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Z_v2X4HvcQD5"
|
||||
},
|
||||
"id": "Z_v2X4HvcQD5",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE2\n",
|
||||
"predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "fT75bpEnc7a2"
|
||||
},
|
||||
"id": "fT75bpEnc7a2",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE2\n",
|
||||
"lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2)\n",
|
||||
"lib.ire_plot('test', ire2, IREth2, 'AE2')"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "EpGtgYZVdAen"
|
||||
},
|
||||
"id": "EpGtgYZVdAen",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7acf3a7f-4dd8-44df-b201-509aa4caa7f0",
|
||||
"metadata": {
|
||||
"id": "7acf3a7f-4dd8-44df-b201-509aa4caa7f0"
|
||||
},
|
||||
"source": [
|
||||
"### 11) Визуализировали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "a2fbf3a9-5e11-49d0-a0db-f77f3edeb7b7",
|
||||
"metadata": {
|
||||
"id": "a2fbf3a9-5e11-49d0-a0db-f77f3edeb7b7"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# построение областей аппроксимации и точек тестового набора\n",
|
||||
"lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bd63edf4-3452-41db-8080-d8a2ff4f09a4",
|
||||
"metadata": {
|
||||
"id": "bd63edf4-3452-41db-8080-d8a2ff4f09a4"
|
||||
},
|
||||
"source": [
|
||||
"### 12) Результаты исследования занесли в таблицу:\n",
|
||||
"Табл. 1 Результаты задания №1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"| | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | Значение показателя<br>Excess | Значение показателя<br>Approx | Количество обнаруженных<br>аномалий |\n",
|
||||
"|-----:|------------------------------|----------------------------------------|-----------------------------|--------------------|-------------------------------|-------------------------------|--------------------------------|-------------------------------------|\n",
|
||||
"| AE1 | 1 | 1 | 1000 | 19.5568 | 6.53 | 12.67 | 0.073 | 0 |\n",
|
||||
"| AE2 | 5 | 3,2,1,2,3 | 3000 | 0.0108 | 0.4 | 0.33 | 0.750 | 4 |\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "df2BIryKfkpk"
|
||||
},
|
||||
"id": "df2BIryKfkpk"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b8e54861-e2c2-4755-a2d8-5d4b6cace481",
|
||||
"metadata": {
|
||||
"id": "b8e54861-e2c2-4755-a2d8-5d4b6cace481"
|
||||
},
|
||||
"source": [
|
||||
"### 13) Сделали выводы о требованиях к:\n",
|
||||
"- данным для обучения,\n",
|
||||
"- архитектуре автокодировщика,\n",
|
||||
"- количеству эпох обучения,\n",
|
||||
"- ошибке MSE_stop, приемлемой для останова обучения,\n",
|
||||
"- ошибке реконструкции обучающей выборки (порогу обнаружения\n",
|
||||
"аномалий),\n",
|
||||
"- характеристикам качества обучения EDCA одноклассового\n",
|
||||
"классификатора\n",
|
||||
"\n",
|
||||
"для качественного обнаружения аномалий в данных."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение\n",
|
||||
"2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 3-5\n",
|
||||
"3) В рамках данного набора данных оптимальное кол-во эпох 3000 с patience 300 эпох\n",
|
||||
"4) Оптимальная ошибка MSE-stop в районе 0.01, желательно не меньше для предотвращения переобучения\n",
|
||||
"5) Значение порога в районе 0.4\n",
|
||||
"6) Значение Excess не больше 0.5, значение Deficit равное 0, значение Coating равное 1, значение Approx не меньше 0.7"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "1s5_ye8vkleI"
|
||||
},
|
||||
"id": "1s5_ye8vkleI"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"## Задание 2"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "rqdVflKXo6Bo"
|
||||
},
|
||||
"id": "rqdVflKXo6Bo"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 1) Изучить описание своего набора реальных данных, что он из себя представляет"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "rSvJtTReo928"
|
||||
},
|
||||
"id": "rSvJtTReo928"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Бригада 6 => набор данных Cardio. Это реальный набор данных, который состоит из измерений частоты сердечных сокращений плода и\n",
|
||||
"сокращений матки на кардиотокограммах, классифицированных экспертами\n",
|
||||
"акушерами. Исходный набор данных предназначен для классификации. В нем\n",
|
||||
"представлено 3 класса: «норма», «подозрение» и «патология». Для обнаружения\n",
|
||||
"аномалий класс «норма» принимается за норму, класс «патология» принимается за\n",
|
||||
"аномалии, а класс «подозрение» был отброшен.\n",
|
||||
"\n",
|
||||
"| Количество<br>признаков | Количество<br>примеров | Количество<br>нормальных примеров | Количество<br>аномальных примеров |\n",
|
||||
"|-------------------------:|-----------------------:|----------------------------------:|-----------------------------------:|\n",
|
||||
"| 21 | 1764 | 1655 | 109 |\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "gf-0gJ7jqTdk"
|
||||
},
|
||||
"id": "gf-0gJ7jqTdk"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 2) Загрузить многомерную обучающую выборку реальных данных Cardio.txt."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "N2Egw1pho-F_"
|
||||
},
|
||||
"id": "N2Egw1pho-F_"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# загрузка обчуающей выборки\n",
|
||||
"train = np.loadtxt('data/cardio_train.txt', dtype=float)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "G8QTxAFapASY"
|
||||
},
|
||||
"id": "G8QTxAFapASY",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 3) Вывести полученные данные и их размерность в консоли."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "zj2WXPNco-Tz"
|
||||
},
|
||||
"id": "zj2WXPNco-Tz"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"print('train:\\n', train)\n",
|
||||
"print('train.shape:', np.shape(train))"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "W6hTlfk6pAo9"
|
||||
},
|
||||
"id": "W6hTlfk6pAo9",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 4) Создать и обучить автокодировщик с подходящей для данных архитектурой. Выбрать необходимое количество эпох обучения."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "0T11A0x4o-gr"
|
||||
},
|
||||
"id": "0T11A0x4o-gr"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# **kwargs\n",
|
||||
"# verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000)\n",
|
||||
"# early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01)\n",
|
||||
"# early_stopping_value = значение для ранней остановки (по умолчанию - 0.0001)\n",
|
||||
"\n",
|
||||
"from time import time\n",
|
||||
"\n",
|
||||
"patience = 4000\n",
|
||||
"start = time()\n",
|
||||
"ae3_v1_trained, IRE3_v1, IREth3_v1 = lib.create_fit_save_ae(train,'out/AE3_V1.h5','out/AE3_v1_ire_th.txt',\n",
|
||||
"100000, False, patience, early_stopping_delta = 0.001)\n",
|
||||
"print(\"Время на обучение: \", time() - start)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "rPwtBtdRPztp"
|
||||
},
|
||||
"id": "rPwtBtdRPztp",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 5) Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "8ALjaY8lo-sa"
|
||||
},
|
||||
"id": "8ALjaY8lo-sa"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Скрытых слоев 7, нейроны: 46->26->14->10->14->26->48\n",
|
||||
"\n",
|
||||
"Ошибка MSE_AE3_v1 = 0.0126"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "b4sk_fhYY6Qb"
|
||||
},
|
||||
"id": "b4sk_fhYY6Qb"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# Построение графика ошибки реконструкции\n",
|
||||
"lib.ire_plot('training', IRE3_v1, IREth3_v1, 'AE3_v1')"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "a4sR3SSDpBPU"
|
||||
},
|
||||
"id": "a4sR3SSDpBPU",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 6) Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6)."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "DGBM9xNFo-4k"
|
||||
},
|
||||
"id": "DGBM9xNFo-4k"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# **kwargs\n",
|
||||
"# verbose_every_n_epochs - отображать прогресс каждые N эпох (по умолчанию - 1000)\n",
|
||||
"# early_stopping_delta - дельта для ранней остановки (по умолчанию - 0.01)\n",
|
||||
"# early_stopping_value = значение для ранней остановки (по умолчанию - 0.0001)\n",
|
||||
"\n",
|
||||
"from time import time\n",
|
||||
"\n",
|
||||
"patience = 4000\n",
|
||||
"start = time()\n",
|
||||
"ae3_v2_trained, IRE3_v2, IREth3_v2 = lib.create_fit_save_ae(train,'out/AE3_V2.h5','out/AE3_v2_ire_th.txt',\n",
|
||||
"100000, False, patience, early_stopping_delta = 0.001)\n",
|
||||
"print(\"Время на обучение: \", time() - start)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "ZvM1VbKEgalO"
|
||||
},
|
||||
"id": "ZvM1VbKEgalO",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Скрытых слоев 7, нейроны: 48->36->28->22->16->12->16->22->28->36->48\n",
|
||||
"\n",
|
||||
"Ошибка MSE_AE3_v1 = 0.0098"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "9BrPUb_8fX5R"
|
||||
},
|
||||
"id": "9BrPUb_8fX5R"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# Построение графика ошибки реконструкции\n",
|
||||
"lib.ire_plot('training', IRE3_v2, IREth3_v2, 'AE3_v2')"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "kh1eMtvpf6F-"
|
||||
},
|
||||
"id": "kh1eMtvpf6F-",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 7) Изучить и загрузить тестовую выборку Cardio.txt."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "vJvW1mOtpgFO"
|
||||
},
|
||||
"id": "vJvW1mOtpgFO"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"#загрузка тестовой выборки\n",
|
||||
"test = np.loadtxt('data/cardio_test.txt', dtype=float)\n",
|
||||
"print('\\n test:\\n', test)\n",
|
||||
"print('test.shape:', np.shape(test))"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "GrXQ5YymtD2u"
|
||||
},
|
||||
"id": "GrXQ5YymtD2u",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 8) Подать тестовую выборку на вход обученного автокодировщика для обнаружения аномалий. Вывести график ошибки реконструкции элементов тестовой выборки относительно порога."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "6iqO4Yxbpgob"
|
||||
},
|
||||
"id": "6iqO4Yxbpgob"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE3\n",
|
||||
"predicted_labels3_v1, ire3_v1 = lib.predict_ae(ae3_v1_trained, test, IREth3_v1)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Vxj1fTAikDuU"
|
||||
},
|
||||
"id": "Vxj1fTAikDuU",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# Построение графика ошибки реконструкции\n",
|
||||
"lib.ire_plot('test', ire3_v1, IREth3_v1, 'AE3_v1')"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "21DdnIKYtmtM"
|
||||
},
|
||||
"id": "21DdnIKYtmtM",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE3\n",
|
||||
"predicted_labels3_v2, ire3_v2 = lib.predict_ae(ae3_v2_trained, test, IREth3_v2)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "Ql1JMAM6sf7Z"
|
||||
},
|
||||
"id": "Ql1JMAM6sf7Z",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# Построение графика ошибки реконструкции\n",
|
||||
"lib.ire_plot('test', ire3_v2, IREth3_v2, 'AE3_v2')"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "jczBRWjTt35R"
|
||||
},
|
||||
"id": "jczBRWjTt35R",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE2\n",
|
||||
"lib.anomaly_detection_ae(predicted_labels3_v1, IRE3_v1, IREth3_v1)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "2kF1XknIpg48"
|
||||
},
|
||||
"id": "2kF1XknIpg48",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Для AE3_v1 точность составляет 88%"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "LXHt7-gxuJIy"
|
||||
},
|
||||
"id": "LXHt7-gxuJIy"
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"source": [
|
||||
"# тестирование АE2\n",
|
||||
"lib.anomaly_detection_ae(predicted_labels3_v2, IRE3_v2, IREth3_v2)"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "5ow1D88nsrir"
|
||||
},
|
||||
"id": "5ow1D88nsrir",
|
||||
"execution_count": null,
|
||||
"outputs": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Для AE3_v2 точность составляет 92%"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "LDsC5WyeuRHS"
|
||||
},
|
||||
"id": "LDsC5WyeuRHS"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 9) Если результаты обнаружения аномалий не удовлетворительные (обнаружено менее 70% аномалий), то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (9)."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "fPPbYwnQpqS3"
|
||||
},
|
||||
"id": "fPPbYwnQpqS3"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"Результаты обнаружения аномалий удовлетворены."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "IVmw2aeduXml"
|
||||
},
|
||||
"id": "IVmw2aeduXml"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 10) Параметры наилучшего автокодировщика и результаты обнаружения аномалий занести в таблицу:\n",
|
||||
"Табл. 2 Результаты задания №2"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "u3cAX_IgpvWU"
|
||||
},
|
||||
"id": "u3cAX_IgpvWU"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"| Dataset name | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | % обнаруженных<br>аномалий |\n",
|
||||
"|:-------------|:-----------------------------|:----------------------------------------|:-----------------------------|:-------------------|:-------------------------------|:---------------------------|\n",
|
||||
"| Cardio | 11 | 48, 36, 28, 22, 16, 10, 16, 22, 28, 36, 48 | 100000 | 0.0098 | 1.6 | 92% |\n"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "tryfJdjTvgU8"
|
||||
},
|
||||
"id": "tryfJdjTvgU8"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"### 11) Сделать выводы о требованиях к:\n",
|
||||
"- данным для обучения,\n",
|
||||
"- архитектуре автокодировщика, \n",
|
||||
"- количеству эпох обучения,\n",
|
||||
"- ошибке MSE_stop, приемлемой для останова обучения,\n",
|
||||
"- ошибке реконструкции обучающей выборки (порогу обнаружения\n",
|
||||
"аномалий)\n",
|
||||
"\n",
|
||||
"для качественного обнаружения аномалий в случае, когда размерность\n",
|
||||
"пространства признаков высока."
|
||||
],
|
||||
"metadata": {
|
||||
"id": "eE7IYyGJp0Vv"
|
||||
},
|
||||
"id": "eE7IYyGJp0Vv"
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"source": [
|
||||
"1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение\n",
|
||||
"2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 7-11.\n",
|
||||
"3) В рамках данного набора данных оптимальное кол-во эпох 100000 с patience 4000 эпох\n",
|
||||
"4) Оптимальная ошибка MSE-stop в районе 0.001, желательно не меньше для предотвращения переобучения\n",
|
||||
"5) Значение порога не больше 1.6"
|
||||
],
|
||||
"metadata": {
|
||||
"id": "67p7AeSWwVXE"
|
||||
},
|
||||
"id": "67p7AeSWwVXE"
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.12.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
5.95
|
||||
@ -0,0 +1 @@
|
||||
0.45
|
||||
|
После Ширина: | Высота: | Размер: 52 KiB |
|
После Ширина: | Высота: | Размер: 100 KiB |
|
После Ширина: | Высота: | Размер: 44 KiB |
@ -0,0 +1,313 @@
|
||||
# Отчёт по лабораторной работе №2
|
||||
|
||||
**Кнзев Станислав, Жихарев Данила — А-02-22**
|
||||
|
||||
---
|
||||
## Задание 1
|
||||
|
||||
### 1) В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули.
|
||||
|
||||
```python
|
||||
# импорт модулей
|
||||
import os
|
||||
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2')
|
||||
|
||||
import numpy as np
|
||||
import lab02_lib as lib
|
||||
```
|
||||
|
||||
### 2) Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (6, 6), где 6 – номер бригады. Вывели полученные данные на рисунок и в консоль.
|
||||
|
||||
```python
|
||||
# генерация датасета
|
||||
data = lib.datagen(6, 6, 1000, 2)
|
||||
|
||||
# вывод данных и размерности
|
||||
print('Исходные данные:')
|
||||
print(data)
|
||||
print('Размерность данных:')
|
||||
print(data.shape)
|
||||
```
|
||||
|
||||
|
||||
### 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 = 19.5568
|
||||
|
||||
```python
|
||||
# Построение графика ошибки реконструкции
|
||||
lib.ire_plot('training', IRE1, IREth1, 'AE1')
|
||||
```
|
||||
|
||||
### 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.0108
|
||||
|
||||
```python
|
||||
# Построение графика ошибки реконструкции
|
||||
lib.ire_plot('training', IRE2, IREth2, 'AE2')
|
||||
```
|
||||
|
||||
### 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)
|
||||
```
|
||||
|
||||
```python
|
||||
# построение областей покрытия и границ классов
|
||||
# расчет характеристик качества обучения
|
||||
numb_square = 20
|
||||
xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)
|
||||
```
|
||||
|
||||
```python
|
||||
# сравнение характеристик качества обучения и областей аппроксимации
|
||||
lib.plot2in1(data, xx, yy, Z1, Z2)
|
||||
```
|
||||
|
||||
### 8) Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8).
|
||||
|
||||
Полученные показатели EDCA для автокодировщика AE2 нас устраивают.
|
||||
|
||||
### 9) Изучили сохраненный набор данных и пространство признаков. Создали тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии.
|
||||
|
||||
```python
|
||||
# загрузка тестового набора
|
||||
data_test = np.loadtxt('data_test.txt', dtype=float)
|
||||
print(data_test)
|
||||
```
|
||||
|
||||
### 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')
|
||||
```
|
||||
|
||||
```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')
|
||||
```
|
||||
|
||||
### 11) Визуализировали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2.
|
||||
|
||||
```python
|
||||
# построение областей аппроксимации и точек тестового набора
|
||||
lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)
|
||||
```
|
||||
|
||||
### 12) Результаты исследования занесли в таблицу:
|
||||
Табл. 1 Результаты задания №1
|
||||
|
||||
| | Количество<br>скрытых слоев | Количество<br>нейронов в скрытых слоях | Количество<br>эпох обучения | Ошибка<br>MSE_stop | Порог ошибки<br>реконструкции | Значение показателя<br>Excess | Значение показателя<br>Approx | Количество обнаруженных<br>аномалий |
|
||||
|-----:|------------------------------|----------------------------------------|-----------------------------|--------------------|-------------------------------|-------------------------------|--------------------------------|-------------------------------------|
|
||||
| AE1 | 1 | 1 | 1000 | 19.5568 | 6.53 | 12.67 | 0.073 | 0 |
|
||||
| AE2 | 5 | 3,2,1,2,3 | 3000 | 0.0108 | 0.4 | 0.33 | 0.750 | 4 |
|
||||
|
||||
### 13) Сделали выводы о требованиях к:
|
||||
- данным для обучения,
|
||||
- архитектуре автокодировщика,
|
||||
- количеству эпох обучения,
|
||||
- ошибке MSE_stop, приемлемой для останова обучения,
|
||||
- ошибке реконструкции обучающей выборки (порогу обнаружения
|
||||
аномалий),
|
||||
- характеристикам качества обучения EDCA одноклассового
|
||||
классификатора
|
||||
|
||||
для качественного обнаружения аномалий в данных.
|
||||
|
||||
1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение
|
||||
2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 3-5
|
||||
3) В рамках данного набора данных оптимальное кол-во эпох 3000 с patience 300 эпох
|
||||
4) Оптимальная ошибка MSE-stop в районе 0.01, желательно не меньше для предотвращения переобучения
|
||||
5) Значение порога в районе 0.4
|
||||
6) Значение Excess не больше 0.5, значение Deficit равное 0, значение Coating равное 1, значение Approx не меньше 0.7
|
||||
|
||||
## Задание 2
|
||||
|
||||
### 1) Изучить описание своего набора реальных данных, что он из себя представляет
|
||||
|
||||
Бригада 6 => набор данных Cardio. Это реальный набор данных, который состоит из измерений частоты сердечных сокращений плода и
|
||||
сокращений матки на кардиотокограммах, классифицированных экспертами
|
||||
акушерами. Исходный набор данных предназначен для классификации. В нем
|
||||
представлено 3 класса: «норма», «подозрение» и «патология». Для обнаружения
|
||||
аномалий класс «норма» принимается за норму, класс «патология» принимается за
|
||||
аномалии, а класс «подозрение» был отброшен.
|
||||
|
||||
| Количество<br>признаков | Количество<br>примеров | Количество<br>нормальных примеров | Количество<br>аномальных примеров |
|
||||
|-------------------------:|-----------------------:|----------------------------------:|-----------------------------------:|
|
||||
| 21 | 1764 | 1655 | 109 |
|
||||
|
||||
### 2) Загрузить многомерную обучающую выборку реальных данных Cardio.txt.
|
||||
|
||||
```python
|
||||
# загрузка обчуающей выборки
|
||||
train = np.loadtxt('data/cardio_train.txt', dtype=float)
|
||||
```
|
||||
|
||||
### 3) Вывести полученные данные и их размерность в консоли.
|
||||
|
||||
```python
|
||||
print('train:\n', train)
|
||||
print('train.shape:', np.shape(train))
|
||||
```
|
||||
|
||||
### 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)
|
||||
```
|
||||
|
||||
### 5) Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий.
|
||||
|
||||
Скрытых слоев 7, нейроны: 46->26->14->10->14->26->48
|
||||
|
||||
Ошибка MSE_AE3_v1 = 0.0126
|
||||
|
||||
```python
|
||||
# Построение графика ошибки реконструкции
|
||||
lib.ire_plot('training', IRE3_v1, IREth3_v1, 'AE3_v1')
|
||||
```
|
||||
|
||||
### 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)
|
||||
```
|
||||
|
||||
Скрытых слоев 7, нейроны: 48->36->28->22->16->12->16->22->28->36->48
|
||||
|
||||
Ошибка MSE_AE3_v1 = 0.0098
|
||||
|
||||
```python
|
||||
# Построение графика ошибки реконструкции
|
||||
lib.ire_plot('training', IRE3_v2, IREth3_v2, 'AE3_v2')
|
||||
```
|
||||
|
||||
### 7) Изучить и загрузить тестовую выборку Cardio.txt.
|
||||
|
||||
```python
|
||||
#загрузка тестовой выборки
|
||||
test = np.loadtxt('data/cardio_test.txt', dtype=float)
|
||||
print('\n test:\n', test)
|
||||
print('test.shape:', np.shape(test))
|
||||
```
|
||||
|
||||
### 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')
|
||||
```
|
||||
|
||||
```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')
|
||||
```
|
||||
|
||||
```python
|
||||
# тестирование АE2
|
||||
lib.anomaly_detection_ae(predicted_labels3_v1, IRE3_v1, IREth3_v1)
|
||||
```
|
||||
|
||||
Для AE3_v1 точность составляет 88%
|
||||
|
||||
```python
|
||||
# тестирование АE2
|
||||
lib.anomaly_detection_ae(predicted_labels3_v2, IRE3_v2, IREth3_v2)
|
||||
```
|
||||
|
||||
Для 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.0098 | 1.6 | 92% |
|
||||
|
||||
### 11) Сделать выводы о требованиях к:
|
||||
- данным для обучения,
|
||||
- архитектуре автокодировщика,
|
||||
- количеству эпох обучения,
|
||||
- ошибке MSE_stop, приемлемой для останова обучения,
|
||||
- ошибке реконструкции обучающей выборки (порогу обнаружения
|
||||
аномалий)
|
||||
|
||||
для качественного обнаружения аномалий в случае, когда размерность
|
||||
пространства признаков высока.
|
||||
|
||||
1) Данные для обучения должны быть без аномалий, чтобы автокодировщик смог рассчитать верное пороговое значение
|
||||
2) Архитектура автокодировщика должна постепенно сужатся к бутылочному горлышку,а затем постепенно возвращатся к исходным выходным размерам, кол-во скрытых слоев 7-11.
|
||||
3) В рамках данного набора данных оптимальное кол-во эпох 100000 с patience 4000 эпох
|
||||
4) Оптимальная ошибка MSE-stop в районе 0.001, желательно не меньше для предотвращения переобучения
|
||||
5) Значение порога не больше 1.6
|
||||