90 lines
6.2 KiB
Python
90 lines
6.2 KiB
Python
|
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')
|
|||
|
|
|||
|
|