Перейти к содержимому

GradientBoostingRegressor

GradientBoostingRegressor — ансамблевая модель регрессии, которая строит много деревьев решений последовательно.

Главная идея: каждое следующее дерево пытается исправить ошибки уже построенной модели.

В случайном лесе деревья строятся независимо, а затем их ответы усредняются.

В градиентном бустинге деревья строятся одно за другим:

дерево 1 даёт грубый прогноз
дерево 2 исправляет ошибки дерева 1
дерево 3 исправляет ошибки суммы деревьев 1 и 2
дерево 4 исправляет оставшиеся ошибки
...

Итоговый прогноз получается как сумма небольших поправок, которые добавляют отдельные деревья.

МодельКак строит деревьяКак получает прогноз
RandomForestRegressorмного независимых деревьевусредняет прогнозы
GradientBoostingRegressorцепочка деревьевкаждое дерево добавляет поправку

Случайный лес уменьшает нестабильность одного дерева. Градиентный бустинг постепенно улучшает прогноз, исправляя ошибки предыдущих шагов.

GradientBoostingRegressor полезен, когда нужна сильная модель для нелинейной зависимости.

Например, цена квартиры может зависеть от площади, числа комнат, этажа и расстояния до метро не по одной простой формуле. Бустинг может постепенно подобрать более точную зависимость.

uses MLABC;
begin
var ds := Datasets.MoscowHousing;
var df := ds.Data;
var features := [
'rooms',
'area',
'kitchen_area',
'floor',
'floors_total',
'metro_minutes'
];
var target := 'price';
var (trainDf, testDf) := df.TrainTestSplit(0.2, seed := 42);
var Xtrain := trainDf.ToMatrix(features);
var ytrain := trainDf.ToVector(target);
var Xtest := testDf.ToMatrix(features);
var ytest := testDf.ToVector(target);
var model := new GradientBoostingRegressor(seed := 42);
model.Fit(Xtrain, ytrain);
var pred := model.Predict(Xtest);
Println('R²:', Metrics.R2(ytest, pred):0:3);
end.

Вывод:

R²: 0.837

R² = 0.837 означает, что модель объясняет примерно 83.7% разброса цен на тестовой выборке.

Это хороший результат, хотя в данном примере RandomForestRegressor показал более высокое значение . На практике качество бустинга сильно зависит от параметров модели.

  • nEstimators — сколько деревьев построить;
  • learningRate — насколько сильно учитывать каждое новое дерево;
  • maxDepth — максимальная глубина отдельных деревьев;
  • seed — фиксирует случайность.

Если learningRate сделать слишком большим, модель может переобучиться. Если слишком маленьким — потребуется больше деревьев.

  • умеет строить сложные нелинейные зависимости;
  • каждое новое дерево исправляет ошибки предыдущих;
  • часто хорошо работает после настройки параметров.
  • чувствительнее к параметрам, чем случайный лес;
  • обучается последовательно, поэтому может быть медленнее;
  • хуже объясняется, чем одно дерево решений.

Для сравнения можно вернуться к RandomForestRegressor или посмотреть метрику R2 Score, которая используется в примере.