Ваша перша ML модель - Лінійна регресія
Кафедра ШІзики
Автор
30 хвилин
Час читання
28.10.2025
Дата публікації
📌 Новачок у 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=0 | 25 піц (базовий попит) |
| β₁, β₂, … | Коефіцієнти | Вплив кожної ознаки | -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()Бізнес-інсайти
Дієві відкриття:
-
П’ятничні вечори - золоті (+12.35 піц)
- Дія: Додатковий персонал, більше інгредієнтів, маркетинговий пуш
-
Погода має значення (-0.31 на градус)
- Дія: Перевіряйте прогноз, коригуйте підготовку відповідно
- У 30°C день очікуйте ~9 менше піц, ніж при 0°C
-
Пікові години домінують (+8.21 піц)
- Дія: Фокусуйте ресурси на 12-13h та 18-20h
-
Імпульс має значення (+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: Немає систематичної похибки
- Якщо бачите патерни → модель щось упускає!
Коли працює лінійна регресія (а коли ні) ⚠️
Ідеальні випадки використання ✅
Використовуйте лінійну регресію коли:
-
Цільова змінна безперервна
- Прогнозування чисел: продажі, температура, ціна, час
- НЕ категорії: спам/хам, кіт/собака
-
Відносини приблизно лінійні
- Ознаки та ціль мають пряму взаємозалежність
- “Коли X збільшується, Y збільшується/зменшується пропорційно”
-
Потрібна інтерпретованість
- Бізнес хоче зрозуміти ЧОМУ
- “Що керує продажами?” → Вказати на коефіцієнти
- Пояснюваний AI / регуляторні вимоги
-
Важливі швидкі прогнози
- Мільйони прогнозів за секунду
- Просто помножити та додати!
-
У вас достатньо даних
- Правило: 10× зразків на ознаку
- 10 ознак → потрібно 100+ зразків (у нас тисячі!)
Припущення (спрощено)
Лінійна регресія припускає:
-
Лінійність: Відношення між X та Y лінійне
- Перевірка: Побудуйте графік ознак проти цілі, шукайте прямі лінії
-
Незалежність: Спостереження не впливають одне на одне
- Наші дані: Кожне замовлення незалежне ✅
-
Гомоскедастичність: Варіація помилки постійна
- Перевірка: Графік залишків має бути рівномірно розкиданий
- Без “віяла”
-
Нормальність залишків: Помилки нормально розподілені
- Перевірка: Гістограма залишків виглядає як дзвін
Не переживайте, якщо припущення не ідеальні! Реальні дані рідко ідеальні. Поки вони “досить близькі,” лінійна регресія все одно працює.
Коли НЕ використовувати ❌
Не використовуйте лінійну регресію коли:
-
Нелінійні відносини
Приклад: Експоненційне зростання (вірусне поширення, складні відсотки) Рішення: Трансформуйте ознаки (log), або використовуйте іншу модель -
Проблеми класифікації
Приклад: Прогнозувати, чи замовлення велике/мале (категорія) Рішення: Використовуйте логістичну регресію або дерева рішень -
Складні взаємодії
Приклад: Ефект температури залежить від дня тижня Рішення: Додайте ознаки взаємодії (temp × is_weekend) -
Багато нерелевантних ознак
Проблема: Модель однаково ставиться до всіх ознак Рішення: Вибір ознак або регуляризація (Ridge/Lasso) -
Екстремальні викиди
Проблема: Одне кейтерингове замовлення на 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)
Документація:
- Scikit-learn LinearRegression: https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
- Метрики регресії: https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics
Kaggle:
- House Price Prediction (класична задача регресії)
- Туторіали з лінійної регресії
Вітаємо! 🎊 Ви натренували свою першу модель машинного навчання та зробили реальні прогнози. Це величезна віха у вашій ML подорожі!
Пам’ятайте: Почніть просто (лінійна регресія), зрозумійте глибоко, потім переходьте до складних моделей. Принципи, які ви тут вивчили, застосовуються до всіх ML алгоритмів.
Успішного прогнозування! 🚀✨