diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index b610ec7..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1695412818437 - - - - - - - \ No newline at end of file diff --git a/arutunyan_dmitry_lab_1/1.png b/arutunyan_dmitry_lab_1/1.png new file mode 100644 index 0000000..e8cfe6a Binary files /dev/null and b/arutunyan_dmitry_lab_1/1.png differ diff --git a/arutunyan_dmitry_lab_1/2.png b/arutunyan_dmitry_lab_1/2.png new file mode 100644 index 0000000..8f018c9 Binary files /dev/null and b/arutunyan_dmitry_lab_1/2.png differ diff --git a/arutunyan_dmitry_lab_1/3.png b/arutunyan_dmitry_lab_1/3.png new file mode 100644 index 0000000..53b2e59 Binary files /dev/null and b/arutunyan_dmitry_lab_1/3.png differ diff --git a/arutunyan_dmitry_lab_1/README.md b/arutunyan_dmitry_lab_1/README.md new file mode 100644 index 0000000..afcc89b --- /dev/null +++ b/arutunyan_dmitry_lab_1/README.md @@ -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 "") + +### Вывод +Наиболее низкое среднеквадратичное отклонение и наиболее высокий коэфициент детерминации показала модель линейной регрессии, а это значит что она наилучшем образом подходит для работы со сгенерированным данными. В этом случае мы можем предположить что данные выборки находятся на небольшом расстоянии друг от друга и располагаются линейно. \ No newline at end of file diff --git a/arutunyan_dmitry_lab_1/main.py b/arutunyan_dmitry_lab_1/main.py new file mode 100644 index 0000000..f7a0003 --- /dev/null +++ b/arutunyan_dmitry_lab_1/main.py @@ -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') + + diff --git a/arutunyan_dmitry_lab_1/result.png b/arutunyan_dmitry_lab_1/result.png new file mode 100644 index 0000000..f609835 Binary files /dev/null and b/arutunyan_dmitry_lab_1/result.png differ