Быстрый запуск нейросети с библиотекой 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'])
Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях: