машинное обучение
June 7, 2022

Быстрый запуск нейросети с библиотекой H2O

Рассмотрим, какие минимальные знания об H2O надо иметь, чтобы использовать ее алгоритмы, а основные действия (подготовку данных и их оценку) производить привычными средствами NumPy, Pandas и Scikit-learn. В этом случае применение H2O будет включать:

  • соединение с h2o кластером (функция init);
  • создание h2o фрейма (легко делается из pandas датафрейма в конструкторе H2OFrame) и преобразование категориальных колонок методом asfactor (в том числе таргета для классификации);
  • создание экземпляра класса оценщика (например, H2ODeepLearningEstimator);
  • вызов метода train на h2o фрейме с именами колонок: зависимой (y) и независимых переменных (x);
  • вызов predict для получения прогнозов и его преобразование в pandas датафрейм методом as_data_frame.

Создадим демонстрационный датафрейм:

import pandas as pd
from sklearn.datasets import make_classification
import numpy as np
np.random.seed(0)

ar, y = make_classification(n_samples=1000, n_features=3, n_informative=2, 
                           n_redundant=0, class_sep = 0.5, shuffle=False, 
                           flip_y=0, n_clusters_per_class=2)

df = pd.DataFrame(ar, columns = ['feat1', 'feat2', 'feat3'])
df['feat4'] = pd.cut(df['feat2'], 5, labels=False)
df['y'] = y
df

Мешаем данные и создаем индексы для тренировочной и валидационной выборок (H2O требует, чтобы индексы шли по возрастанию):

df = df.sample(frac=1).reset_index(drop=True)

tr_idx, val_idx = np.split(np.arange(df.shape[0]), [round(0.8*df.shape[0])])
len(tr_idx), len(val_idx)

Создаем h2o фрейм и преобразовываем категориальные колонки:

import h2o
from h2o import H2OFrame
h2o.init()

h2o_df = H2OFrame(df)
h2o_df['y'] = h2o_df['y'].asfactor()
h2o_df['feat4'] = h2o_df['feat4'].asfactor()

x_cols = df.drop(columns='y').columns.to_list()
y_col = 'y'

Cоздаем экземпляр класса H2ODeepLearningEstimator:

from h2o.estimators.deeplearning import H2ODeepLearningEstimator

clf = H2ODeepLearningEstimator(distribution='bernoulli', activation = 'Rectifier with dropout', 
                               hidden=[10,10], epochs=150, hidden_dropout_ratios=[0.4,0.4],
                               l1=0.0003)
                               

Основные параметры конструктора класса:

distribution - задает тип распределения цели. Распространенными значениями для бинарной классификации являются bernoulli, многоклассовой - multinomial (тип target-а факторный), для регрессии - gaussian, poisson (тип target-а числовой);

balance_classes - флаг устранения дисбаланса классов;

activation - функция активации (Tanh, Tanh with dropout, Rectifier, Rectifier with dropout, Maxout, Maxout with dropout);

hidden - список размеров скрытых слоев;

epochs - количество полных итераций по датасету (по умолчанию 10);

seed - инициализатор генератора случайных чисел;

standardize - надо ли стандартизировать признаки (по умолчанию True);

categorical_encoding - способ преобразования категориальных данных (например, one_hot_internal - по умолчанию, eigen, label_encoder);

missing_values_handling - как обрабатывать пропуски (по умолчанию заполняются средним). Еще можно пропускать;

adaptive_rate - флаг использования адаптивной скорости обучения (по умолчанию True);

rate - задать скорость обучения, когда adaptive_rate является False;

loss - функция потерь, по умолчанию - Automatic. Этот параметр считается автоматически, исходя из выбранного distribution. Вручную для классификации можно установить - Absolute, Quadratic, Huber, CrossEntropy, для регрессии Absolute, Quadratic, Huber;

shuffle_training_data - флаг перемешивания данных (по умолчанию не установлен);

sparse - использовать ли механизм работы с разреженными данными (по умолчанию отключено). Полезно, если много нулей в данных;

quiet_mode - отображать ли меньше логов (по умолчанию отключено);

verbose - писать ли историю оценок в консоль (по умолчанию нет);

регуляризация:

input_dropout_ratio - доля прореживания во входном слое. По умолчанию - 0, иначе предлагается использовать 0.1 или 0.2;

hidden_dropout_ratios - список долей отключений в каждом скрытом слое (применимо, если в качестве функций активации указаны TanhWithDropout, RectifierWithDropout или MaxoutWithDropout). По умолчанию для каждого - 0.5;

l1 - L1 регуляризация на веса нейронов (по умолчанию 0, обычно проверяют значения в области 0,0001);

l2 - L2 регуляризация на веса нейронов (по умолчанию 0, обычно проверяют значения в области 0,0001);

reproducible - флаг воспроизводимости результатов. Активизирует менее эффективный однопоточный режим обучения;

seed - инициализатор случайных чисел. Для воспроизводимости используется вместе с reproducible=True.

Подробнее о параметрах можете прочитать в официальной документации.

Для обучения вызовите метод train с именами колонок для зависимой и независимых переменных:

clf.train(x=x_cols, y=y_col, training_frame=h2o_df[list(tr_idx),:])

получите большую сводную статистику с метриками (приведена только часть):

Для вывода метрик привычным способом (через методы sklearn) преобразуйте предсказания в pandas датафрейм с методом as_data_frame:

from sklearn.metrics import roc_auc_score

roc_auc_score(h2o_df[list(val_idx),:].as_data_frame()['y'], 
              clf.predict(h2o_df[list(val_idx),:]).as_data_frame()['p1'])
from sklearn.metrics import f1_score

f1_score(h2o_df[list(val_idx),:].as_data_frame()['y'], 
         clf.predict(h2o_df[list(val_idx),:]).as_data_frame()['predict'])

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Яндекс Дзен

Telegram