diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/IIS_2023_1.iml b/.idea/IIS_2023_1.iml new file mode 100644 index 0000000..4e6ce24 --- /dev/null +++ b/.idea/IIS_2023_1.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3c29c38 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..89e118a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..554ca30 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# IIS_2023_1 + +ПРАВИЛА ИГРЫ при сдаче лабораторных работ по предмету "Интеллектуальные информационные системы". + +Всем Доброго времени суток! Настоятельно прошу прочитать этот файл от начала и до конца. + +**Задание на л/р** + +0. Требования к языку программирования: python. +Для выполнения лабораторных работ можно использовать любую IDE или текстовый редактор. + +1. Файл с заданиями находится в корне проекта ([MetodichkaMII_MO.pdf](http://student.git.athene.tech/Alexey/IIS_2023_1/src/branch/main/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D0%B8%D1%87%D0%BA%D0%B0%D0%9C%D0%98%D0%98_%D0%9C%D0%9E-1.pdf)). + +2. Наши л/р показаны на [скриншоте](http://student.git.athene.tech/Alexey/IIS_2023_1/src/branch/main/labs.jpg). Или все 7 л/р по курсу "Машинное обучение". +Обратите внимание, что лабораторные работы 3-7 выполняются на варианте данных вашей курсовой работы (Массивы данныхдля лабораторныхработ). + +**Воркфлоу по сдаче лабораторных работ** + +0. Клонируем себе репозиторий на компьютер + +> git clone http://student.git.athene.tech/Alexey/IIS_2023_1.git + +1. Для выполнения очередной лабораторной работы необходимо завести отдельную ветку (перед этим необходимо выполнить команду git checkout master). Указанный формат наименования ветки <фамилия_имя_lab_номер_лабораторной> ОБЯЗАТЕЛЕН, в противном случае лабораторная работа не проверяется! + +> git checkout -b "zhelepov_alex_lab_1" + +При этом Вы окажетесь в своей ветке, в которой Вам и предстоит выполнять лабораторную работу. + +2. В ветке создаём папку в аналогичном формате <фамилия_имя_lab_номер_лабораторной>, формат также ОБЯЗАТЕЛЕН, в противном случае лабораторная работа не проверяется! + +> mkdir zhelepov_alex_lab_1 + +3. Весь код лабораторной работы и отчет должны находится внутри этой папки! То есть файловая структура репозитория должна иметь такой вид + +> ivanov_ivan_lab_1 zhelepov_alex_lab_1 README.md + +4. Отчет к лабораторной работе должен быть оформлен в виде файла readme.md, в котором Вы сможете дать краткое описание того, что делает Ваша программа. Очень хорошо (большой плюс при сдаче), если Вы опишите следующие пункты: +* как запустить лабораторную работу +* какие технологии использовали +* что она делает +* тесты, то есть несколько примеров входных и выходных значений + +Небольшой [гайд](https://guides.github.com/features/mastering-markdown/) по синтаксису для оформления отчёта. + +P.S. я знаю про хак "хочу скопировать у товарища этот волшебный readme и ничего не делать", но пожалуйста не делайте так (я буду обязательно проверять это) + +4. Как только Вы закончили работу над лабораторной работой, то находясь в своей ветке (убедитесь в этом пожалуйста, использую команду git branch - ваша текущая ветка будет подсвечена), вы должны закоммитить и запушить свои изменения в репозиторий, другими словами сохранить их в репозиторий. + +> git commit -m "zhelepov_alex_lab_1 is ready" +> git push origin + +P.S. я знаю про хак "скопируй у товарища и закоммить - все равно он (я) смотреть не будет" - не сработает - давайте быть честными и делать все самостоятельно. А во-вторых, на реальной работе так не прокатит - скорее всего Вас просто уволят. + +5. После этого Вы должны перейти в наш git и создать merge request, назначив его на меня. Дополнительно лучше маякнуть меня в нашем [телеграм-чате](https://t.me/+XSq2xEbEuD05N2Vi). Я проведу ревью и отпишу замечания, которые нужно будет исправить. Если все хорошо, то вмержу ваш pull-request в мастер-ветку. Данное состояние говорит о том, что ваша л/р принята. + +6. **Важный момент**: Устно я не принимаю лабораторные работы (подойти к компьютеру, посмотреть код, поставить оценку), только через репозиторий и после успешного code review ревью кода вашей л/р и ее результатов в виде отчета. Это делается для того, чтобы вы привыкали к воркфлоу, который применяется практически всеми IT-компаниями, где между разработчиками в основном общение идет через "текст". Что касается лабораторных работ в расписании - они используются в качестве консультаций, а сдача и проверка л/р идет только через репозиторий (то есть все замечания вы получаете на code review). Проверяю я обычно лабораторную в течение 1-3 дней после создания pull-request-а (всегда можно маякнуть меня в нашем telegram-чате). + +**Чек-лист для старост групп** + +0. Убедиться, что все из списка зашли в [телеграм-чат](https://t.me/+XSq2xEbEuD05N2Vi), где мы будем общаться + я буду публиковать различные объявления. ПОЖАЛУЙСТА, ОБРАТИТЕ НА ЭТО ВНИМАНИЕ и доведите до всех! В других каналах связя меня сложно выцепить или я могу пропустить сообщение. + +1. Убедиться, что все зарегистрировались на университетском [git](http://student.git.athene.tech/) и добавились для работы с нашим репозиторием. А добавляться в этот [репозиторий](http://student.git.athene.tech/Alexey/IIS_2023_1). + +**Полезные ссылки:** + +0. Отличный тьюториал по гиту (рекомендую всем его пройти), вот [тут](https://learngitbranching.js.org/) + +1. Гайд по markdown [тут](https://guides.github.com/features/mastering-markdown/) + +БОЛЬШОЕ СПАСИБО, что дочитали этот README до конца! И Удачи Вам в сдаче л/р и не только! diff --git a/alexandrov_dmitrii_lab_1/lab1.py b/alexandrov_dmitrii_lab_1/lab1.py new file mode 100644 index 0000000..071ff62 --- /dev/null +++ b/alexandrov_dmitrii_lab_1/lab1.py @@ -0,0 +1,56 @@ +import random +from matplotlib import pyplot as plt +from matplotlib.colors import ListedColormap +from sklearn.datasets import make_moons +from sklearn.linear_model import LinearRegression, Ridge +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import Pipeline + +rs = random.randrange(50) + +X, y = make_moons(n_samples=250, noise=0.3, random_state=rs) +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42) + +figure = plt.figure(1, figsize=(16, 9)) +axis = figure.subplots(4, 3) +cm = ListedColormap(['#FF0000', "#0000FF"]) +arr_res = list(range(len(y_test))) +X_scale = list(range(len(y_test))) + + +def test(col, model): + global axis + global arr_res + global X_test + global X_train + global y_train + global y_test + + model.fit(X_train, y_train) + res_y = model.predict(X_test) + print(model.score(X_test, y_test)) + + axis[0, col].scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm) + axis[1, col].scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm) + axis[2, col].scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm) + axis[2, col].scatter(X_test[:, 0], X_test[:, 1], c=res_y, cmap=cm) + axis[3, col].plot([i for i in range(len(res_y))], y_test, c="g") + axis[3, col].plot([i for i in range(len(res_y))], res_y, c="r") + + +def start(): + lin = LinearRegression() + poly = Pipeline([('poly', PolynomialFeatures(degree=3)), + ('linear', LinearRegression())]) + ridge = Pipeline([('poly', PolynomialFeatures(degree=3)), + ('ridge', Ridge(alpha=1.0))]) + + test(0, lin) + test(1, poly) + test(2, ridge) + + plt.show() + + +start() diff --git a/alexandrov_dmitrii_lab_1/readme.md b/alexandrov_dmitrii_lab_1/readme.md new file mode 100644 index 0000000..5fb7f17 --- /dev/null +++ b/alexandrov_dmitrii_lab_1/readme.md @@ -0,0 +1,46 @@ +## Задание +Сгенерировать определенный тип данных и сравнить на нем 3 модели. Построить графики, отобразить качество моделей, объяснить полученные результаты. +Вариант 1. +Данные: make_moons (noise=0.3, random_state=rs) +Модели: +· Линейная регрессия +· Полиномиальная регрессия (со степенью 3) +· Гребневая полиномиальная регрессия (со степенью 3, alpha = 1.0) + +### Запуск программы +Файл lab1.py содержит и запускает программу, аргументов и настройки ~~вроде~~ не требует, + +### Описание программы +Генерирует один из 50 наборов данных, показывает окно с графиками и пишет оценку моделей обучения по заданию. +Использует библиотеки matplotlib для демонстрации графиков и sklearn для создания и использования моделей. + +### Результаты тестирования +Для различных значений rs результаты следующие: +значение - линейная - полиномиальная - гребневая полиномиальная +1 - 0.54 - 0.08 - 0.35 +2 - 0.62 - 0.58 - 0.63 +3 - 0.6 - 0.67 - 0.65 +4 - 0.52 - 0.46 - 0.5 +5 - 0.4 - 0.42 - 0.44 +Из данных результатов можно заключить, что чёткой зависимости точности от выбранной модели нет. + +Однако, после этого я добавил в генератор данных число значений: 500. Результаты оказались более детерминированными: +значение - линейная - полиномиальная - гребневая полиномиальная +1 - 0.54 - 0.63 - 0.63 +2 - 0.52 - 0.63 - 0.62 +3 - 0.56 - 0.64 - 0.64 +4 - 0.5 - 0.63 - 0.62 +5 - 0.5 - 0.52 - 0.53 +Из данных результатов можно заключить, что в общем случае модель линейной регрессии уступает полиномиальным. Гребневая полиномиальная регрессия чаще уступала обычной полиномиальной, однако в незначительном количестве ситуаций была оценена выше - но во всех случаях результаты были близки, поэтому можно с уверенностью предположить, что результаты идентичны и различаются по воле шума обучения. + +После изучения число значений в генераторе заменено на 250, поскольку графики становились неразличимыми^ +значение - линейная - полиномиальная - гребневая полиномиальная +1 - 0.48 - 0.54 - 0.54 +2 - 0.5 - 0.56 - 0.56 +3 - 0.57 - 0.6 - 0.6 +4 - 0.57 - 0.66 - 0.68 +5 - 0.49 - 0.54 - 0.55 +По данным результатам видно, что в большинстве ситуаций уже гребневая полиномиальная регрессия показывает лучшую точность. + +Результаты объясняются следующим образом: +Линейная регрессия будучи математически прямой плохо отражает сложные функции и нелинейные зависимости, в то время как полиномиальная регрессия способна отражать перегибы и изменяющиеся в зависимости от меры значений зависимости. Гребневая полиномиальная вышла идентичной простой полиномиальной из-за одинаковых настроек - обе они по заданию имеют третью степень, а гребневая регрессия имеет слишком малый параметр alpha, что результирует в малом эффекте гребневой функции. diff --git a/antonov_dmitry_lab_1/README.md b/antonov_dmitry_lab_1/README.md new file mode 100644 index 0000000..be111c3 --- /dev/null +++ b/antonov_dmitry_lab_1/README.md @@ -0,0 +1,97 @@ +# Лаб 1 + +Работа с типовыми наборами данных и различными моделями + +# Вариант 3 + +Данные: make_classification (n_samples=500, n_features=2, +n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1) + +# Запуск + +Выполнением скрипта файла (вывод в консоль + рисует графики). + +# Модели: + +1. Линейная регрессия +1. Полиномиальная регрессия (со степенью 3) +1. Гребневая полиномиальная регрессия (со степенью 3, alpha = 1.0) + +# Графики + +
+Качество каждой модели может быть оценено на основе среднеквадратичной ошибки (MSE). +Более низкая MSE указывает на лучшее соответствие данным. +Однако выбор модели зависит от набора данных и лежащей в основе взаимосвязи между объектами и целевой переменной. + +Линейная регрессия: Линейная регрессия предполагает линейную зависимость между признаками и целевой переменной. +Это хорошо работает, когда взаимосвязь линейна, а шум в наборе данных минимален. +Лучше всего сработала на наборе лун. Хуже всего на кругах. +На линейном наборе показала себя на равне с остальными. + +Полиномиальная и гребневая показали примерно одинаково на всех наборах. + +Полиномиальная регрессия (степень=3): +Полиномиальная регрессия обеспечивает более гибкую подгонку за счет полинома более высокого порядка(кубическая кривая). +Она может выявить более сложные взаимосвязи между объектами и целевой переменной. +Она может сработать лучше, чем линейная регрессия, если истинная взаимосвязь нелинейна. + +Гребневая регрессия (степень= 3, альфа=1,0): +В случае полиномиальной регрессии с регуляризацией (альфа=1,0) модель добавляет коэффициент регуляризации +для управления сложностью обучения. Регуляризация помогает предотвратить переобучение, когда набор +данных содержит шум или когда он ограничен. +
+ +

+

Набор лун (moon_dataset)
+ +

+

+

Графики регрессии
+ + + +
+ Линейная MSE: 0.0936 + Полиномиальная (degree=3) MSE: 0.0674 + Гребневая (degree=3, alpha=1.0) MSE: 0.0682 +
+

+ +

+

Набор кругов (circles_dataset)
+ +

+

+

Графики регрессии
+ + + +
+ Линейная MSE: 0.2684 + Полиномиальная (degree=3) MSE: 0.1341 + Гребневая (degree=3, alpha=1.0) MSE: 0.1312 +
+

+ +

+

Набор линейный (linearly_dataset)
+ +

+

+

Графики регрессии
+ + + +
+ Линейная MSE: 0.1101 + Полиномиальная (degree=3) MSE: 0.1045 + Гребневая (degree=3, alpha=1.0) MSE: 0.1078 +
+

+ +
+Итоговая модель подбирается учитывая зависимость в данных, +как правило полиномиальная регрессия справляется лучше, а коэф регуляризации в гребневой регрессии помогает избежать +переобучения. +
\ No newline at end of file diff --git a/antonov_dmitry_lab_1/lab1.py b/antonov_dmitry_lab_1/lab1.py new file mode 100644 index 0000000..f92c5d4 --- /dev/null +++ b/antonov_dmitry_lab_1/lab1.py @@ -0,0 +1,97 @@ +import numpy as np +from matplotlib import pyplot as plt +from skimage.metrics import mean_squared_error +from sklearn.datasets import make_moons, make_circles, make_classification +from sklearn.linear_model import LinearRegression, Ridge +from sklearn.model_selection import train_test_split +from sklearn.pipeline import make_pipeline +from sklearn.preprocessing import StandardScaler, PolynomialFeatures + +X, y = make_classification( + n_features=2, + n_redundant=0, + n_informative=2, + random_state=0, + n_clusters_per_class=1 +) + +rng = np.random.RandomState(2) +X += 2 * rng.uniform(size=X.shape) +linearly_dataset = (X, y) +moon_dataset = make_moons(noise=0.3, random_state=0) +circles_dataset = make_circles(noise=0.2, factor=0.5, random_state=1) +datasets = [moon_dataset, circles_dataset, linearly_dataset] + +""" +Данные: +· moon_dataset +· circles_dataset +· linearly_dataset +""" +for ds_cnt, ds in enumerate(datasets): + X, y = ds + X = StandardScaler().fit_transform(X) + X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=.4, random_state=42 + ) + """ + Модели: + · Линейную регрессию + · Полиномиальную регрессию (со степенью 3) + · Гребневую полиномиальную регрессию (со степенью 3, alpha = 1.0) + """ + + # Линейная + linear_regression = LinearRegression() + linear_regression.fit(X_train, y_train) + linear_predictions = linear_regression.predict(X_test) + linear_mse = mean_squared_error(y_test, linear_predictions) + + # Полиномиальная (degree=3) + poly_regression = make_pipeline(PolynomialFeatures(degree=3), LinearRegression()) + poly_regression.fit(X_train, y_train) + poly_predictions = poly_regression.predict(X_test) + poly_mse = mean_squared_error(y_test, poly_predictions) + + # Гребневая (degree=3, alpha=1.0) + poly_regression_alpha = make_pipeline(PolynomialFeatures(degree=3), Ridge(alpha=1.0)) + poly_regression_alpha.fit(X_train, y_train) + poly_alpha_predictions = poly_regression_alpha.predict(X_test) + poly_alpha_mse = mean_squared_error(y_test, poly_alpha_predictions) + + # График данных + plt.figure(figsize=(10, 6)) + plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap='coolwarm') + plt.title('Датасет №' + str(ds_cnt)) + plt.xlabel('X') + plt.ylabel('Y') + + # График линейной модели + plt.figure(figsize=(10, 6)) + plt.scatter(X_test[:, 0], X_test[:, 1], c=linear_predictions, cmap='coolwarm') + plt.title('Линейная ds'+ str(ds_cnt)) + plt.xlabel('X') + plt.ylabel('Y') + plt.show() + + # График полиномиальной модели (degree=3) + plt.figure(figsize=(10, 6)) + plt.scatter(X_test[:, 0], X_test[:, 1], c=poly_predictions, cmap='coolwarm') + plt.title('Полиномиальная (degree=3) ds' + str(ds_cnt)) + plt.xlabel('X') + plt.ylabel('Y') + plt.show() + + # График гребневой модели (degree=3, alpha=1.0) + plt.figure(figsize=(10, 6)) + plt.scatter(X_test[:, 0], X_test[:, 1], c=poly_alpha_predictions, cmap='coolwarm') + plt.title('Гребневая (degree=3, alpha=1.0) ds' + str(ds_cnt)) + plt.xlabel('X') + plt.ylabel('Y') + plt.show() + + # Сравнение качества + print('Линейная MSE:', linear_mse) + print('Полиномиальная (degree=3) MSE:', poly_mse) + print('Гребневая (degree=3, alpha=1.0) MSE:', poly_alpha_mse) + diff --git a/antonov_dmitry_lab_1/screens/myplot1.png b/antonov_dmitry_lab_1/screens/myplot1.png new file mode 100644 index 0000000..8341361 Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot1.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot10.png b/antonov_dmitry_lab_1/screens/myplot10.png new file mode 100644 index 0000000..ad58249 Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot10.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot11.png b/antonov_dmitry_lab_1/screens/myplot11.png new file mode 100644 index 0000000..a26f8ba Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot11.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot12.png b/antonov_dmitry_lab_1/screens/myplot12.png new file mode 100644 index 0000000..84e0d74 Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot12.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot2.png b/antonov_dmitry_lab_1/screens/myplot2.png new file mode 100644 index 0000000..0c50b29 Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot2.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot3.png b/antonov_dmitry_lab_1/screens/myplot3.png new file mode 100644 index 0000000..19cc7d4 Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot3.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot4.png b/antonov_dmitry_lab_1/screens/myplot4.png new file mode 100644 index 0000000..03c667b Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot4.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot5.png b/antonov_dmitry_lab_1/screens/myplot5.png new file mode 100644 index 0000000..de743ae Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot5.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot6.png b/antonov_dmitry_lab_1/screens/myplot6.png new file mode 100644 index 0000000..d22bdbc Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot6.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot7.png b/antonov_dmitry_lab_1/screens/myplot7.png new file mode 100644 index 0000000..29f6740 Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot7.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot8.png b/antonov_dmitry_lab_1/screens/myplot8.png new file mode 100644 index 0000000..d75641a Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot8.png differ diff --git a/antonov_dmitry_lab_1/screens/myplot9.png b/antonov_dmitry_lab_1/screens/myplot9.png new file mode 100644 index 0000000..0ef0f8c Binary files /dev/null and b/antonov_dmitry_lab_1/screens/myplot9.png differ diff --git a/gordeeva_anna_lab_1/1graf.jpg b/gordeeva_anna_lab_1/1graf.jpg new file mode 100644 index 0000000..1784faa Binary files /dev/null and b/gordeeva_anna_lab_1/1graf.jpg differ diff --git a/gordeeva_anna_lab_1/2graf.jpg b/gordeeva_anna_lab_1/2graf.jpg new file mode 100644 index 0000000..5c7deb8 Binary files /dev/null and b/gordeeva_anna_lab_1/2graf.jpg differ diff --git a/gordeeva_anna_lab_1/3graf.jpg b/gordeeva_anna_lab_1/3graf.jpg new file mode 100644 index 0000000..c26f736 Binary files /dev/null and b/gordeeva_anna_lab_1/3graf.jpg differ diff --git a/gordeeva_anna_lab_1/lab1.py b/gordeeva_anna_lab_1/lab1.py new file mode 100644 index 0000000..de328ff --- /dev/null +++ b/gordeeva_anna_lab_1/lab1.py @@ -0,0 +1,66 @@ +import streamlit as st +import numpy as np +from matplotlib import pyplot as plt +from matplotlib.colors import ListedColormap +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.datasets import make_moons, make_circles, make_classification +from sklearn.linear_model import Perceptron +from sklearn.neural_network import MLPClassifier +from sklearn.metrics import accuracy_score + +st.header("Лабораторная работа 1. Вариант 7") + +#Создаем данные +moon_dataset = make_moons(noise=0.3, random_state=0) +X, y = moon_dataset #Х это двумерный массив с признаками (координатами), а y - одномерный массив с 0 и 1.(Либо к 1 классу, либо к другому) +X = StandardScaler().fit_transform(X) #Данные нужно обязательно стандартизировать, для того, что бы один признак не перевешивал в обучении другой признак +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42) #Делим на обучающую и тестовую выборку. Число выбираем для того, чтобы выборка при каждом старте не менялась + +def print_perceptron(perceptron): + # Обучение модели на обучающих данных + perceptron.fit(X_train, y_train) + + #Определение точности модели + y_pred = perceptron.predict(X_test)#На тестовой выборке получаем принадлежность к классу + accuracy = accuracy_score(y_test, y_pred) + st.write("Точность:", accuracy) + + #График с помощью Matplotlib + fig, ax = plt.subplots() + cm_bright = ListedColormap(['#FF0000', '#0000FF']) + cm_bright2 = ListedColormap(['#FFBBBB', '#BBBBFF']) + cmap = ListedColormap(['#FFBBBB', '#BBBBFF']) + + #Отрисовка градиента/фона + h = .02 # шаг регулярной сетки + x0_min, x0_max = X_train[:, 0].min() - .5, X_train[:, 0].max() + .5 #Определение границы множества по оси х + x1_min, x1_max = X_train[:, 1].min() - .5, X_train[:, 1].max() + .5 #Определение границы множества по оси y + #np.arange(start, stop, inter) позволяет создать последовательность числен в интервале от start до stop c интервалом/шагом inter + xx0, xx1 = np.meshgrid(np.arange(x0_min, x0_max, h), np.arange(x1_min, x1_max, h)) #получаем координатную матрицу из координатных векторов + Z = perceptron.predict(np.c_[xx0.ravel(), xx1.ravel()]) + Z = Z.reshape(xx0.shape) # Изменяем форму Z в соответствии с сеткой + # Применяем обученную модель к сетке точек и отображаем результат как цветовую карту + ax.contourf(xx0, xx1, Z, cmap=cmap, alpha=.8) + scatter_train = ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, marker='o', label='Обучающая выборка') + scatter_test = ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright2, marker='x', label='Тестовая выборка') + ax.legend(handles=[scatter_train, scatter_test], labels=['Обучающая выборка', 'Тестовая выборка']) + st.pyplot(fig) + +# Создание объекта модели персептрона +on = st.toggle('Персептрон') +if on: + perceptron = Perceptron(max_iter=100, random_state=0) + print_perceptron(perceptron) + +# Создание объекта модели персептрона +on = st.toggle('Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01)') +if on: + perceptron = MLPClassifier(hidden_layer_sizes=(10,), alpha=0.01, max_iter=1000, random_state=0) + print_perceptron(perceptron) + +# Создание объекта модели персептрона +on = st.toggle('Многослойный персептрон с 100-а нейронами в скрытом слое (alpha = 0.01)') +if on: + perceptron = MLPClassifier(hidden_layer_sizes=(100,), alpha=0.01, max_iter=1000, random_state=0) + print_perceptron(perceptron) \ No newline at end of file diff --git a/gordeeva_anna_lab_1/readme.md b/gordeeva_anna_lab_1/readme.md new file mode 100644 index 0000000..6b1815c --- /dev/null +++ b/gordeeva_anna_lab_1/readme.md @@ -0,0 +1,63 @@ +## Задание +Данные: make_moons (noise = 0.3, random_state = 0) + +Модели: +* Персептрон +* Многослойный персептрон с 10-ю нейронами в скрытом поле (alpha = 0.01) +* Многослойный персептрон с 100-а нейронами в скрытом поле (alpha = 0.01) + +## В чем различие каждой модели + +Персептрон: +* самая простая форма искусственной нейронной сети +* состоит из одного или нескольких нейронов +* только один слой нейронов +* разделяет данные линейно + +Многослойный персептрон с 10-ю/100-а нейронами в скрытом поле (alpha = 0.01) +* более сложная форма искусственной нейронной сети +* состоит из нескольких слоев, причем имеет один или несколько скрытых слоев +* способен решать задачи классификации, регрессии, обработки изображений, текста и т.д + +Общий вывод таков, что многослойный персептрон способен решать более сложные задачи, требующие нелинейных решений. + + +## Библиотеки +Streamlit. Предоставляет простой способ создания веб-приложений для визуализации данных. + +Numpy. Предоставляет возможность работать с массивами и матрицами. + +Matplotlib. Используется для создания графиков. + +Sklearn. Предоставляет инструменты и алгоритмы, которые упрощают задачи, связанные с машинным обучением. + +## Функционал +Предоставляет создание объекта для каждой модели персептрона. + +Создание данных с помощью функции make_moon c последующим +делением данных на обучающую и тестовую выборку. + +Метод print_perceptron, в котором происходит обучение модели, определение точности и отрисовка графика. + +## Запуск +Перед запуском необходимо запустить виртуальную среду venv. Так как я использую streamlit, то для запуска необходимо в терминал прописать следующую строку: +``` +streamlit run lab1.py +``` +Приложение развернется на локальном сервере и автоматически откроется в браузере. + +## Скриншоты работы программы +При запуске выглядит так: +![Alt text](win_start.jpg "Optional Title") + +Построенные графики + +![Alt text](1graf.jpg "Optional Title") + +![Alt text](2graf.jpg "Optional Title") + +![Alt text](3graf.jpg "Optional Title") + +## Вывод +В первой модели, как сказано выше, данные делятся линейно. Но точность разделения близка к 1, поэтому задача в данном случае решена. +В других моделях данные делятся нелинейно и чем выше кол-во нейронов, тем разбиение становится точнее. Но точность в обоих случаях одинаковая. \ No newline at end of file diff --git a/gordeeva_anna_lab_1/win_start.jpg b/gordeeva_anna_lab_1/win_start.jpg new file mode 100644 index 0000000..a7d8a4c Binary files /dev/null and b/gordeeva_anna_lab_1/win_start.jpg differ diff --git a/labs.jpg b/labs.jpg new file mode 100644 index 0000000..299cbd1 Binary files /dev/null and b/labs.jpg differ diff --git a/zavrazhnova_svetlana_lab_1/README.md b/zavrazhnova_svetlana_lab_1/README.md new file mode 100644 index 0000000..efdcb74 --- /dev/null +++ b/zavrazhnova_svetlana_lab_1/README.md @@ -0,0 +1,31 @@ +### Задание: +Данные: make_classification (n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1) + +Модели: +- Персептрон, +- Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01) +- Многослойный персептрон со 100-а нейронами в скрытом слое (alpha = 0.01) + +### как запустить лабораторную работу: +Лабораторная работа запускается в файле `zavrazhnova_svetlana_lab_1.py` через Run, должно запуститься диалоговое окно и вычисления в консоли + +### Технологии: +Библиотека Scikit-learn содержит множество наборов данных + +### Что делает лабораторная: +Выполнение кода выводит точность каждой модели (в консоль) и отображает графики с границами решений для каждой модели. + +В данном коде генерируются данные с использованием функции make_classification() из библиотеки scikit-learn. Генерируется набор данных с 500 примерами и 2 признаками. Классы точек представлены переменной y, которая содержит метки классов для каждой точки. В данном случае, сгенерировано два класса, обозначенных как 0 и 1. + +Визуализация данных и границ решения моделей выполняется с помощью функции scatter() и функции contourf() из библиотеки matplotlib. Функция scatter() отображает точки данных на графике, окрашивая их в соответствии с классами, заданными переменной y. + +Таким образом, графики помогают визуализировать данные, их классификацию и границы решения моделей, позволяя лучше понять, как модели принимают решение о классификации объектов. + +### Пример выходных значений: +Консоль: + +![результат в консоль](imgConsoleRes.png) + +Графики: + +![img.png](imgGraphicsRes.png) \ No newline at end of file diff --git a/zavrazhnova_svetlana_lab_1/imgConsoleRes.png b/zavrazhnova_svetlana_lab_1/imgConsoleRes.png new file mode 100644 index 0000000..3628841 Binary files /dev/null and b/zavrazhnova_svetlana_lab_1/imgConsoleRes.png differ diff --git a/zavrazhnova_svetlana_lab_1/imgGraphicsRes.png b/zavrazhnova_svetlana_lab_1/imgGraphicsRes.png new file mode 100644 index 0000000..7c9788f Binary files /dev/null and b/zavrazhnova_svetlana_lab_1/imgGraphicsRes.png differ diff --git a/zavrazhnova_svetlana_lab_1/zavrazhnova_svetlana_lab_1.py b/zavrazhnova_svetlana_lab_1/zavrazhnova_svetlana_lab_1.py new file mode 100644 index 0000000..e2fd9b8 --- /dev/null +++ b/zavrazhnova_svetlana_lab_1/zavrazhnova_svetlana_lab_1.py @@ -0,0 +1,89 @@ +import numpy as np +from sklearn.datasets import make_classification +from sklearn.model_selection import train_test_split +from sklearn.linear_model import Perceptron +from sklearn.neural_network import MLPClassifier +from sklearn.metrics import accuracy_score +from matplotlib import pyplot as plt + +#Задание случайного состояния +rs = 42 +#Генерируются 500 примеров с 2 признаками, 0 лишними признаками, 2 информативными признаками, +# random_state устанавливается в rs для воспроизводимости данных и n_clusters_per_class устанавливается в 1 для генерации одного кластера классов +X, y = make_classification(n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1) + +# Разделение данных на обучающую и тестовую выборки +#test_size установлен на 0.4, что означает, что 40% данных будет использовано для тестирования. +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=rs) + +# Инициализация моделей +perceptron = Perceptron() +mlp_10 = MLPClassifier(hidden_layer_sizes=(10,), alpha=0.01, random_state=rs) +mlp_100 = MLPClassifier(hidden_layer_sizes=(100,), alpha=0.01, random_state=rs) + +# Обучение моделей +perceptron.fit(X_train, y_train) +mlp_10.fit(X_train, y_train) +mlp_100.fit(X_train, y_train) + +# Предсказание на тестовой выборке +y_pred_perceptron = perceptron.predict(X_test) +y_pred_mlp_10 = mlp_10.predict(X_test) +y_pred_mlp_100 = mlp_100.predict(X_test) + +# Оценка качества моделей, Оценка точности (accuracy) каждой модели сравнивается с истинными метками классов на тестовой выборке +accuracy_perceptron = accuracy_score(y_test, y_pred_perceptron) +accuracy_mlp_10 = accuracy_score(y_test, y_pred_mlp_10) +accuracy_mlp_100 = accuracy_score(y_test, y_pred_mlp_100) + +# Вывод результатов +print("Точность - Perceptron:", accuracy_perceptron) +print("Точность - MLP (10 neurons):", accuracy_mlp_10) +print("Точность - MLP (100 neurons):", accuracy_mlp_100) + +# Визуализация данных и границ решения моделей +#Определение интервала значений для графиков, чтобы включить все точки данных и оставить небольшую дополнительную поверхность вокруг границы графика +x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5 +y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5 +xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), + np.arange(y_min, y_max, 0.02)) + +#Предсказание класса для каждой точки в сетке графика и изменение формы результата, чтобы соответствовать размерам сетки +Z_perceptron = perceptron.predict(np.c_[xx.ravel(), yy.ravel()]) +Z_perceptron = Z_perceptron.reshape(xx.shape) + +Z_mlp_10 = mlp_10.predict(np.c_[xx.ravel(), yy.ravel()]) +Z_mlp_10 = Z_mlp_10.reshape(xx.shape) + +Z_mlp_100 = mlp_100.predict(np.c_[xx.ravel(), yy.ravel()]) +Z_mlp_100 = Z_mlp_100.reshape(xx.shape) + +#Визуализация данных и границ решения моделей на трех графиках. +# Границы решения отмечены заштрихованными областями, а точки данных на графике окрашены в соответствии с их классами +plt.figure(figsize=(12, 9)) +plt.subplot(221) +plt.contourf(xx, yy, Z_perceptron, alpha=0.8) +plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', alpha=0.6) +plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k') +plt.title('Персептрон') +plt.xlabel('Признак 1') +plt.ylabel('Признак 2') + +plt.subplot(222) +plt.contourf(xx, yy, Z_mlp_10, alpha=0.8) +plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', alpha=0.6) +plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k') +plt.title('MLP (10 нейронов)') +plt.xlabel('Признак 1') +plt.ylabel('Признак 2') + +plt.subplot(223) +plt.contourf(xx, yy, Z_mlp_100, alpha=0.8) +plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', alpha=0.6) +plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k') +plt.title('MLP (100 нейронов)') +plt.xlabel('Признак 1') +plt.ylabel('Признак 2') + +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/zavrazhnova_svetlana_lab_2/README.md b/zavrazhnova_svetlana_lab_2/README.md new file mode 100644 index 0000000..95eecf7 --- /dev/null +++ b/zavrazhnova_svetlana_lab_2/README.md @@ -0,0 +1,30 @@ +### Задание по варианту +Лассо (Lasso),Сокращение признаков Случайными деревьями (Random Forest Regressor), Линейная корреляция (f_regression) + +### Как запустить лабораторную работу +ЛР запускается через файл `zavrazhnova_svetlana_lab_2.py` + +### Какие технологии использовали +импорт класса `MinMaxScaler`, выполняющего масштабирование данных до заданного диапазона (от 0 до 1). +Необходимость его использования объясняется следующим: каждая модель регрессии дает оценки +важности признаков в своем диапазоне. Для того чтобы найти признак с максимальной средней важностью по трем моделям, нам необходимо привести выданные ими оценки к одному виду. +Модели линейной регрессии, ридж-регрессии и лассо-регрессии из библиотеки `scikit-learn` + +### Что делает +Применение регрессионных моделей для определения важности признаков. + +Результат работы программы показывает ранжирование признаков по их значимости для задачи. Чем больше значение ранга, тем более значимый признак. +Полученные ранги можно использовать для отбора наиболее значимых признаков и сокращения размерности данных. + +### Примеры выходных значений + +![example program result](result.png) + +В данном случае, в соответствии с полученными результатами, можно сказать следующее: + +1. Признаки 'x4' и 'x14' имеют наивысшие ранги (больше 380), что указывает на их большую значимость в решении задачи. +2. Признаки 'x2' и 'x12' имеют средние ранги (от 170 до 180), что означает их среднюю значимость. +3. Признаки 'x1' и 'x11' имеют ранги около 120, что указывает на их относительную значимость. +4. Признаки 'x5', 'x8' и 'x7' имеют низкие ранги (от 5 до 17), что говорит о их низкой значимости. +5. Признаки 'x9', 'x3', 'x13', 'x10' и 'x6' имеют очень низкие ранги (меньше 3), что указывает на их минимальную значимость или наличие практически нулевых эффектов. + diff --git a/zavrazhnova_svetlana_lab_2/result.png b/zavrazhnova_svetlana_lab_2/result.png new file mode 100644 index 0000000..2bda0ed Binary files /dev/null and b/zavrazhnova_svetlana_lab_2/result.png differ diff --git a/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py b/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py new file mode 100644 index 0000000..693ef46 --- /dev/null +++ b/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py @@ -0,0 +1,54 @@ +from sklearn.linear_model import Lasso +from sklearn.ensemble import RandomForestRegressor +from sklearn.feature_selection import f_regression +from sklearn.preprocessing import MinMaxScaler +import numpy as np + +np.random.seed(0) +size = 750 +#входные данные. +X = np.random.uniform(0, 1, (size, 14)) + +#Генерируется целевая переменная Y на основе математической функции от входных данных X. +Y = (10 * np.sin(np.pi*X[:,0]*X[:,1]) + 20*(X[:,2] - .5)**2 + + 10*X[:,3] + 5*X[:,4]**5 + np.random.normal(0,1)) +X[:,10:] = X[:,:4] + np.random.normal(0, .025, (size,4)) + +names = ["x%s" % i for i in range(1,15)] +#Создается пустой словарь для хранения рангов признаков +ranks = {} + +#Создается экземпляр модели лассо-регрессии +lasso = Lasso(alpha=.05) +#Модель подгоняется под входные данные X и целевую переменную Y +lasso.fit(X, Y) +ranks["Lasso"] = dict(zip(names, lasso.coef_)) + +rf = RandomForestRegressor(n_estimators=100, random_state=0) +rf.fit(X, Y) +ranks["Random Forest"] = dict(zip(names, rf.feature_importances_)) + +f, _ = f_regression(X, Y, center=True) +ranks["f_regression"] = dict(zip(names, f)) + +def rank_to_dict(ranks, names): + ranks = np.abs(ranks) + minmax = MinMaxScaler() + #масштабирование рангов с помощью MinMaxScaler + ranks = minmax.fit_transform(np.array(ranks).reshape(-1, 1)).ravel() + ranks = map(lambda x: round(x, 2), ranks) + return dict(zip(names, ranks)) + +#словарь для хранения средних рангов признаков +mean = {} +for key, value in ranks.items(): + for item in value.items(): + if item[0] not in mean: + mean[item[0]] = 0 + mean[item[0]] += item[1] + +sorted_mean = sorted(mean.items(), key=lambda x: x[1], reverse=True) +result = {} +for item in sorted_mean: + result[item[0]] = item[1] + print(f'{item[0]}: {item[1]}') diff --git a/МетодичкаМИИ_МО-1.pdf b/МетодичкаМИИ_МО-1.pdf new file mode 100644 index 0000000..43c4192 Binary files /dev/null and b/МетодичкаМИИ_МО-1.pdf differ