Skip to the content.

Эксперимент 2026-05-26: LightGBM baseline для прогноза урожайности

Постановка

Прогноз урожайности риса по полям Темрюкского района Краснодарского края. Датасет – 20 строк × 22 колонки (см. data/processed/fields_features.csv). Из них 18 числовых фичей, 1 синтетический таргет yield_centner_ha, 3 поля метаинфы (field_id, crop_osm, ndvi_date_peak).

Важная оговорка: таргет синтетический, сгенерирован в feature_engineering.py по правилу yield = 55 + 30*(NDVI_peak - median) + N(0, 2). Реальной пол-уровневой урожайности риса в открытом доступе нет (Росстат публикует на районном уровне с задержкой). Это означает: метрики честные относительно pipeline и feature engineering, но не доказывают качество модели на реальных данных. Для реальной задачи нужен multi-year + multi-region датасет.

Дизайн оценки

Результаты LOO-CV

Модель Фичи MAPE % MAE RMSE
baseline_mean 0 4.96 2.758 3.534 0.000
baseline_lr_peak 1 2.95 1.613 1.932 0.701
baseline_lr_ndvi 9 4.48 2.459 3.291 0.132
lightgbm 18 4.39 2.412 2.915 0.319
lightgbm_ndvi_only 9 4.54 2.518 2.910 0.322

Победитель: LinearRegression на одной фиче ndvi_peak. MAPE 2.95%, R² 0.70.

Интерпретация

Почему простая линейная модель бьёт LightGBM

  1. Маленький N. 20 строк – слишком мало для LightGBM. На 19 точках тренировки модель находит сложные паттерны в шуме.
  2. Структура таргета. Синтетический таргет линеен по ndvi_peak, остальные фичи – шум, погода вообще константа. Линейная регрессия с одной правильной фичей – идеальная функциональная форма для этой задачи.
  3. LinearRegression на 9 NDVI-фичах хуже, чем на одной (R² 0.13 vs 0.70) – это эффект мультиколлинеарности. Все NDVI-фичи сильно коррелируют между собой, lin regression “размывает” коэффициенты.
  4. LightGBM добавляет шум на маленьком датасете. Train MAPE 0.03% (идеально), LOO MAPE 4.39% – классический симптом переобучения. 18 фичей × 20 точек = слишком высокая dimensionality.

Что делает LightGBM правильно

Регрессия к среднему

На scatter predicted vs actual видно классический паттерн regression to mean:

Это типично для деревьев на маленьких датасетах: модель «жмётся» к среднему обучающего множества.

Выводы для портфолио

Главный методологический сигнал. Простая линейная регрессия на одной фиче ndvi_peak побеждает LightGBM на 18 фичах (MAPE 2.95% vs 4.39%, R² 0.70 vs 0.32). Train MAPE LightGBM = 0.03%, LOO MAPE = 4.39% – классический симптом переобучения. На 20 точках бустинг бесполезен. Это показывает зрелое понимание bias-variance trade-off, а не подход «лишь бы LightGBM запустить». Зрелый ML начинается с baseline и доказывает, что более сложная модель оправдана.

  1. На 20 точках LightGBM не нужен. Простая линейная регрессия с одной правильной фичей даёт лучший результат. Это важный методологический урок: gradient boosting – инструмент для данных с нелинейностями И большим N. Когда либо одно отсутствует, baseline побеждает.
  2. Pipeline работает корректно. Модель ловит правильные предикторы, отсекает шум (константы погоды), даёт ожидаемые корреляции. Если подключить реальные данные с дисперсией по погоде (разные годы, разные регионы) – LightGBM покажет свою силу.
  3. Feature engineering важнее модели. Самая сильная фича (NDVI peak) даёт R² 0.70 в простейшей линейной регрессии. Остальные фичи добавляют шум на текущем датасете – их ценность раскроется при multi-year данных.
  4. Честность важнее впечатления. В отчёт включён как победный baseline_lr_peak, так и слабый LightGBM. Это даёт нанимателю реальную картину знаний и зрелости анализа.

Что дальше

Артефакты

Параметры LightGBM

{
    "n_estimators": 300,
    "learning_rate": 0.05,
    "num_leaves": 7,
    "min_data_in_leaf": 2,
    "max_depth": 4,
    "feature_fraction": 0.8,
    "bagging_fraction": 0.8,
    "bagging_freq": 3,
    "lambda_l2": 0.1,
    "random_state": 42,
}

Tuning гиперпараметров не проводилось: на 20 точках любой grid search будет переобучаться на CV. Использованы консервативные настройки (мало листьев, регуляризация).