diff --git a/mashkova_margarita_lab_1/README.md b/mashkova_margarita_lab_1/README.md new file mode 100644 index 0000000..98e0e8f --- /dev/null +++ b/mashkova_margarita_lab_1/README.md @@ -0,0 +1,59 @@ +# Лабораторная работа №1 +## ПИбд-42 Машкова Маргарита (Вариант 19) +## Задание +Cгенерировать определенный тип данных и сравнить на нем 3 модели по варианту. +Построить графики, отобразить качество моделей, объяснить полученные результаты. + +### Данные: +> make_moons (noise=0.3, random_state=rs) + +### Модели: + +> - Линейная регрессия +> - Полиномиальная регрессия (со степенью 5) +> - Гребневая полиномиальная регрессия (со степенью 5, alpha= 1.0) + +## Запуск программы +Для запуска программы необходимо запустить файл main.py + +## Используемые технологии +> **Язык программирования:** python +> +> **Библиотеки:** +> - `matplotlib` - пакет для визуализации данных. +> - `sklearn` - предоставляет широкий спектр инструментов для машинного обучения, статистики и анализа данных. +## Описание работы программы + +Изначально генерируются синтетические данные Х и у для проведения экспериментов при помощи функции `make_moons` с заданными параметрами. +Функция `train_test_split` делит данные так, что тестовая выборка составляет 40% от исходного набора данных. +Разделение происходит случайным образом (т.е. элементы берутся из исходной выборки не последовательно). +После чего для каждой из заданных по варианту моделей выполняются следующие действия: +1. Создание модели с заданными параметрами. +2. Обучение модели на исходных данных. +3. Предсказание модели на тестовых данных. +4. Оценка качества модели по 3 метрикам: + +* **Коэффициент детерминации**: метрика, которая измеряет, насколько хорошо модель соответствует данным. +Принимает значения от 0 до 1, где 1 означает идеальное соответствие модели данным, а значения ближе к 0 указывают на то, +что модель плохо объясняет вариацию в данных. Для вычисления коэффициента детерминации модели используется метод `score` библиотеки scikit-learn. + +* **Средняя абсолютная ошибка (MAE):** Для вычисления данной метрики используется метод `mean_absolute_error` библиотеки scikit-learn. +* **Средняя квадратичная ошибка (MSE):** Для вычисления данной метрики используется метод `mean_squared_error` библиотеки scikit-learn. + +Последние 2 метрики измеряют разницу между предсказанными значениями модели и фактическими значениями. +Меньшие значения MAE и MSE указывают на лучшую производительность модели. + +Вычисленные значения метрик выводятся в консоль. + +После чего строятся графики, отображающие работу моделей. На первом графике отображаются ожидаемые результаты предсказания, +на остальных - предсказания моделей. Чем меньше прозрачных точек - тем лучше отработала модель. + +## Тесты + +![Вывод в консоли](console.png) + +![Графики](plots.png) + +**Вывод:** исходя из полученных результатов, схожую хорошую производительность имеют +линейная регрессия и гребневая полиномиальная регрессия. +Самую низкую производительность имеет полиномиальная регрессия. diff --git a/mashkova_margarita_lab_1/console.png b/mashkova_margarita_lab_1/console.png new file mode 100644 index 0000000..aca47d5a Binary files /dev/null and b/mashkova_margarita_lab_1/console.png differ diff --git a/mashkova_margarita_lab_1/main.py b/mashkova_margarita_lab_1/main.py new file mode 100644 index 0000000..6364850 --- /dev/null +++ b/mashkova_margarita_lab_1/main.py @@ -0,0 +1,85 @@ +from random import randrange +from sklearn.datasets import make_moons +from sklearn.model_selection import train_test_split +from sklearn.linear_model import LinearRegression +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import make_pipeline +from sklearn.linear_model import Ridge +from sklearn.metrics import mean_absolute_error, mean_squared_error +import matplotlib.pyplot as plt + +rs = randrange(42) + +# Генерация данных +X, y = make_moons(noise=0.3, random_state=rs) +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=rs) + +# Линейная регрессия +linear = LinearRegression() +# Обучение модели +linear.fit(X_train, y_train) +# Предсказание на тестовых данных +y_pred_linear = linear.predict(X_test) +# Оценка модели на тестовых данных (коэффициент детерминации) +linear_score = linear.score(X_test, y_test) +# Оценка модели на тестовых данных (cредняя абсолютная ошибка) +linear_mae = mean_absolute_error(y_test, y_pred_linear) +# Оценка модели на тестовых данных (cредняя квадратичная ошибка) +linear_mse = mean_squared_error(y_test, y_pred_linear) + +# Полиномиальная регрессия +poly = make_pipeline(PolynomialFeatures(degree=5), LinearRegression()) +# Обучение модели +poly.fit(X_train, y_train) +# Предсказание на тестовых данных +y_pred_poly = poly.predict(X_test) +# Оценка модели на тестовых данных (коэффициент детерминации) +poly_score = poly.score(X_test, y_test) +# Оценка модели на тестовых данных (cредняя абсолютная ошибка) +poly_mae = mean_absolute_error(y_test, y_pred_poly) +# Оценка модели на тестовых данных (cредняя квадратичная ошибка) +poly_mse = mean_squared_error(y_test, y_pred_poly) + +# Гребневая полиномиальная регрессия +ridge = make_pipeline(PolynomialFeatures(degree=5), Ridge(alpha=1.0)) +# Обучение модели +ridge.fit(X_train, y_train) +# Предсказание на тестовых данных +y_pred_ridge = ridge.predict(X_test) +# Оценка модели на тестовых данных (коэффициент детерминации) +ridge_score = ridge.score(X_test, y_test) +# Оценка модели на тестовых данных (cредняя абсолютная ошибка) +ridge_mae = mean_absolute_error(y_test, y_pred_ridge) +# Оценка модели на тестовых данных (cредняя квадратичная ошибка) +ridge_mse = mean_squared_error(y_test, y_pred_ridge) + +# Вывод оценки качества моделей в консоль +print("Оценка качества предсказания моделей на тестовых данных:\n") + +print("Линейная регрессия:") +print("Коэффициент детерминации: %f" % linear_score) +print("Средняя абсолютная ошибка: %f" % linear_mae) +print("Средняя квадратичная ошибка: %f\n" % linear_mse) + +print("Полиномиальная регрессия:") +print("Коэффициент детерминации: %f" % poly_score) +print("Средняя абсолютная ошибка: %f" % poly_mae) +print("Средняя квадратичная ошибка: %f\n" % poly_mse) + +print("Гребневая полиномиальная регрессия:") +print("Коэффициент детерминации: %f" % ridge_score) +print("Средняя абсолютная ошибка: %f" % ridge_mae) +print("Средняя квадратичная ошибка: %f\n" % ridge_mse) + +# Отображение графиков +fig, axs = plt.subplots(1, 4, figsize=(15, 5)) +axs[0].set_title("Исходные тестовые данные") +axs[0].scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap="bwr") +axs[1].set_title("Линейная регрессия") +axs[1].scatter(X_test[:, 0], X_test[:, 1], c=y_pred_linear, cmap="bwr") +axs[2].set_title("Полиномиальная регрессия") +axs[2].scatter(X_test[:, 0], X_test[:, 1], c=y_pred_poly, cmap="bwr") +axs[3].set_title("Гребневая полиномиальная регрессия") +axs[3].scatter(X_test[:, 0], X_test[:, 1], c=y_pred_ridge, cmap="bwr") +plt.savefig('plots.png') +plt.show() diff --git a/mashkova_margarita_lab_1/plots.png b/mashkova_margarita_lab_1/plots.png new file mode 100644 index 0000000..4963fc3 Binary files /dev/null and b/mashkova_margarita_lab_1/plots.png differ