Кафедра ШІзики

Ваша перша ML модель - Лінійна регресія

Кафедра ШІзики

Автор

30 хвилин

Час читання

28.10.2025

Дата публікації

Рівень:
Початківець
Теги: #лінійна-регресія #навчання-з-учителем #перша-модель #sklearn #регресія

📌 Новачок у Python? Ця стаття використовує приклади коду на Python. Якщо ви раніше не працювали з Python, почніть з нашого гайду Налаштування Python для ML!

Ваша перша ML модель - Лінійна регресія 🎯

Ось воно. Момент, на який ви чекали.

Ви витратили чотири статті на підготовку даних:

  • Стаття 1: Очистили брудні дані замовлень піци
  • Стаття 2: Дослідили паттерни (холодні дні = більше замовлень!)
  • Стаття 3: Створили розумні ознаки (is_friday_evening, hour_sin)
  • Стаття 4: Правильно розділили дані (60/20/20)

Тепер час відповісти на питання, яке має значення:

“Скільки піци ми продамо завтра?”

У цій статті ви натренуєте свою першу модель машинного навчання. Ви побачите, як вона вчиться на даних, робить прогнози та генерує реальні бізнес-інсайти. І ви зробите все це лише кількома рядками коду.

Що ви дізнаєтесь:

  • Як працює лінійна регресія (інтуїтивно, не математично)
  • Натренуєте свою першу модель на даних продажу піци
  • Інтерпретуєте, що модель навчилась
  • Зробите прогнози для конкретних сценаріїв
  • Оцінюєте, чи модель достатньо хороша
  • Коли використовувати (і не використовувати) лінійну регресію

Давайте побудуємо вашу першу ML модель! 🚀


Шлях до цього моменту - Від даних до прогнозів 📊

Перед тим, як почати, давайте оцінимо, як далеко ви просунулись:

Крок 1: Сирі дані (Стаття 1)
   ↓ Очищення пропущених значень, виправлення помилок
Крок 2: Чисті дані (Стаття 2)
   ↓ Дослідження патернів, візуалізація кореляцій
Крок 3: Зрозумілі дані (Стаття 3)
   ↓ Створення ознак, кодування категорій, масштабування
Крок 4: Ознаки, готові для ML (Стаття 4)
   ↓ Розділення на train/validation/test
Крок 5: Правильно розділені дані
   ↓ **Тренування моделі** ← ВИ ТУТ!
Крок 6: ПРОГНОЗИ! 🎉

Винагорода: Вся ця підготовка не була пустою роботою. Це те, що змусить вашу модель реально працювати в продакшені.

Регресія проти Класифікації

Перш ніж почати, швидке роз’яснення:

Регресія (те, що ми робимо):

  • Прогнозування числа (безперервного значення)
  • Приклади: Продаж піци, температура, ціна, вік
  • Вихід: 23.5 піц, $42.99, 18.3°C

Класифікація (інша стаття):

  • Прогнозування категорії (дискретної мітки)
  • Приклади: Спам/Не спам, Кіт/Собака, Гаряче/Холодне/Помірне
  • Вихід: “Так”, “Ні”, “Категорія А”

Наша проблема: Прогнозувати num_pizzas (число) → Регресія!


Інтуїція: Пошук лінії найкращого підходу 📈

Найпростіший випадок: Одна ознака

Уявіть, що у вас є лише дані температури:

Температура | Продано піц
------------|------------
5°C         | 32
10°C        | 28
15°C        | 25
20°C        | 21
25°C        | 18
30°C        | 15

Побудуйте графік:

Продано піц
    |
 35 |  •
 30 |     •
 25 |        •
 20 |           •
 15 |              •
    |_____________________ Температура (°C)
    0   10   20   30

Ваш мозок одразу бачить: “Коли температура зростає, продаж піци падає!”

Лінійна регресія робить саме це: Знаходить найкращу пряму лінію через ці точки.

Продано піц
    |
 35 |  •
 30 |    •\
 25 |      •\___  Лінія найкращого підходу
 20 |         •\___
 15 |            •\___
    |_____________________ Температура (°C)

Формула лінії: pizzas = 35 - 0.5 × temperature

Що це означає:

  • Початок з 35 піц (коли 0°C)
  • За кожен градус тепліше, продаємо на 0.5 піци менше
  • При 30°C: pizzas = 35 - 0.5 × 30 = 20 піц

Лінійна регресія знаходить ці числа автоматично з даних!

Множинні ознаки: Та сама ідея, більше вимірів

Насправді у нас не лише температура. У нас є:

  • temperature
  • hour_sin, hour_cos (час дня)
  • is_friday_evening
  • is_peak_hour
  • rolling_avg_3h
  • … і більше!

Формула стає:

pizzas = β₀ + β₁×temp + β₂×hour_sin + β₃×hour_cos + β₄×is_friday + ...

Та сама концепція: Знайти коефіцієнти (β), які роблять найкращі прогнози.

Ви не можете візуалізувати 10-вимірну лінію, але математично це те саме!


Математика (спрощено) 🔢

Не хвилюйтесь - ніякого обчислення не потрібно. Лише шкільна алгебра!

Рівняння лінійної регресії

y = β₀ + β₁×x₁ + β₂×x₂ + β₃×x₃ + ... + βₙ×xₙ

Переклад:

СимволНазваЗначенняПриклад піци
yЦільова зміннаТе, що ми хочемо прогнозуватиnum_pizzas
x₁, x₂, …ОзнакиВхідні змінніtemperature, hour, is_friday
β₀Вільний членБазове значення, коли всі x=025 піц (базовий попит)
β₁, β₂, …КоефіцієнтиВплив кожної ознаки-0.3 (ефект temp)

Приклад з числами:

pizzas = 25 - 0.3×temp + 8.2×is_friday_evening + 0.5×rolling_avg_3h

# П'ятничний вечір (7 PM), холодно (5°C), недавній середній 22 піци:
pizzas = 25 - 0.3×5 + 8.2×1 + 0.5×22
       = 25 - 1.5 + 8.2 + 11
       = 42.7 піц

Як модель “вчиться”?

Крок 1: Почати з випадкових коефіцієнтів

pizzas = 0 + 0×temp + 0×is_friday + 0×rolling_avg
# Робить жахливі прогнози!

Крок 2: Для кожного тренувального прикладу обчислити помилку

Фактично: 32 піци
Прогноз: 15 піц
Помилка: 32 - 15 = 17 піц (дуже далеко!)

Крок 3: Налаштувати коефіцієнти для зменшення помилки

Це називається мінімізацією функції втрат (зокрема, середньоквадратичної помилки).

Алгоритм: Звичайні найменші квадрати (OLS)

  • Знаходить математично ідеальні коефіцієнти
  • Мінімізує суму квадратів помилок
  • Ніякої випадковості, ніяких ітерацій - один розрахунок!

Вам не потрібно розуміти математику. Просто знайте:

  • Модель пробує різні значення коефіцієнтів
  • Вибирає ті, що роблять найкращі прогнози
  • Scikit-learn робить це за мілісекунди

Тренування вашої першої моделі - Крок за кроком 🎓

Давайте зробимо це! Почнемо просто і будемо ускладнювати.

Крок 1: Імпорт бібліотек

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Магічний клас!
from sklearn.linear_model import LinearRegression

# Метрики оцінювання
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

print("🍕 Мама ML Піцерія - Лінійна регресія")
print("=" * 60)

Крок 2: Завантажити підготовлені дані

Пам’ятаєте Статтю 4? Ми правильно розділили дані. Тепер використовуємо їх!

# Завантажити дані, які ми підготували у Статтях 1-4
# (Це включає всі наші створені ознаки та правильні розділення)

# Для цього туторіалу створимо зразкові дані
# У реальності ви б завантажили свої фактичні розділені дані
from sklearn.model_selection import train_test_split

# Завантажити очищені, оброблені та масштабовані дані
data = pd.read_csv('pizza_orders_prepared.csv')

# Ознаки, які ми створили у Статті 3
features = [
    'temperature', 'hour_sin', 'hour_cos',
    'is_friday_evening', 'is_peak_hour', 'is_weekend',
    'rolling_avg_3h', 'price_per_pizza',
    'month_sin', 'month_cos'
]

X = data[features]
y = data['num_pizzas']

# Розділити, як ми навчились у Статті 4
X_train, X_temp, y_train, y_temp = train_test_split(
    X, y, test_size=0.4, random_state=42
)
X_val, X_test, y_val, y_test = train_test_split(
    X_temp, y_temp, test_size=0.5, random_state=42
)

print(f"Тренувальний набір: {len(X_train)} зразків")
print(f"Валідаційний набір: {len(X_val)} зразків")
print(f"Тестовий набір: {len(X_test)} зразків")
print(f"Ознаки: {len(features)}\n")

Крок 3: Почніть просто - Одна ознака

Перед використанням всіх ознак, подивимось на лінійну регресію лише з температурою:

# Створити модель
model_simple = LinearRegression()

# Тренувати лише на температурі
model_simple.fit(X_train[['temperature']], y_train)

print("✅ Модель натренована!")
print(f"Вільний член (β₀): {model_simple.intercept_:.2f}")
print(f"Коефіцієнт температури (β₁): {model_simple.coef_[0]:.2f}")

# Навчене рівняння
print(f"\nНавчене рівняння:")
print(f"pizzas = {model_simple.intercept_:.2f} + {model_simple.coef_[0]:.2f} × temperature")

Вихід:

✅ Модель натренована!
Вільний член (β₀): 32.45
Коефіцієнт температури (β₁): -0.28

Навчене рівняння:
pizzas = 32.45 + -0.28 × temperature

Інтерпретація:

  • Базова лінія: 32.45 піц (коли temp = 0°C, теоретично)
  • Ефект: Кожен градус тепліше → 0.28 піц менше
  • При 20°C: pizzas = 32.45 - 0.28 × 20 = 26.85 піц

Крок 4: Візуалізувати модель з однією ознакою

# Створити діаграму розсіювання
plt.figure(figsize=(10, 6))
plt.scatter(X_train['temperature'], y_train, alpha=0.5, label='Фактичні дані')

# Побудувати лінію регресії
temp_range = np.linspace(X_train['temperature'].min(),
                         X_train['temperature'].max(), 100)
predictions = model_simple.predict(temp_range.reshape(-1, 1))
plt.plot(temp_range, predictions, color='red', linewidth=2,
         label='Лінія регресії')

plt.xlabel('Температура (°C)')
plt.ylabel('Продано піц')
plt.title('Проста лінійна регресія: Температура → Продаж піци')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Крок 5: Справжня модель - Всі ознаки!

Тепер використаємо ВСІ ознаки, які ми створили:

# Створити модель
model = LinearRegression()

# Тренувати на ВСІХ ознаках
model.fit(X_train, y_train)

print("🎉 Повна модель натренована!")
print(f"Кількість ознак: {len(model.coef_)}")
print(f"Вільний член: {model.intercept_:.2f}")
print("\nТоп-5 значень коефіцієнтів:")

# Показати коефіцієнти
coef_df = pd.DataFrame({
    'feature': features,
    'coefficient': model.coef_
}).sort_values('coefficient', key=abs, ascending=False)

print(coef_df.head())

Вихід:

🎉 Повна модель натренована!
Кількість ознак: 10
Вільний член: 18.42

Топ-5 значень коефіцієнтів:
                feature  coefficient
is_friday_evening         12.35
rolling_avg_3h            0.48
is_peak_hour             8.21
temperature              -0.31
is_weekend               5.12

Ось і все! Ви натренували модель машинного навчання.

Модель навчилась, що:

  • П’ятничні вечори підвищують продажі на ~12 піц
  • Пікові години додають ~8 піц
  • Температура зменшує продажі на 0.31 піци на градус
  • Вихідні додають ~5 піц

Створення прогнозів - Момент істини 🔮

Тепер настає цікава частина: використання вашої моделі для прогнозування майбутнього!

Прогнозування на тестовому наборі

# Зробити прогнози для всіх тестових прикладів
y_pred = model.predict(X_test)

# Порівняти перші 10 фактичних проти прогнозованих
comparison = pd.DataFrame({
    'actual': y_test[:10].values,
    'predicted': y_pred[:10],
    'error': y_test[:10].values - y_pred[:10]
})

print("Перші 10 прогнозів:")
print(comparison)
print(f"\nСередня помилка: {comparison['error'].abs().mean():.2f} піц")

Вихід:

Перші 10 прогнозів:
    actual  predicted  error
0     28.0      26.3    1.7
1     35.0      33.8    1.2
2     19.0      21.2   -2.2
3     42.0      41.5    0.5
4     22.0      23.7   -1.7
5     31.0      29.8    1.2
6     18.0      19.5   -1.5
7     38.0      36.2    1.8
8     25.0      25.9   -0.9
9     29.0      27.6    1.4

Середня помилка: 1.4 піц

Непогано! Зазвичай помиляємось на ±1.4 піци.

Прогнозування конкретних сценаріїв

Тут стає практично. Менеджер запитує: “Скільки я маю приготувати на п’ятницю о 7 PM, коли буде 10°C?”

# Сценарій 1: Холодний п'ятничний вечір
friday_evening_cold = pd.DataFrame({
    'temperature': [10],
    'hour_sin': [np.sin(2 * np.pi * 19 / 24)],
    'hour_cos': [np.cos(2 * np.pi * 19 / 24)],
    'is_friday_evening': [1],
    'is_peak_hour': [1],
    'is_weekend': [0],
    'rolling_avg_3h': [28.5],  # Недавній середній
    'price_per_pizza': [12.99],
    'month_sin': [np.sin(2 * np.pi * 1 / 12)],  # Січень
    'month_cos': [np.cos(2 * np.pi * 1 / 12)]
})

prediction = model.predict(friday_evening_cold)
print(f"🍕 Очікувані замовлення: {prediction[0]:.0f} піц")
print(f"💡 Рекомендація: Приготуйте 45-50 піц (додайте буфер)")

Вихід:

🍕 Очікувані замовлення: 42 піци
💡 Рекомендація: Приготуйте 45-50 піц (додайте буфер)
# Сценарій 2: Гарячий вівторок після обіду
tuesday_afternoon_hot = pd.DataFrame({
    'temperature': [32],
    'hour_sin': [np.sin(2 * np.pi * 14 / 24)],
    'hour_cos': [np.cos(2 * np.pi * 14 / 24)],
    'is_friday_evening': [0],
    'is_peak_hour': [0],
    'is_weekend': [0],
    'rolling_avg_3h': [18.2],
    'price_per_pizza': [12.99],
    'month_sin': [np.sin(2 * np.pi * 7 / 12)],  # Липень
    'month_cos': [np.cos(2 * np.pi * 7 / 12)]
})

prediction = model.predict(tuesday_afternoon_hot)
print(f"🍕 Очікувані замовлення: {prediction[0]:.0f} піц")
print(f"💡 Рекомендація: Приготуйте 20-25 піц")

Вихід:

🍕 Очікувані замовлення: 18 піц
💡 Рекомендація: Приготуйте 20-25 піц

Бізнес-вплив:

  • Оптимізація інвентарю (без відходів, без дефіциту)
  • Планування графіків персоналу
  • Коригування маркетингу (просувати акції в повільні дні)
  • Фінансове прогнозування

Інтерпретація моделі - Що вона навчилась? 🔍

Коефіцієнти розповідають історію про ваш бізнес!

Розуміння коефіцієнтів

# Повний аналіз коефіцієнтів
coef_df = pd.DataFrame({
    'feature': features,
    'coefficient': model.coef_,
    'abs_coefficient': np.abs(model.coef_)
}).sort_values('abs_coefficient', ascending=False)

print("Всі коефіцієнти (відсортовані за впливом):")
print(coef_df)

Вихід:

Всі коефіцієнти (відсортовані за впливом):
             feature  coefficient  abs_coefficient
is_friday_evening        12.35            12.35
is_peak_hour              8.21             8.21
is_weekend                5.12             5.12
rolling_avg_3h            0.48             0.48
temperature              -0.31             0.31
price_per_pizza          -0.18             0.18
hour_sin                  2.15             2.15
month_sin                 1.32             1.32
hour_cos                 -0.89             0.89
month_cos                 0.52             0.52

Що означає кожен коефіцієнт

Позитивні коефіцієнти (збільшують продажі):

ОзнакаКоефіцієнтІнтерпретація
is_friday_evening+12.35П’ятничні вечори підвищують продажі на ~12 піц
is_peak_hour+8.21Пікові години (обід/вечеря) додають ~8 піц
is_weekend+5.12Вихідні збільшують продажі на ~5 піц
rolling_avg_3h+0.48Недавні тренди мають значення (зайнятість породжує зайнятість)

Негативні коефіцієнти (зменшують продажі):

ОзнакаКоефіцієнтІнтерпретація
temperature-0.31Кожен градус тепліше = 0.31 піци менше
price_per_pizza-0.18Вищі ціни трохи зменшують обсяг

Циклічні ознаки:

ОзнакаКоефіцієнтІнтерпретація
hour_sin/cos+2.15, -0.89Ефект часу дня (піки о вечері)
month_sin/cos+1.32, +0.52Сезонна варіація (зима > літо)

Візуалізувати важливість ознак

# Побудувати коефіцієнти
plt.figure(figsize=(10, 6))
coef_df_sorted = coef_df.sort_values('coefficient')

plt.barh(range(len(coef_df_sorted)), coef_df_sorted['coefficient'])
plt.yticks(range(len(coef_df_sorted)), coef_df_sorted['feature'])
plt.xlabel('Значення коефіцієнта')
plt.title('Важливість ознак (коефіцієнти лінійної регресії)')
plt.axvline(0, color='red', linestyle='--', linewidth=1)
plt.grid(True, alpha=0.3, axis='x')
plt.tight_layout()
plt.show()

Бізнес-інсайти

Дієві відкриття:

  1. П’ятничні вечори - золоті (+12.35 піц)

    • Дія: Додатковий персонал, більше інгредієнтів, маркетинговий пуш
  2. Погода має значення (-0.31 на градус)

    • Дія: Перевіряйте прогноз, коригуйте підготовку відповідно
    • У 30°C день очікуйте ~9 менше піц, ніж при 0°C
  3. Пікові години домінують (+8.21 піц)

    • Дія: Фокусуйте ресурси на 12-13h та 18-20h
  4. Імпульс має значення (+0.48 від rolling_avg)

    • Дія: Якщо зайнято, залишайтесь готовими - так і залишиться!

Оцінка продуктивності моделі - Чи вона достатньо хороша? 📊

У нас є прогнози. Але чи вони хороші?

Ключові метрики

# Обчислити метрики на тестовому наборі
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print("📊 Продуктивність моделі на тестовому наборі:")
print("=" * 50)
print(f"MAE (середня абсолютна помилка):  {mae:.2f} піц")
print(f"MSE (середня квадратична помилка):   {mse:.2f}")
print(f"RMSE (корінь середньої квадратичної помилки): {rmse:.2f} піц")
print(f"R² (R-квадрат):            {r2:.3f}")
print("=" * 50)

# Також перевірити продуктивність тренування
y_train_pred = model.predict(X_train)
train_r2 = r2_score(y_train, y_train_pred)
print(f"\n📈 Тренувальний R²: {train_r2:.3f}")
print(f"📉 Тестовий R²:     {r2:.3f}")
print(f"Різниця:           {train_r2 - r2:.3f}")

Вихід:

📊 Продуктивність моделі на тестовому наборі:
==================================================
MAE (середня абсолютна помилка):  2.15 піц
MSE (середня квадратична помилка):   7.84
RMSE (корінь середньої квадратичної помилки): 2.80 піц
R² (R-квадрат):            0.721
==================================================

📈 Тренувальний R²: 0.735
📉 Тестовий R²:     0.721
Різниця:           0.014

Що означають ці числа?

MAE (середня абсолютна помилка): 2.15 піц

  • У середньому прогнози відрізняються на ±2.15 піц
  • Легко зрозуміти: “Зазвичай помиляємось на 2 піци”
  • Для бізнесу, що продає 20-40 піц, це добре!

RMSE (корінь середньої квадратичної помилки): 2.80 піц

  • Схоже на MAE, але більше карає великі помилки
  • Вище за MAE означає, що деякі прогнози дуже далекі
  • Все ще прийнятно для планування

R² (R-квадрат): 0.721

  • Модель пояснює 72.1% варіації в продажах піци
  • Решта 27.9% не пояснена (погодні події, акції, випадковість)
  • 0.7+ зазвичай добре для реальних даних!

Тренувальний проти тестового R²: Дуже схожі (0.735 проти 0.721)

  • Невелика різниця = немає перенавчання!
  • Модель добре узагальнює на нові дані
  • Дякуємо правильному розділенню (Стаття 4!)

Візуалізувати: Фактичне проти прогнозованого

# Діаграма розсіювання: Фактичне проти прогнозованого
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)

# Лінія ідеального прогнозу
min_val = min(y_test.min(), y_pred.min())
max_val = max(y_test.max(), y_pred.max())
plt.plot([min_val, max_val], [min_val, max_val],
         'r--', linewidth=2, label='Ідеальний прогноз')

plt.xlabel('Фактично продано піц')
plt.ylabel('Прогнозовано піц')
plt.title('Фактичне проти прогнозованого: Тестовий набір')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Хороші прогнози групуються навколо червоної лінії.

Аналіз залишків

Залишки = Фактичне - Прогнозоване (помилки)

# Обчислити залишки
residuals = y_test - y_pred

# Створити графіки залишків
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# Графік 1: Залишки проти прогнозованого
axes[0].scatter(y_pred, residuals, alpha=0.5)
axes[0].axhline(0, color='red', linestyle='--', linewidth=2)
axes[0].set_xlabel('Прогнозовані значення')
axes[0].set_ylabel('Залишки (фактичне - прогнозоване)')
axes[0].set_title('Графік залишків')
axes[0].grid(True, alpha=0.3)

# Графік 2: Гістограма залишків
axes[1].hist(residuals, bins=30, edgecolor='black')
axes[1].axvline(0, color='red', linestyle='--', linewidth=2)
axes[1].set_xlabel('Значення залишку (піц)')
axes[1].set_ylabel('Частота')
axes[1].set_title('Розподіл залишків')
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

print(f"Середнє залишків: {residuals.mean():.3f} (має бути ~0)")
print(f"Стд. відхилення залишків:  {residuals.std():.2f} піц")

На що звертати увагу:

  • Графік залишків: Має бути випадково розкиданий навколо 0 (без патерну)
  • Гістограма: Має виглядати приблизно нормально (дзвінкова крива)
  • Середнє близько 0: Немає систематичної похибки
  • Якщо бачите патерни → модель щось упускає!

Коли працює лінійна регресія (а коли ні) ⚠️

Ідеальні випадки використання ✅

Використовуйте лінійну регресію коли:

  1. Цільова змінна безперервна

    • Прогнозування чисел: продажі, температура, ціна, час
    • НЕ категорії: спам/хам, кіт/собака
  2. Відносини приблизно лінійні

    • Ознаки та ціль мають пряму взаємозалежність
    • “Коли X збільшується, Y збільшується/зменшується пропорційно”
  3. Потрібна інтерпретованість

    • Бізнес хоче зрозуміти ЧОМУ
    • “Що керує продажами?” → Вказати на коефіцієнти
    • Пояснюваний AI / регуляторні вимоги
  4. Важливі швидкі прогнози

    • Мільйони прогнозів за секунду
    • Просто помножити та додати!
  5. У вас достатньо даних

    • Правило: 10× зразків на ознаку
    • 10 ознак → потрібно 100+ зразків (у нас тисячі!)

Припущення (спрощено)

Лінійна регресія припускає:

  1. Лінійність: Відношення між X та Y лінійне

    • Перевірка: Побудуйте графік ознак проти цілі, шукайте прямі лінії
  2. Незалежність: Спостереження не впливають одне на одне

    • Наші дані: Кожне замовлення незалежне ✅
  3. Гомоскедастичність: Варіація помилки постійна

    • Перевірка: Графік залишків має бути рівномірно розкиданий
    • Без “віяла”
  4. Нормальність залишків: Помилки нормально розподілені

    • Перевірка: Гістограма залишків виглядає як дзвін

Не переживайте, якщо припущення не ідеальні! Реальні дані рідко ідеальні. Поки вони “досить близькі,” лінійна регресія все одно працює.

Коли НЕ використовувати ❌

Не використовуйте лінійну регресію коли:

  1. Нелінійні відносини

    Приклад: Експоненційне зростання (вірусне поширення, складні відсотки)
    Рішення: Трансформуйте ознаки (log), або використовуйте іншу модель
  2. Проблеми класифікації

    Приклад: Прогнозувати, чи замовлення велике/мале (категорія)
    Рішення: Використовуйте логістичну регресію або дерева рішень
  3. Складні взаємодії

    Приклад: Ефект температури залежить від дня тижня
    Рішення: Додайте ознаки взаємодії (temp × is_weekend)
  4. Багато нерелевантних ознак

    Проблема: Модель однаково ставиться до всіх ознак
    Рішення: Вибір ознак або регуляризація (Ridge/Lasso)
  5. Екстремальні викиди

    Проблема: Одне кейтерингове замовлення на 500 піц зміщує все
    Рішення: Робастна регресія або видалення викидів

Покращення вашої моделі 🚀

Ваша перша модель працює! Але чи можемо ми зробити її краще?

1. Вибір ознак

Не всі ознаки однаково корисні:

# Видалити слабкі ознаки (малі коефіцієнти)
strong_features = coef_df[coef_df['abs_coefficient'] > 1.0]['feature'].tolist()

print(f"Сильні ознаки: {strong_features}")

# Перетренувати лише з сильними ознаками
model_simplified = LinearRegression()
model_simplified.fit(X_train[strong_features], y_train)

# Порівняти продуктивність
r2_simple = model_simplified.score(X_test[strong_features], y_test)
print(f"Оригінальний R²: {r2:.3f}")
print(f"Спрощений R²: {r2_simple:.3f}")

2. Поліноміальні ознаки (тізер)

Що якщо температура має нелінійний ефект?

from sklearn.preprocessing import PolynomialFeatures

# Додати temperature²
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X_train[['temperature']])

# Тепер модель може навчитись: pizzas = a + b×temp + c×temp²

Більше про це у Статті 8!

3. Регуляризація (тізер)

Запобігти перенавчанню за допомогою Ridge або Lasso:

from sklearn.linear_model import Ridge

# Ridge регресія (L2 регуляризація)
model_ridge = Ridge(alpha=1.0)
model_ridge.fit(X_train, y_train)

Більше про це у Статті 8!

4. Більше даних

Часто найкраще покращення:

  • Більше історичних даних → кращі паттерни
  • Більше ознак (API погоди, свята) → більше контексту
  • Краще мічення → чистіший сигнал

Підсумок - Ви це зробили! 🎉

Що ви дізнались

1. Інтуїція лінійної регресії

  • Пошук лінії найкращого підходу
  • Від однієї змінної до множинних ознак
  • Коефіцієнти показують вплив ознак

2. Тренування моделі

  • Завантажити підготовлені дані (Статті 1-4 окупились!)
  • Один рядок: model.fit(X_train, y_train)
  • Scikit-learn робить складну математику

3. Створення прогнозів

  • model.predict(new_data)
  • Реальні бізнес-сценарії
  • Аналіз “що якщо”

4. Інтерпретація результатів

  • Коефіцієнти = важливість ознак
  • П’ятничні вечори: +12 піц!
  • Температура: -0.31 піци на градус

5. Оцінка продуктивності

  • MAE: Середня помилка (2.15 піц)
  • R²: Пояснена варіація (72%)
  • Графіки залишків: Перевірка припущень

6. Коли використовувати

  • Безперервні цілі
  • Лінійні відносини
  • Потрібна інтерпретованість
  • Швидкі прогнози

Шлях продовжується

✅ Стаття 1: Якість даних
✅ Стаття 2: EDA
✅ Стаття 3: Створення ознак
✅ Стаття 4: Розділення train/test
✅ Стаття 5: Лінійна регресія ← ВИ ТУТ!

📍 Далі: Стаття 6: Метрики оцінки моделі

Що далі?

У Статті 6: Метрики оцінки моделі - Вимірювання успіху, ви дізнаєтесь:

  • Чи 72% R² добре? Як дізнатись?
  • Метрики класифікації (точність, повнота, F1)
  • Матриці помилок пояснено візуально
  • ROC криві та AUC
  • Вибір правильної метрики для вашої проблеми
  • Коли точність вас обманює!

Тепер у вас є робоча ML модель! Далі ми навчимось оцінювати моделі глибше та порівнювати різні алгоритми.


Практичні вправи 💪

Вправа 1: Проста модель

# Натренуйте модель лише з 3 ознаками: temperature, is_friday_evening, is_weekend
# Порівняйте R² з повною моделлю
# Які ознаки мають найбільше значення?

Вправа 2: Прогнозування сценаріїв

# Прогнозуйте піци для:
# 1. Субота полудень, 25°C
# 2. Понеділок вечір (7 PM), 12°C
# 3. Четвер обід (1 PM), 18°C

Вправа 3: Інтерпретація коефіцієнтів

# Якщо температура падає з 25°C до 15°C (на 10 градусів холодніше),
# скільки більше піц ми маємо очікувати?
# Підказка: Використайте коефіцієнт температури

Вправа 4: Метрики

# Обчисліть MAE та RMSE на валідаційному наборі
# Чи вони схожі на тестовий набір?
# Що це говорить вам про узагальнення?

Вправа 5: Створення ознак

# Створіть нову ознаку: is_cold_friday_evening
# (Комбінує is_friday_evening ТА temperature < 10)
# Чи покращує вона модель?

Додаткове читання 📚

Книги:

  • “Introduction to Statistical Learning” від James et al. (Розділ 3)
  • “Hands-On Machine Learning” від Aurélien Géron (Розділ 4)

Документація:

Kaggle:

  • House Price Prediction (класична задача регресії)
  • Туторіали з лінійної регресії

Вітаємо! 🎊 Ви натренували свою першу модель машинного навчання та зробили реальні прогнози. Це величезна віха у вашій ML подорожі!

Пам’ятайте: Почніть просто (лінійна регресія), зрозумійте глибоко, потім переходьте до складних моделей. Принципи, які ви тут вивчили, застосовуються до всіх ML алгоритмів.

Успішного прогнозування! 🚀✨