diff --git a/basharin_sevastyan_lab_1/README.md b/basharin_sevastyan_lab_1/README.md new file mode 100644 index 0000000..52d2372 --- /dev/null +++ b/basharin_sevastyan_lab_1/README.md @@ -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 "") + +### Вывод +Наиболее низкое среднеквадратичное отклонение и наиболее высокий коэффициент детерминации показала модель полиномиальной и полиномиальной гребневой регрессии. Это означает, что они являются лучшими моделями для данного набора данных. \ No newline at end of file diff --git a/basharin_sevastyan_lab_1/linear.png b/basharin_sevastyan_lab_1/linear.png new file mode 100644 index 0000000..05b47d0 Binary files /dev/null and b/basharin_sevastyan_lab_1/linear.png differ diff --git a/basharin_sevastyan_lab_1/main.py b/basharin_sevastyan_lab_1/main.py new file mode 100644 index 0000000..f767893 --- /dev/null +++ b/basharin_sevastyan_lab_1/main.py @@ -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() diff --git a/basharin_sevastyan_lab_1/poly.png b/basharin_sevastyan_lab_1/poly.png new file mode 100644 index 0000000..51d45dd Binary files /dev/null and b/basharin_sevastyan_lab_1/poly.png differ diff --git a/basharin_sevastyan_lab_1/result.png b/basharin_sevastyan_lab_1/result.png new file mode 100644 index 0000000..75ebdc4 Binary files /dev/null and b/basharin_sevastyan_lab_1/result.png differ diff --git a/basharin_sevastyan_lab_1/ridge.png b/basharin_sevastyan_lab_1/ridge.png new file mode 100644 index 0000000..43e0287 Binary files /dev/null and b/basharin_sevastyan_lab_1/ridge.png differ