|
Линейная регрессия. Предсказание числовых значений
ОП.10 Машинное обучение
Практическая работа №2
Тема: Линейная регрессия. Предсказание числовых значений
Цель работы: Научиться строить модели линейной регрессии, оценивать их качество, интерпретировать коэффициенты.
Время выполнения: 2 академических часа
Инструменты: Python + Jupyter Notebook, sklearn, matplotlib, numpy
ЗАДАНИЕ ДЛЯ СТУДЕНТА
Этап 1. Создание синтетических данных (10 минут)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# Создаём данные с линейной зависимостью
np.random.seed(42)
X = np.random.rand(100, 1) * 10 # 100 точек от 0 до 10
y = 2.5 * X.squeeze() + 5 + np.random.randn(100) * 2 # y = 2.5x + 5 + шум
print(f"Форма X: {X.shape}")
print(f"Форма y: {y.shape}")
print(f"Первые 5 значений X: {X[:5].flatten()}")
print(f"Первые 5 значений y: {y[:5]}")
# Визуализация
plt.figure(figsize=(8, 5))
plt.scatter(X, y, alpha=0.6)
plt.xlabel('X')
plt.ylabel('y')
plt.title('Синтетические данные с линейной зависимостью')
plt.show()
Этап 2. Обучение модели линейной регрессии (15 минут)
# Разделение на обучающую и тестовую выборки
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)
# Коэффициенты модели
print(f"Коэффициент (наклон): {model.coef_[0]:.3f}")
print(f"Свободный член (intercept): {model.intercept_:.3f}")
print(f"Уравнение: y = {model.coef_[0]:.3f} * x + {model.intercept_:.3f}")
# Предсказания
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# Визуализация
plt.figure(figsize=(10, 5))
plt.scatter(X_train, y_train, alpha=0.6, label='Обучающие данные')
plt.scatter(X_test, y_test, alpha=0.6, color='green', label='Тестовые данные')
plt.plot(X, model.predict(X), color='red', linewidth=2, label='Линия регрессии')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Линейная регрессия')
plt.legend()
plt.show()
Вопрос: Как близки полученные коэффициенты к истинным (2.5 и 5)?
Этап 3. Оценка качества модели (15 минут)
# Расчёт метрик
mse_train = mean_squared_error(y_train, y_train_pred)
mse_test = mean_squared_error(y_test, y_test_pred)
mae_train = mean_absolute_error(y_train, y_train_pred)
mae_test = mean_absolute_error(y_test, y_test_pred)
r2_train = r2_score(y_train, y_train_pred)
r2_test = r2_score(y_test, y_test_pred)
print("Метрики качества:")
print(f"MSE (обучение): {mse_train:.3f}")
print(f"MSE (тест): {mse_test:.3f}")
print(f"MAE (обучение): {mae_train:.3f}")
print(f"MAE (тест): {mae_test:.3f}")
print(f"R² (обучение): {r2_train:.3f}")
print(f"R² (тест): {r2_test:.3f}")
# Визуализация ошибок
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.scatter(y_test, y_test_pred, alpha=0.6)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', linewidth=2)
plt.xlabel('Истинные значения')
plt.ylabel('Предсказанные значения')
plt.title('Предсказания vs Истина')
plt.subplot(1, 2, 2)
residuals = y_test - y_test_pred
plt.hist(residuals, bins=20, edgecolor='black')
plt.xlabel('Ошибка (резидуал)')
plt.ylabel('Частота')
plt.title('Распределение ошибок предсказания')
plt.tight_layout()
plt.show()
Вопросы:
• Что означает R² = 0.9? Хороший ли это результат?
• О чём говорит распределение ошибок?
Этап 4. Множественная линейная регрессия (15 минут)
from sklearn.datasets import fetch_california_housing
# Загрузка данных о ценах на жильё
housing = fetch_california_housing()
X_housing = housing.data
y_housing = housing.target
print(f"Размер данных: {X_housing.shape}")
print(f"Признаки: {housing.feature_names}")
# Разделение на выборки
X_train, X_test, y_train, y_test = train_test_split(
X_housing, y_housing, test_size=0.2, random_state=42
)
# Обучение модели
model_housing = LinearRegression()
model_housing.fit(X_train, y_train)
# Коэффициенты
coef_df = pd.DataFrame({
'feature': housing.feature_names,
'coefficient': model_housing.coef_
})
print("Коэффициенты признаков:")
print(coef_df)
# Качество
y_pred = model_housing.predict(X_test)
print(f"R² на тестовой выборке: {r2_score(y_test, y_pred):.3f}")
print(f"MSE: {mean_squared_error(y_test, y_pred):.3f}")
# Анализ важности признаков
plt.figure(figsize=(10, 5))
plt.barh(coef_df['feature'], coef_df['coefficient'])
plt.xlabel('Коэффициент')
plt.title('Влияние признаков на цену жилья')
plt.show()
Вопрос: Какой признак сильнее всего влияет на цену жилья? Как это интерпретировать?
Этап 5. Практическое задание: предсказание успеваемости (15 минут)
# Данные о студентах: часы занятий, предыдущий балл, итоговый балл
np.random.seed(42)
n_students = 200
hours_studied = np.random.randint(1, 20, n_students)
prev_score = np.random.randint(40, 100, n_students)
# Итоговый балл = 5*часы + 0.3*предыдущий + 20 + шум
final_score = 5 * hours_studied + 0.3 * prev_score + 20 + np.random.randn(n_students) * 10
X_students = np.column_stack([hours_studied, prev_score])
y_students = final_score
# Разделение на выборки
X_train, X_test, y_train, y_test = train_test_split(
X_students, y_students, test_size=0.25, random_state=42
)
# Обучение модели
model_students = LinearRegression()
model_students.fit(X_train, y_train)
print("Коэффициенты модели:")
print(f"Влияние часов занятий: {model_students.coef_[0]:.3f}")
print(f"Влияние предыдущего балла: {model_students.coef_[1]:.3f}")
print(f"Свободный член: {model_students.intercept_:.3f}")
# Предсказание для нового студента
new_student = np.array([[15, 75]]) # 15 часов, предыдущий балл 75
predicted_score = model_students.predict(new_student)
print(f"Предсказанный итоговый балл: {predicted_score[0]:.1f}")
# Качество модели
y_pred = model_students.predict(X_test)
print(f"R²: {r2_score(y_test, y_pred):.3f}")
print(f"MAE: {mean_absolute_error(y_test, y_pred):.1f}")
Вопрос: Какой фактор важнее для итогового балла: часы занятий или предыдущий балл?
Этап 6. Выводы (10 минут)
Напишите вывод, ответив на вопросы:
1. Что означают коэффициенты линейной регрессии?
2. Как интерпретировать R²? Какие значения считаются хорошими?
3. В каких задачах применима линейная регрессия?
КРИТЕРИИ ОЦЕНКИ
| Критерий | Макс. балл |
|---|
| Модель обучена на синтетических данных | 3 | | Метрики качества рассчитаны | 3 | | Множественная регрессия выполнена | 2 | | Выводы обоснованные | 2 | | Итого | 10 |
Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника
|
|
|