Merge pull request 'martysheva lab1 don' (#28) from martysheva_tamara_lab_1 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/28
This commit is contained in:
Alexey 2023-10-11 20:07:40 +04:00
commit 0446928927
5 changed files with 103 additions and 0 deletions

View File

@ -0,0 +1,46 @@
# Лабораторная работа 1. Работа с типовыми наборами данных и различными моделями
### Вариант № 18
Используя код из пункта «Регуляризация и сеть прямого распространения», сгенерируйте определенный тип данных и сравните на нем 3 модели (по варианту). Постройте графики, отобразите качество моделей, объясните полученные результаты.
**Данные**: make_classification (n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
**Модели**:
* Линейную регрессию
* Персептрон
* Гребневую полиномиальную регрессию (со степенью 3, alpha = 1.0)
***
## *Как запустить лабораторную работу:*
Чтобы запустить программу, открываем файл lab1 в PyCharm и нажимаем на зеленый треугольник в правом верхнем углу.
***
## *Использованные технологии:*
**Scikit-learn** - один из наиболее широко используемых пакетов Python для Data Science и Machine Learning. Он позволяет выполнять множество операций и предоставляет множество алгоритмов.
**Matplotlib** — это комплексная библиотека для создания статических, анимированных и интерактивных визуализаций на Python.
**NumPy** — это фундаментальный пакет для научных вычислений на Python.
***
## *Что делает ЛР:*
В данной работе генерируется определенный тип данных (при помощи генератора линейных задач make_classification). На данном типе данных проверяется работа трёх моделей: линейная регрессия, персептрон и гребневая полиномиальная регрессия.
**Результатом работы программы** являются: вывод показателей качества моделей (в консоли) и 3 изображения с графиками, на которых показаны сами данные, разбитые на два класса (тренировочные и тестовые), а также разбиение по классам по моделям.
***
## *Пример выходных данных:*
>Вывод в консоли:
![](https://sun9-27.userapi.com/impg/Xc_p5nTj7wWRVxuKx8PXcvnnJcPRYXM5PijZsA/bQJSoWPqZqo.jpg?size=602x76&quality=96&sign=5797d8960621a547a08ba7bdc1e83965&type=album)
>График линейной регрессии:
![](https://sun9-28.userapi.com/impg/DaF38aVW1XXfrsbt8d1eNYgyssVpffN3kgZTpA/UvJiTp6ACW0.jpg?size=604x423&quality=96&sign=74a0543fa50da772fc72214c6d695e81&type=album)
>График персептрона:
![](https://sun9-72.userapi.com/impg/6NLpLzpUvR5EVGIy2kPAwLWp7TGjUZWdL3Jb2w/Pbu6IPLsUuc.jpg?size=604x423&quality=96&sign=83e2340b57fe60de0adda95fe1ad686d&type=album)
>График гребневой полиномиальной регрессии:
![](https://sun9-27.userapi.com/impg/DzhYdeV18GWPbay__0W88Zg6oEDipT62zVB2Og/k5SfwXDyKhU.jpg?size=604x423&quality=96&sign=a6c08a960b55b6aec9aa0aa2307d1978&type=album)
***
**Вывод**: Для сгенерированного типа данных лучшей моделью оказалась модель персептрона (с точностью 0.795), а худшей модель линейной регрессии (с точностью 0.44).
Персептрон может хорошо работать в задачах классификации, если данные хорошо разделимы линейно. Гребневая полиномиальная регрессия показала среднюю точность.
Дополнительно в данные был добавлен случайный шум, что тоже могло повлиять на результаты оценки качества моделей.

View File

@ -0,0 +1,57 @@
import numpy as np
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression, Perceptron, Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
#Создаем набор данных
X, Y = make_classification(n_samples=500, 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)
X = StandardScaler().fit_transform(X)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=.4, random_state=40)
#Создаем модели
linear = LinearRegression()
perseptron = Perceptron()
ridge = Ridge(alpha=1.0)
polynomial_features = PolynomialFeatures(degree=3)
rid_poly = Pipeline([("polynomial_features", polynomial_features),("ridge_regression", ridge)])
#Тренируем модель
def train(model, description):
model.fit(X_train, Y_train)
Y_pred = model.predict(X_test)
print(description + ", качество модели = ", model.score(X_test, Y_test))
#Выводим результат на график
def plot(model, name):
cmap = ListedColormap(['#8b00ff', '#ff294d'])
plt.figure(figsize=(10, 7))
subplot = plt.subplot(111)
h = .5 # шаг регулярной сетки
x0_min, x0_max = X[:, 0].min() - .5, X[:, 0].max() + .5
x1_min, x1_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx0, xx1 = np.meshgrid(np.arange(x0_min, x0_max, h), np.arange(x1_min, x1_max, h))
Z = model.predict(np.c_[xx0.ravel(), xx1.ravel()])
Z = Z.reshape(xx0.shape)
subplot.contourf(xx0, xx1, Z, cmap=cmap, alpha=.3)
subplot.scatter(X_train[:, 0], X_train[:, 1], c=Y_train, cmap=cmap)
subplot.scatter(X_test[:, 0], X_test[:, 1], c=Y_test, cmap=cmap, alpha=0.4)
plt.savefig(name + ".png")
#Вызов функций
train(linear, "Линейная регрессия")
train(perseptron, "Персептрон")
train(rid_poly, "Гребневая полиномиальная регрессия")
plot(linear, "linear_plot")
plot(perseptron, "perseptron_plot")
plot(rid_poly, "rid_poly_plot")

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB