Отличный выбор! Онлайн-обучение (или
инкрементальное обучение) особенно полезно, когда:
- Данные приходят потоком (streaming),
- Невозможно хранить всю историю,
- Нужно быстро адаптироваться к новым паттернам (concept drift),
- Объём данных слишком велик для полного переобучения.
---
# 🔁 Онлайн-обучение с
LightGBM: Инкрементальное обучение
#К
#сожалению,
LightGBM не #поддерживает true online learning как,
#например, `SGDRegressor`, но он
поддерживает #продолжение #обучения #модели на
#новых #данных — это называется
continued training или
model continuation.
> ✅ Это
ближайший аналог онлайн-обучения в бустинге:
> Обучил на старых данных → сохранил модель → подгрузил новые данные → дообучил.
---
## ✅ Возможности LightGBM:
- `lgb.train(..., init_model=prev_model)` — дообучение.
- Поддержка `early_stopping` и валидации на каждом шаге.
- Сохранение состояния ансамбля (все деревья).
---
## 🚀 Реализация: Онлайн-обучение по батчам
```python
import lightgbm as lgb
import numpy as np
from sklearn.datasets import make_regression
import time
# Генерируем поток данных: 5 батчей
def data_stream(n_batches=5, batch_size=1000, n_features=10, seed=42):
np.random.seed(seed)
for i in range(n_batches):
# Меняем распределение со временем (concept drift)
X, y = make_regression(
n_samples=batch_size,
n_features=n_features,
noise=10.0,
random_state=seed + i
)
# Имитируем drift: сдвигаем целевую переменную
y = y + i * 5
yield X, y
# Параметры
params = {
'objective': 'regression',
'metric': 'rmse',
'boosting_type': 'gbdt',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.8,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'min_child_samples': 20,
'verbose': -1,
'random_state': 42
}
# Инициализация
model = None
val_size = 200
X_val, y_val = None, None
online_history = []
print("🚀 Запуск онлайн-обучения по батчам...\n")
for i, (X_batch, y_batch) in enumerate(data_stream()):
print(f"📦 Батч {i+1}: {X_batch.shape[0]} образцов")
# Отложим часть для валидации
X_train_b, X_val_b, y_train_b, y_val_b = train_test_split(
X_batch, y_batch, test_size=val_size if len(X_batch) > val_size else 0.2, random_state=42
)
# Объединим валидацию (накапливаем или заменяем)
if X_val is None:
X_val, y_val = X_val_b, y_val_b
else:
# Можно накапливать или использовать скользящее окно
X_val = np.vstack([X_val[-100:], X_val_b]) # последние 100 + новый
y_val = np.hstack([y_val[-100:], y_val_b])
# Создаём датасет
train_data = lgb.Dataset(X_train_b, label=y_train_b)
valid_data = lgb.Dataset(X_val, label=y_val, reference=train_data)
# Дообучаем
model = lgb.train(
params,
train_data,
num_boost_round=50, # маленькие шаги
valid_sets=[valid_data],
valid_names=['valid'],
init_model=model, # ← КЛЮЧЕВОЙ ПАРАМЕТР: продолжаем обучение
verbose_eval=False
)
# Логируем
score = model.best_score.get('valid', {}).get('rmse', np.nan)
online_history.append(score)
print(f" RMSE на валидации: {score:.4f}")
# Сохраняем модель (опционально)
model.save_model(f'lgb_online_model_batch_{i}.txt')
print("\n✅ Онлайн-обучение завершено.")
```
---
## 📈 Визуализация прогресса
```python
import matplotlib.pyplot as plt
plt.plot(online_history, marker='o')
plt.title("Онлайн-обучение: RMSE по батчам")
plt.xlabel("Батч")
plt.ylabel("RMSE")
plt.grid(True)
plt.show()
```
---
## ⚠️ Ограничения и best practices
| Проблема | Решение |
|--------|--------|
|
Нет true online learning | Используй маленькие батчи и частое дообучение |
|
Переобучение на новых данных | Используй `learning_rate < 0.1`, `early_stopping`, `bagging` |
| **