Merge pull request 'basharin_sevastyan_lab_1 is ready' (#73) from basharin_sevastyan_lab_1 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/73
This commit is contained in:
commit
4fad5585c1
83
basharin_sevastyan_lab_1/README.md
Normal file
83
basharin_sevastyan_lab_1/README.md
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
## Лабораторная работа 1. Вариант 4.
|
||||||
|
### Задание
|
||||||
|
Построить графики, отобразить
|
||||||
|
качество моделей, объяснить полученные результаты.
|
||||||
|
|
||||||
|
Данные: `make_circles (noise=0.2, factor=0.5, random_state=rs)`
|
||||||
|
|
||||||
|
Модели:
|
||||||
|
- Линейная регресся
|
||||||
|
- Полиномиальная регрессия (со степенью 4)
|
||||||
|
- Гребневая полиномиальная регресся (со степенью 4, alpha = 1.0)
|
||||||
|
|
||||||
|
### Как запустить
|
||||||
|
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
|
||||||
|
```
|
||||||
|
python main.py
|
||||||
|
```
|
||||||
|
После будет запущена программа и сгенерированы 3 графика.
|
||||||
|
|
||||||
|
### Используемые технологии
|
||||||
|
- `numpy` (псевдоним `np`): NumPy - это библиотека для научных вычислений в Python.
|
||||||
|
- `matplotlib.pyplot` (псевдоним `plt`): Matplotlib - это библиотека для создания статических, анимированных и интерактивных визуализаций в Python. `pyplot` - это модуль Matplotlib, который используется для создания графиков и диаграмм.
|
||||||
|
- `matplotlib.colors.ListedColormap` - этот модуль Matplotlib используется для создания цветных схем цветовых карт, которые могут быть использованы для визуализации данных.
|
||||||
|
- `sklearn` (scikit-learn): Scikit-learn - это библиотека для машинного обучения и анализа данных в Python. Из данной библиотеки были использованы следующие модули:
|
||||||
|
- `model_selection` - Этот модуль scikit-learn предоставляет инструменты для разделения данных на обучающие и тестовые наборы.
|
||||||
|
- `linear_model` - содержит реализации линейных моделей, таких как линейная регрессия, логистическая регрессия и другие.
|
||||||
|
- `pipeline` - позволяет объединить несколько этапов обработки данных и построения моделей в одну конвейерную цепочку.
|
||||||
|
- `PolynomialFeatures` - Этот класс scikit-learn используется для генерации полиномиальных признаков, позволяя моделям учитывать нелинейные зависимости в данных.
|
||||||
|
- `make_circles` - Эта функция scikit-learn создает набор данных, представляющий собой два класса, расположенных в форме двух пересекающихся окружностей. Это удобно для демонстрации работы различных моделей классификации.
|
||||||
|
- `LinearRegression` - линейная регрессия - это алгоритм машинного обучения, используемый для задач бинарной классификации.
|
||||||
|
|
||||||
|
### Описание работы
|
||||||
|
Программа генерирует данные, разделяет данные на тестовые и обучающие для моделей по заданию.
|
||||||
|
```python
|
||||||
|
rs = randrange(50)
|
||||||
|
X, y = make_circles(noise=0.2, factor=0.5, random_state=rs)
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=rs)
|
||||||
|
```
|
||||||
|
`X_train` и `y_train` используются для обучения, а на данных `X_test` и `y_test` - оценка их качества.
|
||||||
|
|
||||||
|
Поскольку все модели в задании регрессионные, результаты работы будем оценивать через решение задачи предсказания.
|
||||||
|
|
||||||
|
Для оценки будем использовать следующие критерии: среднеквадратическому отклонению и коэфициенту детерминации. Чем ошибка меньше и чем коэфициент детерминации больше, тем лучше.
|
||||||
|
```python
|
||||||
|
np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3) #среднеквадратическое отклонение
|
||||||
|
np.round(metrics.r2_score(y_test, y_predict), 2) #коэфициент детерминации
|
||||||
|
```
|
||||||
|
Оценочные параметры округлены с помощью функции `round` до 3х и 2х знаков после запятой.
|
||||||
|
|
||||||
|
### Линейная регрессия
|
||||||
|
Для создания модели линейной регрессии воспользуемся `LinearRegression`.
|
||||||
|
```python
|
||||||
|
linear_reg = LinearRegression()
|
||||||
|
```
|
||||||
|
Обучим её и предскажем с её помощью `y` на тестовой выборке `x_text`.
|
||||||
|
```python
|
||||||
|
model.fit(X_train, y_train)
|
||||||
|
y_predict = model.predict(X_test)
|
||||||
|
```
|
||||||
|
График для оценки результатов:
|
||||||
|
![](linear.png "")
|
||||||
|
|
||||||
|
#### Полиномиальная регрессия
|
||||||
|
Добавим 3 недостающих члена к линейной модели, возведённых в соответствующие степени 2, 3 и 4.
|
||||||
|
```python
|
||||||
|
poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(random_state=rs))
|
||||||
|
```
|
||||||
|
График для оценки результатов:
|
||||||
|
![](poly.png "")
|
||||||
|
|
||||||
|
#### Полиномиальная гребневая регрессия
|
||||||
|
Линейная регрессия является разновидностью полиномиальной регрессии со степенью ведущего члена равной 1.
|
||||||
|
```python
|
||||||
|
ridge_poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(penalty='l2', C=1.0, random_state=rs))
|
||||||
|
```
|
||||||
|
График для оценки результатов:
|
||||||
|
![](ridge.png "")
|
||||||
|
|
||||||
|
Точность измерений:
|
||||||
|
![](result.png "")
|
||||||
|
|
||||||
|
### Вывод
|
||||||
|
Наиболее низкое среднеквадратичное отклонение и наиболее высокий коэффициент детерминации показала модель полиномиальной и полиномиальной гребневой регрессии. Это означает, что они являются лучшими моделями для данного набора данных.
|
BIN
basharin_sevastyan_lab_1/linear.png
Normal file
BIN
basharin_sevastyan_lab_1/linear.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
60
basharin_sevastyan_lab_1/main.py
Normal file
60
basharin_sevastyan_lab_1/main.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
from random import randrange
|
||||||
|
import numpy as np
|
||||||
|
from matplotlib import pyplot as plt
|
||||||
|
from matplotlib.colors import ListedColormap
|
||||||
|
from sklearn import metrics
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.linear_model import LinearRegression, LogisticRegression
|
||||||
|
from sklearn.pipeline import make_pipeline
|
||||||
|
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
|
||||||
|
from sklearn.datasets import make_circles
|
||||||
|
|
||||||
|
rs = randrange(50)
|
||||||
|
X, y = make_circles(noise=0.2, factor=0.5, random_state=rs) # Сгенерируем данные
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
|
||||||
|
random_state=rs) # Разделим данные на обучающий и тестовый наборы
|
||||||
|
|
||||||
|
# Линейная модель
|
||||||
|
linear_reg = LinearRegression()
|
||||||
|
# Полиномиальная регрессия (со степенью 4)
|
||||||
|
poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(random_state=rs))
|
||||||
|
# Гребневая полиномиальная регрессия (со степенью 4 и alpha=1.0)
|
||||||
|
ridge_poly_reg = make_pipeline(PolynomialFeatures(degree=4), StandardScaler(), LogisticRegression(penalty='l2', C=1.0,
|
||||||
|
random_state=rs))
|
||||||
|
|
||||||
|
|
||||||
|
# Обучение моделей
|
||||||
|
def mid_sq_n_det(name, model):
|
||||||
|
model.fit(X_train, y_train)
|
||||||
|
y_predict = model.predict(X_test)
|
||||||
|
print(f'Рассчёт среднеквадратичной ошибки для {name}: '
|
||||||
|
f'{np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3)}') # Рассчёт среднеквадратичной ошибки модели
|
||||||
|
print(f'Рассчёт коэфициента детерминации для {name}: {np.round(metrics.r2_score(y_test, y_predict), 2)}') # Рассчёт коэфициента детерминации модели
|
||||||
|
return name, model
|
||||||
|
|
||||||
|
|
||||||
|
# Графики
|
||||||
|
models = [mid_sq_n_det("Линейная регрессия", linear_reg),
|
||||||
|
mid_sq_n_det("Полиномиальная регрессия (со степенью 4)", poly_reg),
|
||||||
|
mid_sq_n_det("Гребневая полиномиальная регрессия (со степенью 4, alpha = 1.0)", ridge_poly_reg)]
|
||||||
|
|
||||||
|
cmap_background = ListedColormap(['#FFAAAA', '#AAAAFF'])
|
||||||
|
cmap_points = ListedColormap(['#FF0000', '#0000FF'])
|
||||||
|
|
||||||
|
plt.figure(figsize=(15, 4))
|
||||||
|
for i, (name, model) in enumerate(models):
|
||||||
|
plt.subplot(1, 3, i + 1)
|
||||||
|
xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100),
|
||||||
|
np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 100))
|
||||||
|
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
|
||||||
|
Z = Z.reshape(xx.shape)
|
||||||
|
plt.contourf(xx, yy, Z, cmap=cmap_background, alpha=0.5)
|
||||||
|
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_points, marker='o', label='Тестовые точки')
|
||||||
|
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_points, marker='x', label='Обучающие точки')
|
||||||
|
plt.legend()
|
||||||
|
plt.title(name)
|
||||||
|
plt.text(0.5, -1.2, 'Красный класс', color='r', fontsize=12)
|
||||||
|
plt.text(0.5, -1.7, 'Синий класс', color='b', fontsize=12)
|
||||||
|
|
||||||
|
plt.tight_layout()
|
||||||
|
plt.show()
|
BIN
basharin_sevastyan_lab_1/poly.png
Normal file
BIN
basharin_sevastyan_lab_1/poly.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 42 KiB |
BIN
basharin_sevastyan_lab_1/result.png
Normal file
BIN
basharin_sevastyan_lab_1/result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
BIN
basharin_sevastyan_lab_1/ridge.png
Normal file
BIN
basharin_sevastyan_lab_1/ridge.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Loading…
Reference in New Issue
Block a user