Merge branch 'LabWork5' into LabWork6
# Conflicts: # LabWork01/LoadDB.py
This commit is contained in:
commit
e26d19c3d1
@ -1,202 +0,0 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
import numpy as np
|
|
||||||
import pandas as pd
|
|
||||||
import matplotlib
|
|
||||||
import matplotlib.pyplot as plt
|
|
||||||
import sns
|
|
||||||
from sklearn import metrics
|
|
||||||
from sklearn.model_selection import train_test_split
|
|
||||||
from sklearn.linear_model import LinearRegression
|
|
||||||
|
|
||||||
# INCH = 25.4
|
|
||||||
|
|
||||||
def create_plot_jpg(df: pd.DataFrame, nameFile):
|
|
||||||
# для сохранения диаграммы в конкретной папке
|
|
||||||
script_dir = os.path.dirname(__file__)
|
|
||||||
results_dir = os.path.join(script_dir, '../static/')
|
|
||||||
|
|
||||||
if not os.path.isdir(results_dir):
|
|
||||||
os.makedirs(results_dir)
|
|
||||||
|
|
||||||
# набор атрибутов - независимых переменных - площадь
|
|
||||||
_X = df["Store_Area"].array
|
|
||||||
|
|
||||||
# набор меток - зависимых переменных, значение которых требуется предсказать - выручка
|
|
||||||
_Y = df["Store_Sales"].array
|
|
||||||
|
|
||||||
# делим датафрейм на набор тренировочных данных и данных для тестов, test_size содержит определние соотношения этих наборов
|
|
||||||
X_train, X_test, y_train, y_test = train_test_split(_X, _Y, test_size=0.01, random_state=0)
|
|
||||||
|
|
||||||
regressor = LinearRegression()
|
|
||||||
|
|
||||||
X_train = X_train.reshape(-1, 1)
|
|
||||||
X_test = X_test.reshape(-1, 1)
|
|
||||||
|
|
||||||
regressor.fit(X_train, y_train)
|
|
||||||
|
|
||||||
# массив numpy, который содержит все предсказанные значения для входных значений в серии X_test
|
|
||||||
y_pred = regressor.predict(X_test)
|
|
||||||
|
|
||||||
df.plot(x='Store_Sales', y='Store_Area', style='o')
|
|
||||||
|
|
||||||
plt.title('Зависимость продаж от площади магазина')
|
|
||||||
plt.xlabel('Продажи')
|
|
||||||
plt.ylabel('Площадь')
|
|
||||||
|
|
||||||
plt.savefig(results_dir + nameFile + '.jpg')
|
|
||||||
plt.close()
|
|
||||||
|
|
||||||
# MAE – это среднее абсолютное значение ошибок
|
|
||||||
# MSE – это среднее значение квадратов ошибок
|
|
||||||
# RMSE – это квадратный корень из среднего квадрата ошибок
|
|
||||||
|
|
||||||
listMessages = ['Средняя абсолютная ошибка (MAE): ' + str(metrics.mean_absolute_error(y_test, y_pred)),
|
|
||||||
'Среднеквадратичная ошибка (MSE): ' + str(metrics.mean_squared_error(y_test, y_pred)),
|
|
||||||
'Среднеквадратичная ошибка (RMSE): ' + str(np.sqrt(metrics.mean_squared_error(y_test, y_pred)))]
|
|
||||||
|
|
||||||
return listMessages
|
|
||||||
|
|
||||||
# def graph_regression_plot_sns(
|
|
||||||
# X, Y,
|
|
||||||
# regression_model,
|
|
||||||
# Xmin=None, Xmax=None,
|
|
||||||
# Ymin=None, Ymax=None,
|
|
||||||
# display_residuals=False,
|
|
||||||
# title_figure=None, title_figure_fontsize=None,
|
|
||||||
# title_axes=None, title_axes_fontsize=None,
|
|
||||||
# x_label=None,
|
|
||||||
# y_label=None,
|
|
||||||
# label_fontsize=None, tick_fontsize=12,
|
|
||||||
# label_legend_regr_model='', label_legend_fontsize=12,
|
|
||||||
# s=50, linewidth_regr_model=2,
|
|
||||||
# graph_size=None,
|
|
||||||
# file_name=None):
|
|
||||||
# X = np.array(X)
|
|
||||||
# Y = np.array(Y)
|
|
||||||
# Ycalc = Y - regression_model(X)
|
|
||||||
#
|
|
||||||
# if not (Xmin) and not (Xmax):
|
|
||||||
# Xmin = min(X) * 0.99
|
|
||||||
# Xmax = max(X) * 1.01
|
|
||||||
# if not (Ymin) and not (Ymax):
|
|
||||||
# Ymin = min(Y) * 0.99
|
|
||||||
# Ymax = max(Y) * 1.01
|
|
||||||
#
|
|
||||||
# # график с остатками
|
|
||||||
# # ------------------
|
|
||||||
# if display_residuals:
|
|
||||||
# if not (graph_size):
|
|
||||||
# graph_size = (297 / INCH, 420 / INCH / 1.5)
|
|
||||||
# if not (title_figure_fontsize):
|
|
||||||
# title_figure_fontsize = 18
|
|
||||||
# if not (title_axes_fontsize):
|
|
||||||
# title_axes_fontsize = 16
|
|
||||||
# if not (label_fontsize):
|
|
||||||
# label_fontsize = 13
|
|
||||||
# if not (label_legend_fontsize):
|
|
||||||
# label_legend_fontsize = 12
|
|
||||||
# fig = plt.figure(figsize=graph_size)
|
|
||||||
# fig.suptitle(title_figure, fontsize=title_figure_fontsize)
|
|
||||||
# ax1 = plt.subplot(2, 1, 1)
|
|
||||||
# ax2 = plt.subplot(2, 1, 2)
|
|
||||||
#
|
|
||||||
# # фактические данные
|
|
||||||
# ax1.set_title(title_axes, fontsize=title_axes_fontsize)
|
|
||||||
# sns.scatterplot(
|
|
||||||
# x=X, y=Y,
|
|
||||||
# label='data',
|
|
||||||
# s=s,
|
|
||||||
# color='red',
|
|
||||||
# ax=ax1)
|
|
||||||
# ax1.set_xlim(Xmin, Xmax)
|
|
||||||
# ax1.set_ylim(Ymin, Ymax)
|
|
||||||
# ax1.axvline(x=0, color='k', linewidth=1)
|
|
||||||
# ax1.axhline(y=0, color='k', linewidth=1)
|
|
||||||
# # ax1.set_xlabel(x_label, fontsize = label_fontsize)
|
|
||||||
# ax1.set_ylabel(y_label, fontsize=label_fontsize)
|
|
||||||
# ax1.tick_params(labelsize=tick_fontsize)
|
|
||||||
#
|
|
||||||
# # график регрессионной модели
|
|
||||||
# nx = 100
|
|
||||||
# hx = (Xmax - Xmin) / (nx - 1)
|
|
||||||
# x1 = np.linspace(Xmin, Xmax, nx)
|
|
||||||
# y1 = regression_model(x1)
|
|
||||||
# sns.lineplot(
|
|
||||||
# x=x1, y=y1,
|
|
||||||
# color='blue',
|
|
||||||
# linewidth=linewidth_regr_model,
|
|
||||||
# legend=True,
|
|
||||||
# label=label_legend_regr_model,
|
|
||||||
# ax=ax1)
|
|
||||||
# ax1.legend(prop={'size': label_legend_fontsize})
|
|
||||||
#
|
|
||||||
# # график остатков
|
|
||||||
# ax2.set_title('Residuals', fontsize=title_axes_fontsize)
|
|
||||||
# ax2.set_xlim(Xmin, Xmax)
|
|
||||||
# # ax2.set_ylim(Ymin, Ymax)
|
|
||||||
# sns.scatterplot(
|
|
||||||
# x=X, y=Ycalc,
|
|
||||||
# # label='фактические данные',
|
|
||||||
# s=s,
|
|
||||||
# color='orange',
|
|
||||||
# ax=ax2)
|
|
||||||
#
|
|
||||||
# ax2.axvline(x=0, color='k', linewidth=1)
|
|
||||||
# ax2.axhline(y=0, color='k', linewidth=1)
|
|
||||||
# ax2.set_xlabel(x_label, fontsize=label_fontsize)
|
|
||||||
# ax2.set_ylabel(r'$ΔY = Y - Y_{calc}$', fontsize=label_fontsize)
|
|
||||||
# ax2.tick_params(labelsize=tick_fontsize)
|
|
||||||
#
|
|
||||||
# # график без остатков
|
|
||||||
# # -------------------
|
|
||||||
# else:
|
|
||||||
# if not (graph_size):
|
|
||||||
# graph_size = (297 / INCH, 210 / INCH)
|
|
||||||
# if not (title_figure_fontsize):
|
|
||||||
# title_figure_fontsize = 18
|
|
||||||
# if not (title_axes_fontsize):
|
|
||||||
# title_axes_fontsize = 16
|
|
||||||
# if not (label_fontsize):
|
|
||||||
# label_fontsize = 14
|
|
||||||
# if not (label_legend_fontsize):
|
|
||||||
# label_legend_fontsize = 12
|
|
||||||
# fig, axes = plt.subplots(figsize=graph_size)
|
|
||||||
# fig.suptitle(title_figure, fontsize=title_figure_fontsize)
|
|
||||||
# axes.set_title(title_axes, fontsize=title_axes_fontsize)
|
|
||||||
#
|
|
||||||
# # фактические данные
|
|
||||||
# sns.scatterplot(
|
|
||||||
# x=X, y=Y,
|
|
||||||
# label='фактические данные',
|
|
||||||
# s=s,
|
|
||||||
# color='red',
|
|
||||||
# ax=axes)
|
|
||||||
#
|
|
||||||
# # график регрессионной модели
|
|
||||||
# nx = 100
|
|
||||||
# hx = (Xmax - Xmin) / (nx - 1)
|
|
||||||
# x1 = np.linspace(Xmin, Xmax, nx)
|
|
||||||
# y1 = regression_model(x1)
|
|
||||||
# sns.lineplot(
|
|
||||||
# x=x1, y=y1,
|
|
||||||
# color='blue',
|
|
||||||
# linewidth=linewidth_regr_model,
|
|
||||||
# legend=True,
|
|
||||||
# label=label_legend_regr_model,
|
|
||||||
# ax=axes)
|
|
||||||
#
|
|
||||||
# axes.set_xlim(Xmin, Xmax)
|
|
||||||
# axes.set_ylim(Ymin, Ymax)
|
|
||||||
# axes.axvline(x=0, color='k', linewidth=1)
|
|
||||||
# axes.axhline(y=0, color='k', linewidth=1)
|
|
||||||
# axes.set_xlabel(x_label, fontsize=label_fontsize)
|
|
||||||
# axes.set_ylabel(y_label, fontsize=label_fontsize)
|
|
||||||
# axes.tick_params(labelsize=tick_fontsize)
|
|
||||||
# axes.legend(prop={'size': label_legend_fontsize})
|
|
||||||
#
|
|
||||||
# plt.show()
|
|
||||||
# if file_name:
|
|
||||||
# fig.savefig(file_name, orientation="portrait", dpi=300)
|
|
||||||
#
|
|
||||||
# return
|
|
69
LabWork01/LabWork5/Сreate_plot.py
Normal file
69
LabWork01/LabWork5/Сreate_plot.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import os
|
||||||
|
import numpy as np
|
||||||
|
import pandas as pd
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from sklearn.metrics import r2_score
|
||||||
|
|
||||||
|
def create_plot_jpg(df: pd.DataFrame, nameFile):
|
||||||
|
# для сохранения диаграммы в конкретной папке
|
||||||
|
script_dir = os.path.dirname(__file__)
|
||||||
|
results_dir = os.path.join(script_dir, '../static/')
|
||||||
|
|
||||||
|
if not os.path.isdir(results_dir):
|
||||||
|
os.makedirs(results_dir)
|
||||||
|
|
||||||
|
# набор атрибутов - независимых переменных - площадь
|
||||||
|
X = df["Store_Area"].array
|
||||||
|
|
||||||
|
# набор меток - зависимых переменных, значение которых требуется предсказать - выручка
|
||||||
|
Y = df["Store_Sales"].array
|
||||||
|
|
||||||
|
n = df.shape[0]
|
||||||
|
|
||||||
|
# делим датафрейм на набор тренировочных данных и данных для тестов, test_size содержит определние соотношения этих наборов
|
||||||
|
n_test = int(n * 0.01)
|
||||||
|
n_train = n - n_test
|
||||||
|
X_train, Y_train = X[:n_train], Y[:n_train]
|
||||||
|
X_test, Y_test = X[n_train:], Y[n_train:]
|
||||||
|
|
||||||
|
sumY_train = sum(Y_train)
|
||||||
|
sumX_train = sum(X_train)
|
||||||
|
|
||||||
|
sumXY_train = sum(X_train * Y_train)
|
||||||
|
sumXX_train = sum(X_train * X_train)
|
||||||
|
|
||||||
|
b1 = (sumXY_train - (sumY_train * sumX_train) / n_train) / (sumXX_train - sumX_train * sumX_train / n_train)
|
||||||
|
b0 = (sumY_train - b1 * sumX_train) / n_train
|
||||||
|
|
||||||
|
# Построение модели на обучающем наборе
|
||||||
|
plt.scatter(X_train, Y_train, alpha=0.8)
|
||||||
|
plt.axline(xy1=(0, b0), slope=b1, color='r', label=f'$y = {b1:.5f}x {b0:+.5f}$')
|
||||||
|
|
||||||
|
# Оценка производительности модели на тестовом наборе
|
||||||
|
Y_pred = b0 + b1 * X_test
|
||||||
|
first_half = sum((Y_pred - Y_test.mean()) ** 2)
|
||||||
|
second_half = sum((Y_test - Y_pred) ** 2) + first_half
|
||||||
|
|
||||||
|
plt.scatter(X_test, Y_test, alpha=0.8, color='g')
|
||||||
|
plt.legend()
|
||||||
|
plt.savefig(results_dir + nameFile + '.jpg')
|
||||||
|
|
||||||
|
r2 = r_squared(Y_test, Y_pred)
|
||||||
|
listMessages = [f"Коэффициент по странной формуле (по википедии): {first_half/second_half}",
|
||||||
|
f"Истинный коэффициент (по википедии): {r2}",
|
||||||
|
f"Подсчёт по библиотеке: {r2_score(Y_test, Y_pred)}"]
|
||||||
|
|
||||||
|
return listMessages
|
||||||
|
|
||||||
|
def r_squared(y_true, y_pred):
|
||||||
|
# Вычисляем среднее значение целевой переменной
|
||||||
|
mean_y_true = np.mean(y_true)
|
||||||
|
|
||||||
|
# Вычисляем сумму квадратов отклонений от среднего
|
||||||
|
ss_total = np.sum((y_true - mean_y_true) ** 2)
|
||||||
|
|
||||||
|
# Вычисляем сумму квадратов остатков
|
||||||
|
ss_residual = np.sum((y_true - y_pred) ** 2)
|
||||||
|
|
||||||
|
# Вычисляем коэффициент детерминации
|
||||||
|
return 1 - (ss_residual / ss_total)
|
Loading…
Reference in New Issue
Block a user