Compare commits

...

18 Commits

Author SHA1 Message Date
71887f8076 lab 2 is ready 2023-10-05 18:15:46 +04:00
ae454ae9ef lab 2 is ready 2023-10-05 18:13:38 +04:00
5d8a090a38 lab 2 is ready 2023-10-04 22:14:04 +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
DmitriyAntonov
94a76f47d8 start 2023-09-19 10:23:19 +04:00
36 changed files with 786 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,82 @@
from sklearn.linear_model import LinearRegression, RandomizedLasso
from sklearn.feature_selection import RFE
from sklearn.preprocessing import MinMaxScaler
from matplotlib import pyplot as plt
import numpy as np
import random as rand
figure = plt.figure(1, figsize=(16, 9))
axis = figure.subplots(1, 4)
col = 0
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
def rank_to_dict(ranks, names, n_features):
ranks = np.abs(ranks)
minmax = MinMaxScaler()
ranks = minmax.fit_transform(np.array(ranks).reshape(n_features, 1)).ravel()
ranks = map(lambda x: round(x, 2), ranks)
return dict(zip(names, ranks))
def createView(key, val):
global figure
global axis
global col
global y
axis[col].bar(y, list(val.values()), label=key)
axis[col].set_title(key)
col = col + 1
def start():
np.random.seed(rand.randint(0, 50))
size = 750
n_features = 14
X = np.random.uniform(0, 1, (size, n_features))
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))
lr = LinearRegression()
rl = RandomizedLasso()
rfe = RFE(estimator=LinearRegression(), n_features_to_select=1)
lr.fit(X, Y)
rl.fit(X, Y)
rfe.fit(X, Y)
names = ["x%s" % i for i in range(1, n_features + 1)]
rfe_res = rfe.ranking_
for i in range(rfe_res.size):
rfe_res[i] = 14 - rfe_res[i]
ranks = {"Linear regression": rank_to_dict(lr.coef_, names, n_features),
"Random lasso": rank_to_dict(rl.scores_, names, n_features),
"RFE": rank_to_dict(rfe_res, names, n_features)}
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]
for key, value in mean.items():
res = value / len(ranks)
mean[key] = round(res, 2)
ranks["Mean"] = mean
for key, value in ranks.items():
createView(key, value)
ranks[key] = sorted(value.items(), key=lambda y: y[1], reverse=True)
for key, value in ranks.items():
print(key)
print(value)
start()
plt.show()

View File

@@ -0,0 +1,50 @@
### Задание
Выполнить ранжирование признаков с помощью указанных по варианту моделей. Отобразить получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Провести анализ получившихся результатов. Определить, какие четыре признака оказались самыми важными по среднему значению.
Вариант 1.
Модели:
* Линейная регрессия (LinearRegression)
* Случайное Лассо (RandomizedLasso)
* Рекурсивное сокращение признаков (Recursive Feature Elimination RFE)
### Запуск программы
Программа работает на Python 3.7, поскольку только в нём можно подключить нужную версию библиотеки scikit-learn, которая ещё содержит RandomizedLasso.
Файл lab2.py содержит и запускает программу, аргументов и настройки ~~вроде~~ не требует.
### Описание программы
Файл lab2.py содержит непосредственно программу.
Программа создаёт набор данных с 10 признаками для последующего их ранжирования, и обрабатывает тремя моделями по варианту.
Программа строит столбчатые диаграммы, которые показывают как распределились оценки важности признаков, и выводит в консоль отсортированные по убыванию важности признаки.
Таким образом можно легко определить наиважнейшие признаки.
### Результаты тестирования
По результатам тестирования, можно сказать следующее:
* линейная регрессия показывает хорошие результаты, выделяет все 9 значимых признаков.
* случайное лассо справляется хуже других моделей, иногда выделяя шумовые признаки в значимые, а значимые - в шумовые.
* рекурсивное сокращение признаков показывает хорошие результаты, правильно правильно выделяя 9 самых значимых признаков.
* хотя линейная регрессия и рекурсивное сокращение признаков правильно выделяют значимые признаки, саму значимость они оценивают по-разному.
* среднее значение позволяет c хорошей уверенностью определять истинные значимые признаки.
Итого. Если необходимо просто ранжирование, достаточно взять модель RFE, однако, если необходимо анализировать признаки по коэффициентам, имея меру (коэффициенты), то брать нужно линейную регрессию. Случайное лассо лучше не надо.
Пример консольных результатов:
>Linear regression
>[('x1', 1.0), ('x4', 0.69), ('x2', 0.61), ('x11', 0.59), ('x3', 0.51), ('x13', 0.48), ('x5', 0.19), ('x12', 0.19), ('x14', 0.12), ('x8', 0.03), ('x6', 0.02), ('x10', 0.01), ('x7', 0.0), ('x9', 0.0)]
>Random lasso
>[('x5', 1.0), ('x4', 0.76), ('x2', 0.74), ('x1', 0.72), ('x14', 0.44), ('x12', 0.32), ('x11', 0.28), ('x8', 0.22), ('x6', 0.17), ('x3', 0.08), ('x7', 0.02), ('x13', 0.02), ('x9', 0.01), ('x10', 0.0)]
>RFE
>[('x4', 1.0), ('x1', 0.92), ('x11', 0.85), ('x2', 0.77), ('x3', 0.69), ('x13', 0.62), ('x5', 0.54), ('x12', 0.46), ('x14', 0.38), ('x8', 0.31), ('x6', 0.23), ('x10', 0.15), ('x7', 0.08), ('x9', 0.0)]
>Mean
>[('x1', 0.88), ('x4', 0.82), ('x2', 0.71), ('x5', 0.58), ('x11', 0.57), ('x3', 0.43), ('x13', 0.37), ('x12', 0.32), ('x14', 0.31), ('x8', 0.19), ('x6', 0.14), ('x10', 0.05), ('x7', 0.03), ('x9', 0.0)]
По данным результатам можно заключить, что наиболее влиятельные признаки по убыванию: x1, x4, x2, x5.

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