import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score import matplotlib.pyplot as plt import seaborn as sns # === Загружаем данные === columns = ['Position', 'Height(inches)', 'Weight(pounds)', 'Age'] df = pd.read_csv('SOCR_Data_MLB_HeightsWeights.txt', sep='\t', nrows=115, usecols=columns) # Кодируем категориальный признак "Position" df['Position_num'] = pd.factorize(df['Position'])[0] # === Признаки и целевая переменная === X = df[['Position_num', 'Height(inches)', 'Age']] y = df['Weight(pounds)'] # === Разделение выборки на обучающую и тестовую === X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # === Обучение модели === model = LinearRegression() model.fit(X_train, y_train) # === Предсказание === y_pred = model.predict(X_test) # === Оценка точности === mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) r2 = r2_score(y_test, y_pred) print("=== Оценка качества модели ===") print(f"СКО (RMSE): {rmse:.4f}") print(f"Коэффициент детерминации (R^2): {r2:.4f}") # === График ошибок === errors = y_test - y_pred plt.figure(figsize=(10, 5)) sns.histplot(errors, bins=15, kde=True, color='lightcoral', edgecolor='black') plt.title('Гистограмма ошибок предсказания') plt.xlabel('Ошибка (y_true - y_pred)') plt.ylabel('Частота') plt.show() # === Визуализация предсказанного vs реального значения === plt.figure(figsize=(8, 6)) plt.scatter(y_test, y_pred, color='blue', edgecolor='k') plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2) plt.xlabel('Истинные значения') plt.ylabel('Предсказанные значения') plt.title('Предсказанные vs Истинные значения') plt.show()