Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
57 строки
2.1 KiB
Python
57 строки
2.1 KiB
Python
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()
|