From 9a7b986e007f8d2f861b4f4f6f5b97079c6bfb63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2?= Date: Tue, 19 Sep 2023 10:19:50 +0400 Subject: [PATCH] alexandrov_dmitrii_lab_1 is ready --- alexandrov_dmitrii_lab_1/lab1.py | 98 ++++++++++++++++++++++++++++++ alexandrov_dmitrii_lab_1/readme.md | 46 ++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 alexandrov_dmitrii_lab_1/lab1.py create mode 100644 alexandrov_dmitrii_lab_1/readme.md diff --git a/alexandrov_dmitrii_lab_1/lab1.py b/alexandrov_dmitrii_lab_1/lab1.py new file mode 100644 index 0000000..e60c4ff --- /dev/null +++ b/alexandrov_dmitrii_lab_1/lab1.py @@ -0,0 +1,98 @@ +import random +from matplotlib import pyplot as plt +from matplotlib.colors import ListedColormap +from sklearn.datasets import make_moons +from sklearn.linear_model import LinearRegression, Ridge +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import PolynomialFeatures +from sklearn.pipeline import Pipeline + + +def start(): + rs = random.randrange(10) + rs = 5 + + X, y = make_moons(n_samples=250, noise=0.3, random_state=rs) + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42) + + lin = LinearRegression() + poly = Pipeline([('poly', PolynomialFeatures(degree=3)), + ('linear', LinearRegression())]) + ridge = Pipeline([('poly', PolynomialFeatures(degree=3)), + ('ridge', Ridge(alpha=1.0))]) + + + figure = plt.figure(1, figsize=(16, 9)) + axis = figure.subplots(4, 3) + cm = ListedColormap(['#FF0000', "#0000FF"]) + arr_res = list(range(len(y_test))) + X_scale = list(range(len(y_test))) + + + lin.fit(X_train, y_train) + res_y = lin.predict(X_test) + print(lin.score(X_test, y_test)) + + axis[0, 0].scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm) + axis[1, 0].scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm) + axis[3, 0].plot([i for i in range(len(res_y))], y_test, c="g") + axis[3, 0].plot([i for i in range(len(res_y))], res_y, c="r") + + for i in range(len(X_test)): + arr_res[i] = [X_test[i], res_y[i], y_test[i]] + arr_res = sorted(arr_res, key=lambda x: x[1]) + for i in range(len(X_test)): + X_scale[i] = arr_res[i][0] + res_y[i] = arr_res[i][1] + arr_res[i] = arr_res[i][2] + + axis[2, 0].plot(X_scale, arr_res, c="g") + axis[2, 0].plot(X_scale, res_y, c="r") + + + poly.fit(X_train, y_train) + res_y = poly.predict(X_test) + print(poly.score(X_test, y_test)) + + axis[0, 1].scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm) + axis[1, 1].scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm) + axis[3, 1].plot([i for i in range(len(res_y))], y_test, c="g") + axis[3, 1].plot([i for i in range(len(res_y))], res_y, c="r") + + for i in range(len(X_test)): + arr_res[i] = [X_test[i], res_y[i], y_test[i]] + arr_res = sorted(arr_res, key=lambda x: x[1]) + for i in range(len(X_test)): + X_scale[i] = arr_res[i][0] + res_y[i] = arr_res[i][1] + arr_res[i] = arr_res[i][2] + + axis[2, 1].plot(X_scale, arr_res, c="g") + axis[2, 1].plot(X_scale, res_y, c="r") + + + ridge.fit(X_train, y_train) + res_y = ridge.predict(X_test) + print(ridge.score(X_test, y_test)) + + axis[0, 2].scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm) + axis[1, 2].scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm) + axis[3, 2].plot([i for i in range(len(res_y))], y_test, c="g") + axis[3, 2].plot([i for i in range(len(res_y))], res_y, c="r") + + for i in range(len(X_test)): + arr_res[i] = [X_test[i], res_y[i], y_test[i]] + arr_res = sorted(arr_res, key=lambda x: x[1]) + for i in range(len(X_test)): + X_scale[i] = arr_res[i][0] + res_y[i] = arr_res[i][1] + arr_res[i] = arr_res[i][2] + + axis[2, 2].plot(X_scale, arr_res, c="g") + axis[2, 2].plot(X_scale, res_y, c="r") + + plt.show() + + +start() + diff --git a/alexandrov_dmitrii_lab_1/readme.md b/alexandrov_dmitrii_lab_1/readme.md new file mode 100644 index 0000000..fea4428 --- /dev/null +++ b/alexandrov_dmitrii_lab_1/readme.md @@ -0,0 +1,46 @@ +##Задание +Сгенерировать определенный тип данных и сравнить на нем 3 модели. Построить графики, отобразить качество моделей, объяснить полученные результаты. +Вариант 1. +Данные: make_moons (noise=0.3, random_state=rs) +Модели: +· Линейная регрессия +· Полиномиальная регрессия (со степенью 3) +· Гребневая полиномиальная регрессия (со степенью 3, alpha = 1.0) + +###Запуск программы +Файл lab1.py содержит и запускает программу, аргументов и настройки ~~вроде~~ не требует, + +###Описание программы +Генерирует один из 10 наборов данных, показывает окно с графиками и пишет оценку моделей обучения по заданию. +Использует библиотеки matplotlib для демонстрации графиков и sklearn для создания и использования моделей. + +###Результаты тестирования +Для различных значений rs результаты следующие: +значение - линейная - полиномиальная - гребневая полиномиальная +1 - 0.54 - 0.08 - 0.35 +2 - 0.62 - 0.58 - 0.63 +3 - 0.6 - 0.67 - 0.65 +4 - 0.52 - 0.46 - 0.5 +5 - 0.4 - 0.42 - 0.44 +Из данных результатов можно заключить, что чёткой зависимости точности от выбранной модели нет. + +Однако, после этого я добавил в генератор данных число значений: 500. Результаты оказались более детерминированными: +значение - линейная - полиномиальная - гребневая полиномиальная +1 - 0.54 - 0.63 - 0.63 +2 - 0.52 - 0.63 - 0.62 +3 - 0.56 - 0.64 - 0.64 +4 - 0.5 - 0.63 - 0.62 +5 - 0.5 - 0.52 - 0.53 +Из данных результатов можно заключить, что в общем случае модель линейной регрессии уступает полиномиальным. Гребневая полиномиальная регрессия чаще уступала обычной полиномиальной, однако в незначительном количестве ситуаций была оценена выше - но во всех случаях результаты были близки, поэтому можно с уверенностью предположить, что результаты идентичны и различаются по воле шума обучения. + +После изучения число значений в генераторе заменено на 250, поскольку графики становились неразличимыми^ +значение - линейная - полиномиальная - гребневая полиномиальная +1 - 0.48 - 0.54 - 0.54 +2 - 0.5 - 0.56 - 0.56 +3 - 0.57 - 0.6 - 0.6 +4 - 0.57 - 0.66 - 0.68 +5 - 0.49 - 0.54 - 0.55 +По данным результатам видно, что в большинстве ситуаций уже гребневая полиномиальная регрессия показывает лучшую точность. + +Результаты объясняются следующим образом: +Линейная регрессия будучи математически прямой плохо отражает сложные функции и нелинейные зависимости, в то время как полиномиальная регрессия способна отражать перегибы и изменяющиеся в зависимости от меры значений зависимости. Гребневая полиномиальная вышла идентичной простой полиномиальной из-за одинаковых настроек - обе они по заданию имеют третью степень, а гребневая регрессия имеет слишком малый параметр alpha, что результирует в малом эффекте гребневой функции.