Как найти наилучшие параметры модели лидера в automl h2o python

#python #parameters #h2o #automl

#python #параметры #h2o #automl

Вопрос:

Я обучил h2o automl и получил модель лидера с удовлетворяющими метриками. Я хочу периодически переучивать модель, но без использования контрольной точки. Итак, я думаю, все, что мне нужно, это наилучшие параметры модели лидера, чтобы запустить ее вручную. Я знаю automlmodels.leader.params но он выдает список всех опробованных параметров. Как я могу получить лучшие параметры, найденные в таблице лидеров?

Комментарии:

1. Является ли модель лидера многоуровневым ансамблем или чем-то другим? Я просто спрашиваю, потому что обычно SE является лидером, а SES не имеют контрольных точек.

2. На самом деле это glm. Но меня не интересуют контрольные точки. Я хочу найти наилучшие параметры

Ответ №1:

Вот решение, использующее пример из руководства пользователя H2O AutoML. Параметры для любой модели хранятся в model.params расположении. Итак, если вы хотите получить параметры для модели лидера, то вы можете получить к ним доступ здесь: aml.leader.params . Если бы вам нужна была другая модель, вы бы преобразовали эту модель в объект на Python с помощью h2o.get_model() функции и аналогичным образом получили доступ к параметрам с помощью .params .

.params Объект представляет собой словарь, в котором хранятся все значения параметров (по умолчанию и фактические).

 import h2o
from h2o.automl import H2OAutoML

h2o.init()

# Import a sample binary outcome train/test set into H2O
train = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_train_10k.csv")
test = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_test_5k.csv")

# Identify predictors and response
x = train.columns
y = "response"
x.remove(y)

# For binary classification, response should be a factor
train[y] = train[y].asfactor()
test[y] = test[y].asfactor()

# Run AutoML for 20 base models (limited to 1 hour max runtime by default)
aml = H2OAutoML(max_models=20, seed=1)
aml.train(x=x, y=y, training_frame=train)
  

Верхняя часть таблицы лидеров выглядит следующим образом:

 In [3]: aml.leaderboard
Out[3]:
model_id                                                  auc    logloss    mean_per_class_error      rmse       mse
---------------------------------------------------  --------  ---------  ----------------------  --------  --------
StackedEnsemble_AllModels_AutoML_20190309_152507     0.788879   0.552328                0.315963  0.432607  0.187149
StackedEnsemble_BestOfFamily_AutoML_20190309_152507  0.787642   0.553538                0.317995  0.433144  0.187614
XGBoost_1_AutoML_20190309_152507                     0.785199   0.557134                0.327844  0.434681  0.188948
XGBoost_grid_1_AutoML_20190309_152507_model_4        0.783523   0.557854                0.318819  0.435249  0.189441
XGBoost_grid_1_AutoML_20190309_152507_model_3        0.783004   0.559613                0.325081  0.435708  0.189841
XGBoost_2_AutoML_20190309_152507                     0.782186   0.558342                0.335769  0.435571  0.189722
XGBoost_3_AutoML_20190309_152507                     0.7815     0.55952                 0.319151  0.436034  0.190126
GBM_5_AutoML_20190309_152507                         0.780837   0.559903                0.340848  0.436191  0.190263
GBM_2_AutoML_20190309_152507                         0.780036   0.559806                0.339926  0.436415  0.190458
GBM_1_AutoML_20190309_152507                         0.779827   0.560857                0.335096  0.436616  0.190633

[22 rows x 6 columns]
  

Здесь лидером является многоуровневый ансамбль. Мы можем посмотреть на имена параметров следующим образом:

 In [6]: aml.leader.params.keys()
Out[6]: dict_keys(['model_id', 'training_frame', 'response_column', 'validation_frame', 'base_models', 'metalearner_algorithm', 'metalearner_nfolds', 'metalearner_fold_assignment', 'metalearner_fold_column', 'keep_levelone_frame', 'metalearner_params', 'seed', 'export_checkpoints_dir'])
In [7]: aml.leader.params['metalearner_algorithm']
Out[7]: {'default': 'AUTO', 'actual': 'AUTO'}
  

Если вас интересует GLM (как вы упомянули выше), то вы можете взять его таким образом и изучить значения гиперпараметров.

 # Get model ids for all models in the AutoML Leaderboard
model_ids = list(aml.leaderboard['model_id'].as_data_frame().iloc[:,0])
# Get the GLM model
m = h2o.get_model([mid for mid in model_ids if "GLM" in mid][0])  
  

Теперь посмотрите на имена параметров, а затем проверьте значения по умолчанию и фактические значения:

 In [11]: m.params.keys()
Out[11]: dict_keys(['model_id', 'training_frame', 'validation_frame', 'nfolds', 'seed', 'keep_cross_validation_models', 'keep_cross_validation_predictions', 'keep_cross_validation_fold_assignment', 'fold_assignment', 'fold_column', 'response_column', 'ignored_columns', 'ignore_const_cols', 'score_each_iteration', 'offset_column', 'weights_column', 'family', 'tweedie_variance_power', 'tweedie_link_power', 'solver', 'alpha', 'lambda', 'lambda_search', 'early_stopping', 'nlambdas', 'standardize', 'missing_values_handling', 'compute_p_values', 'remove_collinear_columns', 'intercept', 'non_negative', 'max_iterations', 'objective_epsilon', 'beta_epsilon', 'gradient_epsilon', 'link', 'prior', 'lambda_min_ratio', 'beta_constraints', 'max_active_predictors', 'interactions', 'interaction_pairs', 'obj_reg', 'export_checkpoints_dir', 'balance_classes', 'class_sampling_factors', 'max_after_balance_size', 'max_confusion_matrix_size', 'max_hit_ratio_k', 'max_runtime_secs', 'custom_metric_func'])

In [12]: m.params['nlambdas']
Out[12]: {'default': -1, 'actual': 30}
  

Комментарии:

1. Большое спасибо! Когда я делаю aml.leader.params[‘alphas’][‘actual’] Я получаю 6 значений. Это параметры для одной модели? Я думал, GLM принимает одно альфа-значение для каждой модели…

2. @GeorgiosKourogiorgas Ах… Это особенность кода GLM и того, как мы передаем вектор альфа-символов в AutoML. GLM позволяет передавать вектор для alpha, и это то, что мы сделали (вместо использования традиционного интерфейса grid, который выдал бы шесть GLM вместо одного конечного), поэтому, похоже, нет способа увидеть, какая альфа была выбрана. У нас открыта JIRA для исправления этого: 0xdata.atlassian.net/browse/PUBDEV-5013

3. Хорошо, на данный момент я передам все альфа-версии из glm-победителя в automl

Ответ №2:

В дополнение к ответу Эрин Леделл, если вы хотите использовать модель BestOfFamily в соответствии с рекомендациями документации AutoML («Ансамбль «Best of Family» оптимизирован для производственного использования, поскольку он содержит только шесть (или меньше) базовых моделей»):

http://docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html

Получение гиперпараметров base_models, чтобы вы могли переобучаться на разных данных, немного сложнее:

Аналогично последнему ответу, мы можем начать с вывода таблицы лидеров:

 from h2o.automl import H2OAutoML
aml = H2OAutoML(max_runtime_secs=int(60*30), seed = 1)
aml.train(x=predictors, y=response, training_frame=df_h20)
lb = aml.leaderboard
lbdf = lb.as_data_frame()
lbdf.head()
  

дает:

 AutoML progress: |████████████████████████████████████████████████████████| 100%

model_id    mean_residual_deviance  rmse    mse mae rmsle
0   StackedEnsemble_BestOfFamily_AutoML_20190618_1...   6.960772    2.638328    6.960772    1.880983    0.049275
1   StackedEnsemble_AllModels_AutoML_20190618_145827    6.960772    2.638328    6.960772    1.880983    0.049275
2   GBM_1_AutoML_20190618_145827    7.507970    2.740068    7.507970    1.934916    0.050984
3   DRF_1_AutoML_20190618_145827    7.781256    2.789490    7.781256    1.959508    0.051684
4   GLM_grid_1_AutoML_20190618_145827_model_1   9.503375    3.082754    9.503375    2.273755    0.058174
5   GBM_2_AutoML_20190618_145827    18.464452   4.297028    18.464452   3.259346    0.079722
  

Однако использование m.params.keys() не показывает способа получения гиперпараметров base_model:

 model_ids = list(aml.leaderboard['model_id'].as_data_frame().iloc[:,0])
m = h2o.get_model(model_ids[0])
m.params['base_models']
  

возврат:

 {'default': [],
 'actual': [{'__meta': {'schema_version': 3,
    'schema_name': 'ModelKeyV3',
    'schema_type': 'Key<Model>'},
   'name': 'GBM_1_AutoML_20190618_145827',
   'type': 'Key<Model>',
   'URL': '/3/Models/GBM_1_AutoML_20190618_145827'},
  {'__meta': {'schema_version': 3,
    'schema_name': 'ModelKeyV3',
    'schema_type': 'Key<Model>'},
   'name': 'DRF_1_AutoML_20190618_145827',
   'type': 'Key<Model>',
   'URL': '/3/Models/DRF_1_AutoML_20190618_145827'},
  {'__meta': {'schema_version': 3,
    'schema_name': 'ModelKeyV3',
    'schema_type': 'Key<Model>'},
   'name': 'GLM_grid_1_AutoML_20190618_145827_model_1',
   'type': 'Key<Model>',
   'URL': '/3/Models/GLM_grid_1_AutoML_20190618_145827_model_1'}]}
  

Вы должны получить список URL-адресов каждой базовой модели:

 urllist = []
for model in m.params['base_models']['actual']:
    urllist.append(model['URL'])

print(urllist)
  

предоставление:

 ['/3/Models/GBM_1_AutoML_20190618_145827', '/3/Models/DRF_1_AutoML_20190618_145827', '/3/Models/GLM_grid_1_AutoML_20190618_145827_model_1']
  

И затем, после этого, вы можете увидеть, какие гиперпараметры не используются по умолчанию, используя библиотеку запросов:

 for url in urllist:
    r = requests.get("http://localhost:54321" url)
    model = r.json()
    print(url)

    for i in np.arange(len(model['models'][0]['parameters'])):

        if model['models'][0]['parameters'][i]['label'] in ['model_id','training_frame','validation_frame','response_column']:
            continue

        if model['models'][0]['parameters'][i]['default_value'] != model['models'][0]['parameters'][i]['actual_value']:
            print(model['models'][0]['parameters'][i]['label'])
            print(model['models'][0]['parameters'][i]['actual_value'])
            print(" ")
  

Ответ №3:

Помимо вышеперечисленного, вы можете подключиться к серверу H2O (FLOW) по локальному URL «http://localhost:54321 » (или другой порт, на котором вы работаете) и щелкните на нужной модели и проверьте параметры.

Ответ №4:

поддерживаю ответ Дейвиджея.

Как указано в следующем URL, get_params помогает https://0xdata.atlassian.net/browse/PUBDEV-6396

К сожалению, это не работает для получения параметров для AutoML leader. Я добавил комментарий на доскеhttps://0xdata.atlassian.net/browse/PUBDEV-6396 и я бы снова открыл эту проблему, если через некоторое время не получу ответа.