Compare commits

...

13 Commits

Author SHA1 Message Date
vladg
b239521f36 gusev_vladislav_lab_1 is ready 2023-10-07 12:36:45 +04:00
06116369e5 Merge pull request 'antonov_dmitry_lab_1' (#9) from antonov_dmitry_lab_1 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/9
2023-10-02 19:38:21 +04:00
6ad79769f3 Merge pull request 'zavrazhnova_svetlana_lab_2 is ready' (#10) from zavrazhnova_svetlana_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/10
2023-10-02 19:37:05 +04:00
Svetlnkk
cfc34f0e10 zavrazhnova_svetlana_lab_2 is ready 2023-09-23 21:36:07 +04:00
46de7c113c Merge pull request 'alexandrov_dmitrii_lab_1 - Первая лабораторная работа Александров ПИбд-42' (#6) from alexandrov_dmitrii_lab_1 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/6
2023-09-23 08:57:29 +04:00
d26e2f5535 Merge pull request 'gordeeva_anna_lab_1' (#7) from gordeeva_anna_lab_1 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/7
2023-09-23 08:56:46 +04:00
63e5a3a708 Merge pull request 'zavrazhnova_svetlana_lab_1 is ready' (#8) from zavrazhnova_svetlana_lab_1 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/8
2023-09-23 08:52:57 +04:00
Svetlnkk
453d40504e zavrazhnova_svetlana_lab_1 is ready 2023-09-23 00:04:23 +04:00
8ee5b74e58 itog 2023-09-21 23:07:09 +04:00
27e65004fa test 2023-09-21 23:02:58 +04:00
9c5a45feed Изменил(а) на 'alexandrov_dmitrii_lab_1/readme.md' 2023-09-21 20:27:32 +04:00
efa81f50bf доделка 2023-09-21 20:19:20 +04:00
9a7b986e00 alexandrov_dmitrii_lab_1 is ready 2023-09-19 10:19:50 +04:00
25 changed files with 645 additions and 0 deletions

3
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

8
.idea/IIS_2023_1.iml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.8 (venv)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (venv)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/IIS_2023_1.iml" filepath="$PROJECT_DIR$/.idea/IIS_2023_1.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

92
.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="0ceb130e-88da-4a20-aad6-17f5ab4226ac" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/zavrazhnova_svetlana_lab_2/result.png" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2VlZqWiOX68aCf0o2y0AtYJWURS" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"last_opened_file_path": "D:/ulstukek/Course4/IIS/IISLabs/IIS_2023_1"
}
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\ulstukek\Course4\IIS\IISLabs\IIS_2023_1\zavrazhnova_svetlana_lab_1" />
</key>
</component>
<component name="RunManager">
<configuration name="zavrazhnova_svetlana_lab_2" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="IIS_2023_1" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/zavrazhnova_svetlana_lab_2" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.zavrazhnova_svetlana_lab_2" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="0ceb130e-88da-4a20-aad6-17f5ab4226ac" name="Changes" comment="" />
<created>1695412818437</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1695412818437</updated>
</task>
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@@ -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()

View File

@@ -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, что результирует в малом эффекте гребневой функции.

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

View File

@@ -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)

View File

@@ -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, поэтому задача в данном случае решена.
В других моделях данные делятся нелинейно и чем выше кол-во нейронов, тем разбиение становится точнее. Но точность в обоих случаях одинаковая.

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View File

@@ -0,0 +1,28 @@
### Вариант 9
### Задание на лабораторную работу:
По данным, построить графики 3 моделей:
- Персептрон
- Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01)
- Многослойный персептрон с 100-а нейронами в скрытом слое (alpha = 0.01)
Данные: make_classification (n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
### Как запустить лабораторную работу:
Выполняем файл gusev_vladislav_lab_1.py, на экране будет нарисовано 3 графика
### Технологии
NumPy - библиотека для работы с многомерными массивами. Mathplotlib - библиотека для визуализации данных двумерной и трехмерной графикой. Sklearn - библиотека с большим количеством алгоритмов машинного обучения.
### По коду
Используем функцию make_classification, чтобы сгенерировать 500 примеров с 2 признаками. Дополнительные параметры определяют характеристики данных, такие как количество информативных признаков и случайное распределение классов.
С помощью train_test_split разделяем данные на обучающую и тестовую выборки в соотношении 70% к 30%.
Далее создаются 3 модели: персептрон, многослойный персептрон с 10 нейронами в скрытом слое и многослойный персептрон с 100 нейронами в скрытом слое.Модели обучаются на обучающих данных с использованием метода fit.
Обученные модели используются для предсказания классов на тестовых данных с помощью метода predict.
Затем с помощью accuracy_score оцениваем точности предсказаний моделей на тестовом наборе данных.
Далее создаем графики для каждой модели, где каждая точка данных отображается на графике с цветом, соответствующим предсказанному классу. В заголовках написана точность для каждой модели. Отображаем графики с помощью plt.show().
Полученные графики: ![Figure_1.png](Figure_1.png)

View File

@@ -0,0 +1,55 @@
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import Perceptron
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Создание искусственных данных
rs = np.random.RandomState(42)
#n_samples - число примеров, n_features - признаки, n_redindant - лишние признаки, n_informative - информативные признаки
#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.3 - 30% тестов
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=rs)
# Модель персептрона
perceptron = Perceptron()
perceptron.fit(X_train, y_train)
y_pred_perceptron = perceptron.predict(X_test)
accuracy_perceptron = accuracy_score(y_test, y_pred_perceptron)
# Модель многослойного персептрона с 10 нейронами
mlp_10 = MLPClassifier(hidden_layer_sizes=(10,), alpha=0.01, random_state=rs)
mlp_10.fit(X_train, y_train)
y_pred_mlp_10 = mlp_10.predict(X_test)
accuracy_mlp_10 = accuracy_score(y_test, y_pred_mlp_10)
# Модель многослойного персептрона с 100 нейронами
mlp_100 = MLPClassifier(hidden_layer_sizes=(100,), alpha=0.01, random_state=rs)
mlp_100.fit(X_train, y_train)
y_pred_mlp_100 = mlp_100.predict(X_test)
accuracy_mlp_100 = accuracy_score(y_test, y_pred_mlp_100)
# Визуализация данных
plt.figure(figsize=(12, 4))
# Персептрон
plt.subplot(131)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_perceptron, cmap=plt.cm.Paired)
plt.title(f'Персептрон (Точность: {accuracy_perceptron:.2f})')
# Многослойный персептрон с 10 нейронами
plt.subplot(132)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_mlp_10, cmap=plt.cm.Paired)
plt.title(f'MLP (10 нейронов) (Точность: {accuracy_mlp_10:.2f})')
# Многослойный персептрон с 100 нейронами
plt.subplot(133)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_mlp_100, cmap=plt.cm.Paired)
plt.title(f'MLP (100 нейронов) (Точность: {accuracy_mlp_100:.2f})')
plt.show()

View File

@@ -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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

View File

@@ -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()

View File

@@ -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), что указывает на их минимальную значимость или наличие практически нулевых эффектов.

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -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]}')