Merge pull request 'arutunyan_dmitry_lab_1' (#21) from arutunyan_dmitry_lab_1 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/21
This commit is contained in:
Alexey 2023-10-08 13:43:27 +04:00
commit 964a9042fa
7 changed files with 182 additions and 92 deletions

View File

@ -1,92 +0,0 @@
<?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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@ -0,0 +1,93 @@
## Лабораторная работа 1. Вариант 4.
### Задание
Построить графики, отобразить
качество моделей, объяснить полученные результаты.
Данные: `make_moons (noise=0.3, random_state=rs)`
Модели:
- Линейная регресся
- Полиномиальная регрессия (со степенью 4)
- Гребневая полиномиальная регресся (со степенью 4, alpha = 1.0)
### Как запустить
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
```
python main.py
```
После этого в папке static сгенерируются 4 графика, по которым оценивается результат выполнения программы.
### Используемые технологии
- Библиотека `pyplot`, используемая для построения графиков.
- Библиотека `sklearn` - большой набор функционала для анализа данных. Из неё были использованы инструменты:
- `make_moons` - генератор случайных структурированных данных
- `train_test_split` - разделитель данных на обучающиую и тестовую выборки
- `LinearRegression` - инструмент работы с моделью "Линейная регрессия"
- `Ridge` - инструмент работы с моделью "Гребневая регрессия"
- `PolynomialFeatures` - инструмент работы с моделью "Полиномиальная регрессия"
- `metrics` - набор инструменов для оценки моделей
- Библиотека `numpy`, используемая для обработки массивов данных и вычислений
### Описание работы
Программа генерирует данные для обучения и тестирования моделей, стандартизирует данные и разделяет их на обучающую и тестовую выборки.
```python
X, y = make_moons(noise=0.3, random_state=None)
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)
```
После чего, на данных `X_train` и `y_train` производится обучение моделей, а на данных `X_test` и `y_test` - оценка их качества.
Поскольку все модели в задании регрессионные, результаты работы будем оценивать через решение задачи предсказания. Это позволит нам использовать для оценки только `y` данные, что облегчит построение графиков.
Оценка качества моделей будет производиться по двум критериям - среднеквадратическому отклонению `mid_square` от истинного результата и коэфициенту детерминации `det_kp`. Чем среднеквадратическая ошибка меньше и чем коэфициент детерминации больше, тем лучше модель показала себя на данной выборке.
```python
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)), 3)
det_kp = np.round(metrics.r2_score(y_test, y_predict), 2)
```
Где `y_predict` - решение задачи предсказания. Для наглядности, оценочные параметры округлим с помощью функции `round` до 3х и 2х знаков после запятой.
#### Линейная регрессия
Для создания модели линейной регрессии воспользуемся объектом `LinearRegression()`, обучим модель и заставим её предсказать значения `y` на тестовой выборке `x_text`.
```python
linear = LinearRegression()
linear.fit(X_train, y_train)
y_predict = linear.predict(X_test)
```
Построим график для оценки результатов:
![](1.png "")
#### Полиномиальная регрессия
Линейная регрессия является разновидностью полиномиальной регрессии со степенью ведущего члена равной 1. Чтобы построить модель полиномиальной регрессии со степенью 4 необходимо к данным модели линейной регрессии добавить 3 недостающих члена, возведённых в соответствующие степени 2, 3 и 4.
```python
poly = PolynomialFeatures(degree=4, include_bias=False)
x_poly_train = poly.fit_transform(X_train)
x_poly_test = poly.fit_transform(X_test)
```
Где `degree` - старшая степень полинома, `include_bias` - приведение свободного члена полинома к 0.
Обучение и прогнозирование модели далее производится также, как с моделью линейной регрессии, но уде на данных `x_poly_train` и `x_poly_test`
Построим график для оценки результатов:
![](2.png "")
#### Полиномиальная гребневая регрессия
Полиномиальная гребневая регрессия - это та же самая полиномиальная регрессия, но построенная с использованием усредняющего коэфициента. Для этого воспользуемся объёктом `Ridge()` и построим модель аналогично первым.
```python
ridge = Ridge(alpha=1.0)
ridge.fit(x_poly_train, y_train)
y_predict = ridge.predict(x_poly_test)
```
Построим график для оценки результатов:
![](3.png "")
Теперь построим график для сравнения работы всех моделей и выберем наилучшую:
![](result.png "")
### Вывод
Наиболее низкое среднеквадратичное отклонение и наиболее высокий коэфициент детерминации показала модель линейной регрессии, а это значит что она наилучшем образом подходит для работы со сгенерированным данными. В этом случае мы можем предположить что данные выборки находятся на небольшом расстоянии друг от друга и располагаются линейно.

View File

@ -0,0 +1,89 @@
import numpy as np
from matplotlib import pyplot as plt
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.datasets import make_moons
X, y = make_moons(noise=0.3, random_state=None) # Генерация данных с пересечениями признаков
X = StandardScaler().fit_transform(X) # Стандартизация. Удаление средних, увеличение дисперсии до 1
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42) # Разделение данных на обучающую и тестовую выборки
# Модель линейной регрессии
def lr_prediction():
linear = LinearRegression() # Создание модели
linear.fit(X_train, y_train) # Обучение модели
y_predict = linear.predict(X_test) # Решение задачи предсказания
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)), 3) # Рассчёт среднеквадратичной ошибки модели
det_kp = np.round(metrics.r2_score(y_test, y_predict), 2) # Рассчёт коэфициента детерминации модели
return "Модель линейной регрессии", y_predict, mid_square, det_kp
# Модель полиномиальной регрессии
def poly_lr_prediction():
poly = PolynomialFeatures(degree=4, include_bias=False) # Создание характеристик полиномиальной модели (степень - 4, обнуление свободного члена - нет)
x_poly_train = poly.fit_transform(X_train) # Трансформация выборки обучения (добавление недостающих аргументов многочлена 4го порядка)
x_poly_test = poly.fit_transform(X_test) # Трансформация тестовой выборки (добавление недостающих аргументов многочлена 4го порядка)
linear = LinearRegression() # Создание модели
linear.fit(x_poly_train, y_train) # Обучение модели
y_predict = linear.predict(x_poly_test) # Решение задачи предсказания
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)), 3) # Рассчёт среднеквадратичной ошибки модели
det_kp = np.round(metrics.r2_score(y_test, y_predict), 2) # Рассчёт коэфициента детерминации модели
return "Модель полиномиальной регрессии", y_predict, mid_square, det_kp
# Модель полиномиальной гребневой регрессии
def poly_rg_prediction():
poly = PolynomialFeatures(degree=4, include_bias=False) # Создание характеристик полиномиальной модели (степень - 4, обнуление свободного члена - нет)
x_poly_train = poly.fit_transform(X_train) # Трансформация выборки обучения (добавление недостающих аргументов многочлена 4го порядка)
x_poly_test = poly.fit_transform(X_test) # Трансформация тестовой выборки (добавление недостающих аргументов многочлена 4го порядка)
ridge = Ridge(alpha=1.0) # Создание гребневой модели (уср. коэф - 1.0)
ridge.fit(x_poly_train, y_train) # Обучение модели
y_predict = ridge.predict(x_poly_test) # Решение задачи предсказания
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)), 3) # Рассчёт среднеквадратичной ошибки модели
det_kp = np.round(metrics.r2_score(y_test, y_predict), 2) # Рассчёт коэфициента детерминации модели
return "Модель полиномиальной регрессии", y_predict, mid_square, det_kp
# Создание графиков поотдельности (для себя)
def make_plots(models):
i = 0
for model in models:
plt.plot(y_test, c="red", label="\"y\" исходная") # Создание графика исходной функции
plt.plot(model[1], c="green", label="\"y\" предсказанная \n"
"Ср^2 = " + str(model[2]) + "\n"
"Кд = " + str(model[3])) # Создание графика предсказанной функции
plt.legend(loc='lower left')
plt.title(model[0])
plt.savefig('static/' + str(i + 1) + '.png')
plt.close()
i += 1
if __name__ == '__main__':
models = lr_prediction(), poly_lr_prediction(), poly_rg_prediction()
make_plots(models)
fig, axs = plt.subplots(3, 1, layout='constrained') # Создание общего графика для сравнения моделей
i = 0
for model in models:
fig.set_figwidth(6)
fig.set_figheight(10)
axs[i].set_title(model[0])
axs[i].plot(y_test, c="red", label="\"y\" исходная")
axs[i].plot(model[1], c="green", label="\"y\" предсказанная \n"
"Ср^2 = " + str(model[2]) + "\n"
"Кд = " + str(model[3]))
axs[i].legend(loc='lower left')
i += 1
plt.savefig('static/result.png')

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB