Классические алгоритмы машинного обучения, реализованные с нуля на NumPy и сравненные по качеству с промышленными библиотеками. Репозиторий создан для того, чтобы показать, почему стандартные реализации работают именно таким образом.
- логистическая функция потерь с аналитическими градиентом и гессианом, оптимальный размер шага (gamma) определяется с помощью line search
- бутстреп Бернулли и байесовский бутстреп (параметр
bagging_temperature, как в CatBoost) - метод случайных подпространств (RSM) — случайный выбор признаков для каждого дерева
- ранняя остановка обучения (early stopping) на валидационной выборке с использованием
use_best_model - кодирование категориальных признаков средним значением целевой переменной (mean-target encoding) со сглаживанием
- сохранение истории обучения и вычисление важности признаков
Сравнение с LightGBM (одинаковые параметры: 300 деревьев, глубина 4, скорость обучения 0.1, subsample=0.8, feature_fraction=0.8, ранняя остановка; метрика ROC-AUC на отложенной тестовой выборке; см. examples/benchmark_boosting.py):
| Набор данных | BoostingClassifier | LightGBM | Разница |
|---|---|---|---|
| breast_cancer (n=569) | 0.9725 | 0.9870 | 1.45 п.п. |
| synthetic (n=20 000) | 0.9665 | 0.9730 | 0.65 п.п. |
Качество модели отличается от LightGBM на 0.7–1.5 процентных пункта по ROC-AUC. Основная оставшаяся разница обусловлена использованием в LightGBM поиска разбиений по гистограммам и роста деревьев по листьям (leaf-wise growth)
from boosting import BoostingClassifier
model = BoostingClassifier(
n_estimators=300, learning_rate=0.1,
base_model_params={"max_depth": 4},
bootstrap_type="Bernoulli", subsample=0.8, rsm=0.8,
early_stopping_rounds=30, eval_metric="val_roc_auc",
)
model.fit(X_train, y_train, eval_set=(X_val, y_val), use_best_model=True)
proba = model.predict_proba(X_test)