IIS_2023_1/arutunyan_dmitry_lab_1/main.py

90 lines
6.2 KiB
Python
Raw Normal View History

2023-10-07 19:28:43 +04:00
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')