MAI/LabWork01/LabWork5/Сreate_plot.py
2023-11-23 15:16:21 +04:00

69 lines
2.9 KiB
Python

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)