УМК СПО

Учебно-методические комплексы

для преподавателей СПО








Линейная регрессия. Предсказание числовых значений

ОП.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


Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника





Логин: Пароль: Забыли пароль?Регистрация

Самозанятый: Стешенко Светлана Николаевна ИНН: 231408226339

Актуальная версия — 2026
Сайт сделан на SiNG cms © 2010-2020