Как использовать AWS SageMaker для внешней настройки гиперпараметра XGBoost? - PullRequest
0 голосов
/ 19 сентября 2019

Здесь нет предвзятости, но мне трудно найти что-либо в документации AWS.Microsoft Azure для меня намного проще.

Вот что я имею сейчас:

  • Бинарное приложение классификации, полностью построенное на Python, с xgboost, являющимся моделью ML.Здесь xgboost имеет набор оптимизированных гиперпараметров, полученных из SageMaker.
  • Блокнот SageMaker для запуска заданий по настройке гиперпараметра для xgboost.Затем я вручную копирую и вставляю гиперпараметры в модель xgboost в приложении Python для прогнозирования.

Как видите, способ, которым я это делаю, далек от идеального.Теперь я хочу добавить фрагмент кода в приложение Python, чтобы автоматически запустить задание гиперпараметров в SageMaker и вернуть лучшую модель.Таким образом, задание гиперпараметра автоматизировано, и мне не нужно делать копирование и вставку снова.

Однако я пока не смог этого сделать.Я следовал этой документации для установки Python SageMaker API.У меня также есть следующий код, который выполняет настройку гиперпараметра XGBoost в записной книжке SageMaker:

 def train_xgb_sagemaker(df_train, df_test):
    pd.concat([df_train['show_status'], df_train.drop(['show_status'], axis=1)], axis=1).to_csv('train.csv',
                                                                                                index=False,
                                                                                                header=False)
    pd.concat([df_test['show_status'], df_test.drop(['show_status'], axis=1)], axis=1).to_csv('validation.csv',
                                                                                              index=False, header=False)

    boto3.Session().resource('s3').Bucket(bucket, prefix).upload_file(
        'train.csv')

    boto3.Session().resource('s3').Bucket(bucket, prefix).upload_file(
        'validation.csv')

    s3_input_train = sagemaker.s3_input(s3_data='s3://{}/{}/train'.format(bucket, prefix), content_type='csv')
    s3_input_validation = sagemaker.s3_input(s3_data='s3://{}/{}/validation/'.format(bucket, prefix), content_type='csv')

    print('train_path: ', s3_input_train)
    print('validation_path: ', s3_input_validation)

    # hyperparameter tuning of XGBoost - SageMaker
    sess = sagemaker.Session()

    container = get_image_uri(region, 'xgboost', 0.90 - 1)
    xgb = sagemaker.estimator.Estimator(container,
                                        role,
                                        train_instance_count=1,
                                        train_instance_type='ml.m4.xlarge',
                                        output_path='s3://{}/{}/output'.format(params['BUCKET'], prefix),
                                        sagemaker_session=sess)

    xgb.set_hyperparameters(eval_metric='auc',
                            objective='binary:logistic',
                            num_round=100,
                            rate_drop=0.3,
                            tweedie_variance_power=1.4)

    hyperparameter_ranges = {'eta': ContinuousParameter(0, 1),
                             'min_child_weight': ContinuousParameter(1, 10),
                             'alpha': ContinuousParameter(0, 2),
                             'max_depth': IntegerParameter(1, 10),
                             'num_round': IntegerParameter(1, 300)}

    objective_metric_name = 'validation:auc'

    tuner = HyperparameterTuner(xgb,
                                objective_metric_name,
                                hyperparameter_ranges,
                                max_jobs=20,
                                max_parallel_jobs=3)

    tuner.fit({'train': s3_input_train, 'validation': s3_input_validation}, include_cls_metadata=False)

    smclient.describe_hyper_parameter_tuning_job(
        HyperParameterTuningJobName=tuner.latest_tuning_job.job_name)['HyperParameterTuningJobStatus']

    print('Please check hyperparameter tuning for best models!')
    time.sleep(4000)
    # best_model_path = 's3://{}/{}/output/{}/output/model.tar.gz'.format(bucket, prefix, tuner.best_training_job())
    return tuner.best_training_job()

Итак, вопрос в том, как встроить этот фрагмент кода в мое приложение Python, чтобы я мог делать все в одном месте?Большое спасибо за любые подсказки, поскольку я в течение нескольких дней зависал над этой проблемой!

1 Ответ

0 голосов
/ 21 сентября 2019

фактически существует вызов Python SDK для развертывания наиболее эффективной модели задания настройки гиперпараметра:

tuner.deploy()

Найдите соответствующую документацию здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...