Compare commits

...

19 Commits

Author SHA1 Message Date
dfc7f8c06f madyshev_egor_lab_1 is ready 2023-10-06 21:55:29 +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
DmitriyAntonov
d30caee3db iter5 2023-09-23 21:04:51 +04:00
DmitriyAntonov
0b83c390f5 iter4 2023-09-23 21:01:09 +04:00
DmitriyAntonov
8a288f0abf iter3 2023-09-23 20:53:45 +04:00
DmitriyAntonov
3543ab5163 iter2 2023-09-23 17:42:04 +04:00
DmitriyAntonov
9bf1c4845a iter1 2023-09-23 17:22:03 +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
DmitriyAntonov
94a76f47d8 start 2023-09-19 10:23:19 +04:00
9a7b986e00 alexandrov_dmitrii_lab_1 is ready 2023-09-19 10:19:50 +04:00
38 changed files with 847 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, что результирует в малом эффекте гребневой функции.

View File

@@ -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)
# Графики
<div>
Качество каждой модели может быть оценено на основе среднеквадратичной ошибки (MSE).
Более низкая MSE указывает на лучшее соответствие данным.
Однако выбор модели зависит от набора данных и лежащей в основе взаимосвязи между объектами и целевой переменной.
Линейная регрессия: Линейная регрессия предполагает линейную зависимость между признаками и целевой переменной.
Это хорошо работает, когда взаимосвязь линейна, а шум в наборе данных минимален.
Лучше всего сработала на наборе лун. Хуже всего на кругах.
На линейном наборе показала себя на равне с остальными.
Полиномиальная и гребневая показали примерно одинаково на всех наборах.
Полиномиальная регрессия (степень=3):
Полиномиальная регрессия обеспечивает более гибкую подгонку за счет полинома более высокого порядка(кубическая кривая).
Она может выявить более сложные взаимосвязи между объектами и целевой переменной.
Она может сработать лучше, чем линейная регрессия, если истинная взаимосвязь нелинейна.
Гребневая регрессия (степень= 3, альфа=1,0):
В случае полиномиальной регрессии с регуляризацией (альфа=1,0) модель добавляет коэффициент регуляризации
для управления сложностью обучения. Регуляризация помогает предотвратить переобучение, когда набор
данных содержит шум или когда он ограничен.
</div>
<p>
<div>Набор лун (moon_dataset)</div>
<img src="screens/myplot1.png" width="650" title="датасет 1">
</p>
<p>
<div>Графики регрессии</div>
<img src="screens/myplot2.png" width="450" title="линейная модель">
<img src="screens/myplot3.png" width="450" title="полиномиальная модель">
<img src="screens/myplot4.png" width="450" title="гребневая модель">
<div>
Линейная MSE: 0.0936
Полиномиальная (degree=3) MSE: 0.0674
Гребневая (degree=3, alpha=1.0) MSE: 0.0682
</div>
</p>
<p>
<div>Набор кругов (circles_dataset)</div>
<img src="screens/myplot5.png" width="650" title="датасет 2">
</p>
<p>
<div>Графики регрессии</div>
<img src="screens/myplot6.png" width="450" title="линейная модель">
<img src="screens/myplot7.png" width="450" title="полиномиальная модель">
<img src="screens/myplot8.png" width="450" title="гребневая модель">
<div>
Линейная MSE: 0.2684
Полиномиальная (degree=3) MSE: 0.1341
Гребневая (degree=3, alpha=1.0) MSE: 0.1312
</div>
</p>
<p>
<div>Набор линейный (linearly_dataset)</div>
<img src="screens/myplot9.png" width="650" title="датасет 3">
</p>
<p>
<div>Графики регрессии</div>
<img src="screens/myplot10.png" width="450" title="линейная модель">
<img src="screens/myplot11.png" width="450" title="полиномиальная модель">
<img src="screens/myplot12.png" width="450" title="гребневая модель">
<div>
Линейная MSE: 0.1101
Полиномиальная (degree=3) MSE: 0.1045
Гребневая (degree=3, alpha=1.0) MSE: 0.1078
</div>
</p>
<div>
Итоговая модель подбирается учитывая зависимость в данных,
как правило полиномиальная регрессия справляется лучше, а коэф регуляризации в гребневой регрессии помогает избежать
переобучения.
</div>

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

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

View File

@@ -0,0 +1,51 @@
import random
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.neural_network import MLPClassifier
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import Perceptron
rs = random.randrange(100)
X, y = make_moons(n_samples=200, 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)
print("Линейная регрессия")
linerModel = LinearRegression().fit(X_train, y_train)
print("результат модели на учебных данных =", linerModel.score(X_train, y_train))
print("результат модели на тестовых данных =", linerModel.score(X_Test, y_test))
print("Многослойный персептрон с 10-ю нейронами в скрытом слое")
mlp = MLPClassifier(hidden_layer_sizes=(10), alpha = 0.01, max_iter=2000).fit(X_train, y_train)
print("результат модели на учебных данных =", mlp.score(X_train, y_train))
print("результат модели на тестовых данных =", mlp.score(X_Test, y_test))
print("Персептрон ")
perceptron = Perceptron().fit(X_train, y_train)
print("результат модели на учебных данных =", perceptron.score(X_train, y_train))
print("результат модели на тестовых данных =", perceptron.score(X_Test, y_test))
plt.xlabel("Свойство 1")
plt.ylabel("Свойство 2")
plt.title("Сгенерированные данные")
plt.scatter(X[:, 0], X[:, 1], c = y, cmap = plt.cm.Set1)
plt.show()
h = 0.01
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
def showPlot(name, model):
plt.title(name)
c = model.predict(np.c_[xx.ravel(), yy.ravel()])
c = np.where(c >= 0.5, 1, 0)
c = c.reshape(xx.shape)
plt.contourf(xx, yy, c, cmap = plt.cm.Set1, alpha=0.2)
plt.scatter(X[:, 0], X[:, 1], c = y, cmap = plt.cm.Set1)
plt.show()
showPlot("Линейная регрессия", linerModel)
showPlot("Многослойный персептрон", mlp)
showPlot("Персептрон", perceptron)

View File

@@ -0,0 +1,40 @@
# Задание
Используя код из пункта «Регуляризация и сеть прямого распространения» из методички (стр. 228), сгенерируйте определенный тип данных и сравните на нем 3 модели (по варианту). Постройте графики, отобразите качество моделей, объясните полученные результаты.
## Задание по варианту
Генерируемы данные: make_moons (noise=0.3, random_state=rs)
Модели:
* Линейную регрессию
* Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01)
* Персептрон
## Решение
### Запуск программы
Для запуска программы необходимо запустить файл main.py, содержащий код программы
### Используемые технологии
Программа использует следующие библиотеки:
- numpy - библиотека для работы с массивами и матрицами.
- matplotlib - библиотека для создания графиков и визуализации данных.
- sklearn - библиотека для машинного обучения и анализа данных.
### Что делает программа
Программа генерирует один из 100 случайных наборов данных. Данные состоят из двух полукругов для работы с алгоритмами кластеризации и классификации
Показывает окно с графиком и результаты работы моделей.
### Тесты
тесты проводились на наборах данных с 1 по 5
Результаты берутся из результатов работы модели на тестовых данных
Набор данных - Линейная регрессия - Многослойный персептрон - Персептрон
1 - 0.535 - 0.875 - 0.775
2 - 0.454 - 0.9 - 0.85
3 - 0.548 - 0.9 - 0.9
4 - 0.58 - 0.85 - 0.825
5 - 0.545 - 0.862 - 0.825
Из результатов видно, что модель линейной регрессии показала себя хуже всего. Следом идет персептрон. И лучший результат показала модель многослойного персептрона с 10-ю нейронами в скрытом слое
При увеличении объема генерируемых данных с 200 до 2000, можно заметить что результаты остались примерно на том же уровне
Набор данных - Линейная регрессия - Многослойный персептрон - Персептрон
1 - 0.565 - 0.903 - 0.78
2 - 0.534 - 0.919 - 0.82
3 - 0.541 - 0.909 - 0.742
4 - 0.524 - 0.856 - 0.845
5 - 0.568 - 0.873 - 0.802
Тесты с дополнительным увеличением объема данных, изменений в результатах не показали
Из результатов можно сделать вывод, что наиболее подходящей моделью для данного типа генерируемых данных из оттестированных моделей является Многослойный персептрон
Разница в результатах работы персептрона и многослойного персептрона имеется из-за того что многослойный персептрон имеет более сложную структуру, чем простой персептрон, и может обучаться более сложным функциям. Кроме того, многослойный персептрон используя несколько скрытых слоев, изучает более сложные зависимости между входными и выходными данными.

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