Linear Regression

Регресійна задача та лінійна регресія з однією змінною

Що таке регресія, чим вона відрізняється від класифікації, рівняння прямої та перша модель передбачення ціни квартири

Регресійна задача та лінійна регресія з однією змінною

🎯 Мета підрозділу

  • Зрозуміти різницю між регресією та класифікацією
  • Опанувати поняття лінійної регресії з однією змінною
  • Познайомитися з рівнянням прямої Завантаження...
  • Навчитися інтерпретувати параметри Завантаження... (нахил) та Завантаження... (зсув)

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

  • Регресія (regression) — передбачення неперервного числового значення
  • Класифікація (classification) — передбачення категорії
  • Лінійна регресія (linear regression) — модель залежності у вигляді прямої
  • w (weight) — коефіцієнт нахилу прямої (Завантаження...)
  • b (bias) — вільний член, зсув по осі Завантаження... (Завантаження...)

Історія про рієлтора, який хоче передбачати ціни

Олена працює рієлтором уже п'ять років. Щодня їй телефонують клієнти з питаннями: «У мене квартира 50 квадратних метрів у центрі міста — скільки вона може коштувати?» або «Хочу продати трикімнатну квартиру на 7 поверсі — яку ціну виставити?»

Зараз Олена відповідає інтуїтивно, «на око», спираючись на свій багатий досвід. Але такий підхід має недоліки:

  • Неточність: інтуїція може помилятися, особливо для нестандартних квартир
  • Повільність: треба згадати подібні угоди, прикинути поправки
  • Немасштабованість: Олена не може обробити 100 запитів за годину

Але у неї є скарб — база даних за минулий рік: площа та ціна 100 проданих квартир. Чи можна використати ці дані, щоб формалізувати залежність математично? Щоб комп'ютер миттєво видавав відповідь для будь-якої площі?

Це класична задача машинного навчання з учителем: у нас є дані з правильними відповідями (площа → ціна), і ми хочемо навчити модель знаходити закономірність.

Що таке регресійна задача?

Перед тим як розібратися з конкретним алгоритмом, потрібно зрозуміти, до якого класу задач належить наша проблема.

Регресія (regression) — це тип завдання машинного навчання, де потрібно передбачити неперервне числове значення на основі вхідних ознак.

Приклади регресійних задач

Вхідні ознакиЦільова змінна (що передбачаємо)Тип задачі
Площа квартири (м²)Ціна ($)Регресія
Стаж роботи (роки), освіта, містоЗарплата ($)Регресія
Температура, вологість, опадиВрожай пшениці (тонн/га)Регресія
Кількість кімнат, поверх, районВартість оренди ($/місяць)Регресія
Пробіг автомобіля (км), рік випускуЦіна автомобіля ($)Регресія
Ключова ознака регресії: результат — це число з континуального діапазону. Наприклад, ціна може бути 45 000 $, 45 123.50 $, 45 123.99 $ — будь-яке значення в межах розумного.
Аналогія (Нитка між цвяшками): Лінійна регресія — це як натягнути пружну нитку між точками на дерев'яній дошці з цвяшками так, щоб вона проходила якомога ближче до всіх цвяшків одразу. Нитка не зобов'язана проходити крізь кожен окремий цвяшок, але її пружний натяг урівноважується так, щоб сумарне відхилення від усіх точок було найменшим.

Регресія vs Класифікація

Студенти часто плутають ці два фундаментальні типи задач машинного навчання з учителем (supervised learning). Головна відмінність полягає у природі цільової змінної Завантаження...: чи є вона неперервною числовою величиною, чи належить до фіксованої дискретної множини класів.

У задачі регресії ми шукаємо неперервну математичну функцію Завантаження..., яка проходить якомога ближче до точок у просторі спостережень. Прогноз моделі — це число (наприклад, 18.7 або 21.2). У задачі класифікації мета зовсім інша — знайти розділову межу (decision boundary), яка розділяє простір ознак на ізольовані регіони, що відповідають окремим класам (0 або 1).

# Передбачаємо ЧИСЛО
def predict_blood_pressure(age, weight, height):
    """
    Вхід: вік, вага, зріст
    Вихід: артеріальний тиск (число, наприклад 120.5 мм рт.ст.)
    """
    return model.predict([age, weight, height])

# Приклад виводу
>>> predict_blood_pressure(45, 80, 175)
122.3  # неперервне число

Порівняльна таблиця:

ХарактеристикаРегресіяКласифікація
Що передбачаємо?Число (неперервне)Категорію (дискретну)
Приклад виводу45 123.50 $"spam" / "не spam"
Діапазон значеньБезмежний (або великий)Фіксована кількість класів
Метрики якостіMAE, MSE, R²Accuracy, Precision, Recall
Приклади алгоритмівЛінійна регресія, Ridge, LassoЛогістична регресія, SVM
Аналогія (Термометр vs Світлофор):
  • Регресія — це термометр: показує точне неперервне число на шкалі (Завантаження..., Завантаження..., Завантаження...).
  • Класифікація — це світлофор: обирає один із кількох фіксованих дискретних станів (червоний, жовтий або зелений).
Не плутайте: логістична регресія (logistic regression), незважаючи на історичну назву «регресія», розв'язує задачу класифікації! Вона прогнозує апостеріорну ймовірність належності до класу (число на відрізку Завантаження...), але фінальне рішення приймається через порогове відсікання: якщо Завантаження..., то клас 1, інакше 0.

Типологія регресійних моделей у машинному навчанні

Залежно від кількості вхідних факторів та характеру фізичних взаємозв'язків у даних, у математичному моделюванні виділяють кілька фундаментальних класів регресійних моделей.

Розглянемо базові відмінності між ними:

  1. Проста лінійна регресія (Simple Linear Regression):
    • Моделює залежність між однією вхідною ознакою Завантаження... та цільовою змінною Завантаження....
    • Формула: Завантаження....
    • Геометрична форма: пряма лінія у двовимірному просторі.
    • Приклад: залежність вартості житла суто від площі.
  2. Множинна лінійна регресія (Multiple Linear Regression):
    • Узагальнює задачу на випадок Завантаження... взаємопов'язаних факторів (Завантаження...).
    • Формула: Завантаження....
    • Геометрична форма: гіперплощина у багатовимірному просторі (для двох ознак — похила площина у 3D).
    • Приклад: прогнозування ціни за площею, кількістю кімнат, поверхом та відстанню до метро.
  3. Поліноміальна регресія (Polynomial Regression):
    • Застосовується, коли емпіричні спостереження демонструють виражену кривизну (прискорення, насичення або параболічний спад).
    • Формула: Завантаження....
    • Зберігає лінійність відносно ваг Завантаження..., але додає нелінійні степені вхідних факторів.
  4. Логістична регресія (Logistic Regression):
    • Пропускає лінійну комбінацію через сигмоїдну функцію активації Завантаження..., перетворюючи будь-яке дійсне число на ймовірність від 0 до 1.
    • Використовується для задач бінарної та багатокласової класифікації.

Візуалізація проблеми: який паттерн у даних?

Повернемося до задачі Олени. Завантажимо дані та подивимося на них.

regression_intro.ipynb
Python 3.11 (ipykernel)
Code
In [1]:
0.15s
import numpy as np
import matplotlib.pyplot as plt

# Генеруємо синтетичні дані (імітація бази Олени)
rng = np.random.default_rng(seed=42)
area = np.array([45, 50, 60, 55, 70, 65, 80, 75, 90, 85,
                 100, 95, 110, 105, 120, 115, 130, 125, 140, 135])
# Справжня залежність: ціна ≈ 500$/м² + випадковий шум
price = 500 * area + rng.normal(0, 3000, 20)

print(f"Кількість спостережень: {len(area)}")
print(f"Діапазон площ: {area.min()} — {area.max()} м²")
print(f"Діапазон цін: ${price.min():.0f} — ${price.max():.0f}")
Out[1]:
Кількість спостережень: 20 Діапазон площ: 45 — 140 м² Діапазон цін: $20474 — $69158
In [2]:
0.22s
# Побудуємо scatter plot (точкову діаграму)
fig, ax = plt.subplots(figsize=(10, 6))

ax.scatter(area, price, s=100, alpha=0.7, color="steelblue",
           edgecolor="navy", linewidth=1.5, label="Продані квартири")

ax.set_title("Залежність ціни квартири від площі", 
             fontsize=14, fontweight="bold")
ax.set_xlabel("Площа (м²)", fontsize=12)
ax.set_ylabel("Ціна ($)", fontsize=12)
ax.grid(True, alpha=0.3)
ax.legend(fontsize=11)

plt.tight_layout()
plt.show()
Out[2]:
md
Спостереження: Точки розташовані не хаотично — видно чіткий позитивний лінійний тренд: чим більша площа, тим вища ціна. Це означає, що між змінними існує кореляція, яку можна описати математично.
У реальності дані рідко утворюють ідеальну пряму. Завжди присутній шум (noise) — випадкові відхилення через:
  • Особливості конкретної квартири (стан ремонту, вид з вікна)
  • Помилки вимірювання
  • Фактори, які ми не врахували (район, поверх, наявність балкона)

Рівняння прямої: математична основа лінійної регресії

Якщо залежність лінійна, її можна описати рівнянням прямої зі шкільного курсу алгебри:

Завантаження...

Розшифруємо кожен символ:

СимволНазваЩо означає
Завантаження...Вхідна ознака (feature)Площа квартири (м²) — те, що ми знаємо
Завантаження...Передбачення (prediction)Ціна, яку передбачає модель ($)
Завантаження...Вага, коефіцієнт нахилу (weight)На скільки зростає ціна при збільшенні площі на 1 м²
Завантаження...Зсув, вільний член (bias)Базова ціна при площі = 0 (теоретичне значення)
Аналогія (Тарифний план оператора або лічильник таксі):
Рівняння лінійної регресії влаштоване точнісінько як рахунок за мобільний зв'язок або оплата поїздки в таксі:
  • Завантаження... (зсув / bias) — це абонентська плата (або посадка в авто). Її сплачують обов'язково, навіть якщо за місяць виговорили 0 хвилин чи взагалі не рушили з місця (Завантаження...).
  • Завантаження... (нахил / weight) — це тариф за кожну хвилину (або ціна за 1 км шляху). Визначає, на скільки зростає сума з кожною одиницею послуги.
  • Завантаження... — це підсумковий чек за місяць.
Завантаження...
Чому "шапочка" над y? Символ Завантаження... (ігрек з шапочкою) означає передбачення моделі, а не реальне значення. Реальна ціна позначається просто як Завантаження.... Різниця Завантаження... — це помилка моделі.

Геометрична інтерпретація параметрів

Параметри Завантаження... та Завантаження... мають прозорий геометричний зміст, що визначає орієнтацію та положення регресійної прямої на декартовій площині:

  • Коефіцієнт нахилу Завантаження... (weight / slope): задає кутовий коефіцієнт дотичної або самої прямої. Він показує темп зміни цільової змінної. Чим вище додатне значення Завантаження..., тим крутіше пряма підіймається вгору. Якщо Завантаження..., пряма є суворо горизонтальною (немає лінійного зв'язку). При Завантаження... залежність стає оберненою (наприклад, вік будівлі та її ринкова вартість).
  • Зсув Завантаження... (bias / intercept): відповідає точці перетину прямої з віссю ординат Завантаження... при нульовому значенні аргументу (Завантаження...). Він зсуває пряму вгору чи вниз паралельно самій собі.

Чому на графіку Завантаження..., а в практичних прикладах Завантаження...? (Фізична розмірність ваг)Числове значення коефіцієнта Завантаження... нерозривно пов'язане з одиницями вимірювання координатних осей і завжди має фізичну розмірність:
Завантаження...
  1. На графіку вище: вісь Завантаження... вимірюється в тисячах доларів (тис. $), а вісь Завантаження... — у квадратних метрах (м²). Відповідно, Завантаження... означає приріст на Завантаження... тис. $/м², тобто рівно Завантаження... $/м². Невеликі числа (Завантаження...) використано для наочності геометричної сітки, щоб графік залишався компактним і легкочитним.
  2. У прикладах нижче: цільова змінна Завантаження... задається безпосередньо в одиничних доларах ($), тому нахил записано повним числом: Завантаження... $/м².
Значення Завантаження... та Завантаження... виражають один і той самий реальний темп зростання вартості, проте в різних масштабах шкали.
Loading diagram...
graph TD
    A["Параметр <strong>w</strong> (нахил)"] -->|"w > 0"| B["Пряма йде вгору<br/>(позитивна кореляція)"]
    A -->|"w = 0"| C["Горизонтальна лінія<br/>(немає залежності)"]
    A -->|"w < 0"| D["Пряма йде вниз<br/>(негативна кореляція)"]
    
    E["Параметр <strong>b</strong> (зсув)"] -->|"b > 0"| F["Пряма перетинає Y вище нуля"]
    E -->|"b = 0"| G["Пряма проходить через початок координат"]
    E -->|"b < 0"| H["Пряма перетинає Y нижче нуля"]
    
    style A fill:#dbeafe,stroke:#1e40af,color:#1e293b
    style E fill:#fef3c7,stroke:#b45309,color:#1e293b
    style B fill:#dcfce7,stroke:#15803d,color:#1e293b
    style C fill:#e2e8f0,stroke:#475569,color:#1e293b
    style D fill:#dcfce7,stroke:#15803d,color:#1e293b
    style F fill:#dcfce7,stroke:#15803d,color:#1e293b
    style G fill:#e2e8f0,stroke:#475569,color:#1e293b
    style H fill:#dcfce7,stroke:#15803d,color:#1e293b

Приклад: три варіанти моделі

Спробуємо «вручну» підібрати параметри w та b і подивимося, як виглядають різні варіанти моделі.

model_comparison.ipynb
Python 3.11 (ipykernel)
Code
In [1]:
import numpy as np
import matplotlib.pyplot as plt

# Ті ж дані
rng = np.random.default_rng(seed=42)
area = np.array([45, 50, 60, 55, 70, 65, 80, 75, 90, 85,
                 100, 95, 110, 105, 120, 115, 130, 125, 140, 135])
price = 500 * area + rng.normal(0, 3000, 20)

# Три варіанти моделі (різні w та b)
x_line = np.array([40, 145])

model_1 = {"w": 600, "b": -5000, "label": "Модель 1 (занадто крута)"}
model_2 = {"w": 300, "b": 10000, "label": "Модель 2 (занадто плоска)"}
model_3 = {"w": 500, "b": 0, "label": "Модель 3 (оптимальна)"}

fig, ax = plt.subplots(figsize=(10, 6))

# Точки даних
ax.scatter(area, price, s=100, alpha=0.7, color="steelblue",
           edgecolor="navy", linewidth=1.5, label="Реальні дані", zorder=3)

# Три прямі
ax.plot(x_line, model_1["w"] * x_line + model_1["b"], 
        'r--', linewidth=2, alpha=0.6, label=model_1["label"])
ax.plot(x_line, model_2["w"] * x_line + model_2["b"], 
        'g--', linewidth=2, alpha=0.6, label=model_2["label"])
ax.plot(x_line, model_3["w"] * x_line + model_3["b"], 
        'orange', linewidth=3, label=model_3["label"], zorder=2)

ax.set_title("Порівняння трьох варіантів моделі", fontsize=14, fontweight="bold")
ax.set_xlabel("Площа (м²)", fontsize=12)
ax.set_ylabel("Ціна ($)", fontsize=12)
ax.grid(True, alpha=0.3)
ax.legend(loc="upper left", fontsize=10)
ax.set_ylim(15000, 75000)

plt.tight_layout()
plt.show()
Out[1]:
md

Аналіз:

  • Модель 1 (червона): Завантаження... — занадто крутий нахил, переоцінює великі квартири
  • Модель 2 (зелена): Завантаження... — занадто плоска, недооцінює великі та переоцінює малі
  • Модель 3 (помаранчева): Завантаження... — проходить якраз посередині точок

Питання: як автоматично знайти найкращі значення Завантаження... та Завантаження...? Не «на око», а математично?

Відповідь буде в наступних підрозділах: метрики якості та градієнтний спуск.


Інтерпретація параметрів у контексті задачі

Розглянемо модель з параметрами w = 500 та b = 0:

Завантаження...

Що означає w = 500?

Це коефіцієнт нахилу прямої. Він показує, на скільки зміниться ціна при збільшенні площі на 1 м².

Економічний зміст: ціноутворення за районами міста

У реальному секторі нерухомості параметри Завантаження... та Завантаження... безпосередньо відображають географічну та ринкову диференціацію:

  • Центр міста: Завантаження.... Тут як базова вартість престижної локації (Завантаження... $), так і питома ціна кожного квадратного метра (Завантаження... $/м²) є найвищими. Однокімнатна квартира 50 м² коштуватиме 40 000 $.
  • Середня зона (спальний район): Завантаження.... Помірні показники (Завантаження..., Завантаження...), квартира 50 м² оцінюється у 27 500 $.
  • Околиця (передмістя): Завантаження.... Низький поріг входу (Завантаження... $) та доступний метр (Завантаження... $/м²). Та сама площа 50 м² обійдеться всього у 17 000 $.

Цей приклад доводить: параметри лінійної регресії є не просто абстрактними коефіцієнтами оптимізації, а мають чіткий інженерний та бізнесовий зміст.


Формальне визначення лінійної регресії

Тепер, коли ми розглянули інтуїцію, дамо формальне визначення.

Лінійна регресія (Linear Regression) — це метод машинного навчання з учителем, який моделює залежність між:

  • Однією або кількома вхідними ознаками Завантаження... (predictor variables, features)
  • Однією цільовою змінною Завантаження... (target variable, response)

у вигляді лінійної функції:

Завантаження...

для одної змінної, або

Завантаження...

для багатьох змінних (про це детальніше в підрозділі 04).

Чому "лінійна"? Тому що залежність описується лінійною комбінацією вхідних змінних. Графічно це пряма лінія (для 1 змінної), площина (для 2 змінних) або гіперплощина (для багатьох змінних).

Обмеження лінійної регресії

Лінійна регресія — це потужний та швидкий інструмент, проте вона демонструє надійні результати лише тоді, коли зв'язок між змінними дійсно є лінійним або близьким до нього. Якщо процес підпорядкований складному нелінійному закону, пряма лінія дасть систематично зміщені прогнози.

Приклади нелінійних залежностей у повсякденному житті:
  • Розгін автомобіля: Залежність швидкості від часу розгону не є прямою лінією. На старті прискорення максимальне (стрімкий підйом кривої), проте далі через наростаючий опір повітря темп розгону уповільнюється, виходячи на горизонтальне плато.
  • Врожайність від кількості добрив: Перше внесення мінеральних добрив викликає бурхливе зростання культури, але після певної критичної дози ефект спадає, а надлишок призводить до токсичності ґрунту (класична парабола закону спадної віддачі).
  • Втома та помилки від тривалості зміни: Перші години роботи супроводжуються високою концентрацією, проте після 8–10 годин безперервної праці кількість браку зростає експоненційно.
Чому лінійна регресія все одно настільки популярна?
Величезна кількість природних, технічних та економічних процесів є приблизно лінійними у локальному робочому діапазоні: ціна квартири від площі (для типових планувань 30–120 м²), витрати пального на трасі при помірній швидкості, зарплата від років досвіду. У межах цього практичного діапазону лінійна модель забезпечує неперевершену швидкість та інтерпретованість.
Коли лінійна регресія НЕ працює:
  1. Суттєва нелінійність: якщо справжня залежність виражено квадратична, експоненційна або циклічна.
  2. Викиди (outliers): одне екстремально аномальне спостереження може сильно «перекосити» лінію МНК.
  3. Мультиколінеарність: якщо вхідні ознаки дублюють одна одну.
  4. Гетероскедастичність: якщо розкид помилок зростає разом зі зростанням ознаки Завантаження....
Для подолання цих явищ застосовують поліноміальну регресію, регуляризацію (Ridge/Lasso) або нелінійні алгоритми (дерева рішень, градієнтний бустинг).

Візуалізація обмеження: нелінійні дані

nonlinear_example.ipynb
Python 3.11 (ipykernel)
Code
In [1]:
0.18s
import numpy as np
import matplotlib.pyplot as plt

# Генеруємо дані з квадратичною залежністю
rng = np.random.default_rng(seed=123)
x = np.linspace(0, 10, 50)
y = 2 * x**2 - 5 * x + 10 + rng.normal(0, 10, 50)

# Спробуємо підібрати лінійну модель (проста лінійна регресія)
w = np.polyfit(x, y, 1)[0]  # нахил
b = np.polyfit(x, y, 1)[1]  # зсув
y_pred_linear = w * x + b

fig, ax = plt.subplots(figsize=(10, 6))

ax.scatter(x, y, s=80, alpha=0.6, color="steelblue", label="Реальні дані")
ax.plot(x, y_pred_linear, 'r-', linewidth=2, label=f"Лінійна модель (y = {w:.1f}x + {b:.1f})")
ax.plot(x, 2 * x**2 - 5 * x + 10, 'g--', linewidth=2, label="Справжня залежність (квадратична)")

ax.set_title("Обмеження лінійної регресії: нелінійні дані", fontsize=14, fontweight="bold")
ax.set_xlabel("x", fontsize=12)
ax.set_ylabel("y", fontsize=12)
ax.legend()
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()
Out[1]:
md
Висновок: червона лінія (лінійна модель) не описує параболічний тренд. Для таких даних потрібна поліноміальна регресія або інші нелінійні методи.

Резюме підрозділу

✅ Ключові висновки

  • Регресія — це передбачення неперервного числового значення
  • Лінійна регресія моделює залежність прямою лінією: Завантаження...
  • Параметр w — це нахил прямої (на скільки змінюється Завантаження... при зміні Завантаження... на 1)
  • Параметр b — це зсув (значення Завантаження... при Завантаження...)
  • Лінійна регресія працює добре для лінійних залежностей, але має обмеження для складних нелінійних даних

🔜 Наступний крок

Тепер ми знаємо, що таке лінійна модель. Але як визначити, яка модель краща?

Для цього потрібні метрики якості — математичні формули, що вимірюють точність передбачень.

Наступний підрозділ: Метрики якості регресії (MAE, MSE, R²)

Copyright © 2026