машинное обучение
June 20, 2023

Градиентный бустинг с библиотекой H2O

Рассмотрим, какие параметры имеет класс H2OGradientBoostingEstimator для решения задач машинного обучения, как обучать и тестировать модель. В качестве примера загрузим данные о заболеваемости раком через метод load_breast_cancer из sklearn (подробнее о получении датасетов с использованием библиотеки):

from sklearn.datasets import load_breast_cancer
import pandas as pd
import numpy as np
SEED=0
np.random.seed(SEED)

df = load_breast_cancer(as_frame=True)['frame']
df.sample(frac=1)
df.head()

Разделим выборки, инициализируем h2o кластер (подробнее здесь), создадим фрейм и укажем колонки:

tr_idx, val_idx = np.split(range(df.shape[0]), [int(0.8*df.shape[0])])
import h2o
h2o.init()
from h2o import H2OFrame

h2o_df = H2OFrame(df)
target_col = 'target'
features = h2o_df.columns
features.remove(target_col)

h2o_df[target_col] = h2o_df[target_col].asfactor()

Ниже привожу основные параметры модели, которые понадобятся для обучения:

  • ntrees - количество деревьев (по умолчанию 50);
  • max_depth - максимальная глубина (5);
  • min_rows - минимальное количество наблюдений в листе (10)
  • min_split_improvement - минимальное улучшение для разделения узла (1e-05);
  • learn_rate - скорость обучения (0.1);
  • learn_rate_annealing - множитель скорости обучения с каждой итерацией (1)
  • sample_rate - доля наблюдений для обучения каждого дерева (1);
  • col_sample_rate - доля признаков, участвующих при сплите дерева(1);
  • seed - инициализатор счетчика случайных чисел;
  • balance_classes - надо ли сбалансировать классы перед обучением (False);
  • model_id - имя модели (идентификатор, по которому модель можно найти в H2O Flow);
  • build_tree_one_node - флаг запуска вычислений только на одном узле (False). При малых датасетах лучше выставить, чтобы не задействовать ресурсы кластера и тратить время на взаимодействие между нодами;
  • distribution - задает тип задачи и распределение target-а. Предпочтительными значениями для бинарной классификации являются bernoulli, многоклассовой - multinomial (тип target-а факторный), для регрессии - gaussian, poisson (тип target-а числовой);

Для обучения создаете класс с желаемыми параметрами и вызываете метод train, которому передайте список имен признаков, целевой колонки, тренировочный фрейм и другие параметры (я передам еще валидационный фрейм):

from h2o.estimators import H2OGradientBoostingEstimator

gbm = H2OGradientBoostingEstimator(distribution="bernoulli",
                                   ntrees=10, max_depth=3,
                                   min_rows=2, learn_rate=0.2,
                                   seed=SEED)

_ = gbm.train(x=features, y=target_col, training_frame=h2o_df[list(tr_idx),:],
          validation_frame=h2o_df[list(val_idx),:])

Значения набора валидационных метрик можно получить методом model_performance с параметром valid=True или, передав ему валидационный фрейм в параметре test_data:

gbm.model_performance(valid=True)
# gbm.model_performance(test_data=h2o_df[list(val_idx),:])