Синтетичний датасет
Створюємо керований набір даних: площа, поверх, район, вік будинку, індекс попиту. Це дозволяє тестувати сценарії, для яких поки немає реальних даних.
Інформативна сторінка-лабораторія про те, як програмується симулятор машинного навчання: генерація даних, feature engineering, цикл навчання, метрики, аналіз стабільності та перехід до продакшен-сценарію.
Базовий кейс: оцінка ринкової вартості квартири за ознаками об'єкта і району. У реальних даних багато шуму, пропусків та неідеальних розподілів. Тому симулятор дає безпечний майданчик, де можна відлагодити логіку навчання ще до інтеграції в API або продукт.
Створюємо керований набір даних: площа, поверх, район, вік будинку, індекс попиту. Це дозволяє тестувати сценарії, для яких поки немає реальних даних.
Змінюємо `learning rate`, кількість епох, обсяг вибірки та шум. Так можна швидко побачити, які режими призводять до збіжності, а які ламають навчання.
Порівнюємо MSE/MAE/R² між запуском експериментів, зберігаємо конфігурації та формуємо технічний висновок для наступної ітерації моделі.
В інженерній реалізації кожен крок має логування, перевірки якості, контроль random seed і версіювання артефактів. Це обов'язково для репродуктивних експериментів.
Перевіряємо пропуски, викиди, неправильні типи, а також зсуви розподілів. Якщо ключова ознака містить занадто багато NaN, симулятор має попередити, що метрики будуть недостовірні.
Фіксуємо версію коду, seed і конфіг запуску. Без цього неможливо чесно порівняти EXP-01 та EXP-02, навіть якщо вони виглядають схожими.
Блок нижче не запускає повну модель на сервері, але добре ілюструє вплив гіперпараметрів на форму кривої loss та ключові метрики.
Типова організація: окремі модулі генерації даних, тренування та оцінки. Така декомпозиція робить код масштабованим і тестованим.
# generator.py
+import numpy as np
+
+def make_dataset(n_samples: int, noise: float, seed: int = 42):
+ rng = np.random.default_rng(seed)
+ area = rng.normal(62, 18, size=n_samples).clip(18, 180)
+ district = rng.integers(1, 6, size=n_samples)
+ age = rng.integers(0, 50, size=n_samples)
+ demand = rng.uniform(0.8, 1.4, size=n_samples)
+
+ y = (
+ 38000 + area * 1350 + district * 5200 - age * 420
+ + demand * 11000 + rng.normal(0, noise * 18000, size=n_samples)
+ )
+ X = np.column_stack([area, district, age, demand])
+ return X, y
# train.py
+import numpy as np
+
+def train_linear(X, y, lr=0.01, epochs=100):
+ n, f = X.shape
+ w = np.zeros(f)
+ b = 0.0
+ history = []
+
+ for _ in range(epochs):
+ y_pred = X @ w + b
+ err = y_pred - y
+ loss = (err ** 2).mean()
+ dw = (2 / n) * (X.T @ err)
+ db = (2 / n) * err.sum()
+ w -= lr * dw
+ b -= lr * db
+ history.append(loss)
+
+ return w, b, history
Симулятор дозволяє швидко формувати таблицю запусків та приймати рішення на основі метрик, а не інтуїції.
| ID | Samples | Noise | LR | Epochs | MAE | R² | Висновок |
|---|---|---|---|---|---|---|---|
| EXP-01 | 800 | 0.10 | 0.030 | 70 | 7 400 | 0.93 | Сильна базова лінія |
| EXP-02 | 1200 | 0.18 | 0.045 | 60 | 8 100 | 0.90 | Баланс якості та швидкості |
| EXP-03 | 1200 | 0.32 | 0.120 | 40 | 12 900 | 0.72 | Нестабільний режим |
| EXP-04 | 3000 | 0.14 | 0.018 | 120 | 6 950 | 0.95 | Оптимальний компроміс |
Тест на кількох seed і різних рівнях шуму.
Інтеграція моделі у FastAPI або Flask з логуванням.
Контроль data drift і періодичний retraining.
Автотести якості, версіювання моделей, release-процес.
Так, безумовно. Базова структура пайплайну (підготовка даних → тренування → оцінка) залишається незмінною. Вам потрібно лише:
y є категоріальною (0/1 або класи).Регуляризація необхідна, коли модель показує ознаки перенавчання (overfitting): помилка на тренувальних даних продовжує падати, а на валідаційних — починає зростати. Це часто трапляється, коли у вас мало даних або занадто багато ознак.
Для відтворюваного ML-проєкту рекомендується стандартна структура (наприклад, Cookiecutter Data Science):
data/: розбита на raw (сирі) та processed (готові до навчання).
notebooks/: для EDA (Exploratory Data Analysis) та швидких прототипів.src/: модульний вихідний код (генерація, тренування, оцінка).models/: збережені ваги навчених моделей (.pkl, .pt).reports/: графіки, метрики та звіти експериментів.Градієнтний спуск працює набагато швидше і стабільніше, коли всі ознаки мають схожий масштаб (наприклад, 0-1 або Standard Scaler). Якщо одна ознака вимірюється в тисячах (площа), а інша в одиницях (кількість кімнат), оптимізатор буде "блукати" у витягнутому просторі помилок, і збіжність займе набагато більше часу.
Дотримуйтесь принципу "Бритви Оккама" — починайте з найпростішого:
Underfitting (високий bias): Модель занадто проста.
Overfitting (високий variance): Модель "завчила" шум.
Величина, яку ми хочемо передбачити (ціна квартири). У навчанні це "відповідь", з якою модель порівнює свій прогноз.
Вхідні параметри (площа, поверх, район), на основі яких модель робить прогноз. Чим якісніші ознаки, тим краща модель.
Внутрішні параметри моделі. Ваги (weights) показують важливість кожної ознаки, а зміщення (bias) коригує базовий рівень прогнозу.
Крок навчання. Завеликий крок робить навчання нестабільним, а замалий — надто повільним.
Кількість повних проходів алгоритму через весь набір даних. Більше епох — точніша підгонка, але є ризик перенавчання.
Показник помилки на навчальних даних. Мета навчання — мінімізувати це значення.