IIS_2023_1/arutunyan_dmitry_lab_1/main.py

90 lines
6.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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')