Compare commits
18 Commits
alexandrov
...
alexandrov
| Author | SHA1 | Date | |
|---|---|---|---|
| 71887f8076 | |||
| ae454ae9ef | |||
| 5d8a090a38 | |||
| 06116369e5 | |||
| 6ad79769f3 | |||
|
|
cfc34f0e10 | ||
|
|
d30caee3db | ||
|
|
0b83c390f5 | ||
|
|
8a288f0abf | ||
|
|
3543ab5163 | ||
|
|
9bf1c4845a | ||
| 46de7c113c | |||
| d26e2f5535 | |||
| 63e5a3a708 | |||
|
|
453d40504e | ||
| 8ee5b74e58 | |||
| 27e65004fa | |||
|
|
94a76f47d8 |
3
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
8
.idea/IIS_2023_1.iml
generated
Normal 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>
|
||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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>
|
||||
82
alexandrov_dmitrii_lab_2/lab2.py
Normal 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()
|
||||
50
alexandrov_dmitrii_lab_2/readme.md
Normal 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.
|
||||
97
antonov_dmitry_lab_1/README.md
Normal 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>
|
||||
97
antonov_dmitry_lab_1/lab1.py
Normal 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)
|
||||
|
||||
BIN
antonov_dmitry_lab_1/screens/myplot1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot10.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot11.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot12.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot2.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot3.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot4.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot5.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot6.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot7.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot8.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot9.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
gordeeva_anna_lab_1/1graf.jpg
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
gordeeva_anna_lab_1/2graf.jpg
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
gordeeva_anna_lab_1/3graf.jpg
Normal file
|
After Width: | Height: | Size: 84 KiB |
66
gordeeva_anna_lab_1/lab1.py
Normal 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)
|
||||
63
gordeeva_anna_lab_1/readme.md
Normal 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
|
||||
```
|
||||
Приложение развернется на локальном сервере и автоматически откроется в браузере.
|
||||
|
||||
## Скриншоты работы программы
|
||||
При запуске выглядит так:
|
||||

|
||||
|
||||
Построенные графики
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Вывод
|
||||
В первой модели, как сказано выше, данные делятся линейно. Но точность разделения близка к 1, поэтому задача в данном случае решена.
|
||||
В других моделях данные делятся нелинейно и чем выше кол-во нейронов, тем разбиение становится точнее. Но точность в обоих случаях одинаковая.
|
||||
BIN
gordeeva_anna_lab_1/win_start.jpg
Normal file
|
After Width: | Height: | Size: 65 KiB |
31
zavrazhnova_svetlana_lab_1/README.md
Normal 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.
|
||||
|
||||
Таким образом, графики помогают визуализировать данные, их классификацию и границы решения моделей, позволяя лучше понять, как модели принимают решение о классификации объектов.
|
||||
|
||||
### Пример выходных значений:
|
||||
Консоль:
|
||||
|
||||

|
||||
|
||||
Графики:
|
||||
|
||||

|
||||
BIN
zavrazhnova_svetlana_lab_1/imgConsoleRes.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
zavrazhnova_svetlana_lab_1/imgGraphicsRes.png
Normal file
|
After Width: | Height: | Size: 215 KiB |
89
zavrazhnova_svetlana_lab_1/zavrazhnova_svetlana_lab_1.py
Normal 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()
|
||||
30
zavrazhnova_svetlana_lab_2/README.md
Normal file
@@ -0,0 +1,30 @@
|
||||
### Задание по варианту
|
||||
Лассо (Lasso),Сокращение признаков Случайными деревьями (Random Forest Regressor), Линейная корреляция (f_regression)
|
||||
|
||||
### Как запустить лабораторную работу
|
||||
ЛР запускается через файл `zavrazhnova_svetlana_lab_2.py`
|
||||
|
||||
### Какие технологии использовали
|
||||
импорт класса `MinMaxScaler`, выполняющего масштабирование данных до заданного диапазона (от 0 до 1).
|
||||
Необходимость его использования объясняется следующим: каждая модель регрессии дает оценки
|
||||
важности признаков в своем диапазоне. Для того чтобы найти признак с максимальной средней важностью по трем моделям, нам необходимо привести выданные ими оценки к одному виду.
|
||||
Модели линейной регрессии, ридж-регрессии и лассо-регрессии из библиотеки `scikit-learn`
|
||||
|
||||
### Что делает
|
||||
Применение регрессионных моделей для определения важности признаков.
|
||||
|
||||
Результат работы программы показывает ранжирование признаков по их значимости для задачи. Чем больше значение ранга, тем более значимый признак.
|
||||
Полученные ранги можно использовать для отбора наиболее значимых признаков и сокращения размерности данных.
|
||||
|
||||
### Примеры выходных значений
|
||||
|
||||

|
||||
|
||||
В данном случае, в соответствии с полученными результатами, можно сказать следующее:
|
||||
|
||||
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), что указывает на их минимальную значимость или наличие практически нулевых эффектов.
|
||||
|
||||
BIN
zavrazhnova_svetlana_lab_2/result.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
54
zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py
Normal 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]}')
|
||||