Просмотр кода обучения модели автоматизированного ML (предварительная версия)

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python azureml версии 1

Важно!

Эта функция сейчас доступна в виде общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания. Ее не следует использовать для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования предварительных выпусков Microsoft Azure.

В этой статье вы узнаете, как просмотреть созданный код обучения из любой модели автоматизированного машинного обучения.

Создание кода для моделей, обученных посредством автоматизированного ML, позволяет просматривать следующие сведения, которые использует автоматизированное ML для обучения и построения модели для конкретного запуска.

  • Предварительная обработка данных
  • Выбор алгоритма
  • Добавление признаков
  • Гиперпараметры

Можно выбрать любую модель, обученную посредством автоматизированного ML, рекомендованный или дочерний запуск, и просмотреть созданный код обучения Python, который создал эту конкретную модель.

Используя обучающий код созданной модели, можно

  • Узнать о процессе и гиперпараметрах конструирования признаков, используемых алгоритмом модели.
  • Отслеживать/создавать версии/проводить аудит обученных моделей. Храните версии кода для отслеживания использования конкретного обучающего кода с моделью, которая должна быть развернута в рабочей среде.
  • Настройте обучающий код, изменяя гиперпараметры или применяя навыки и опыт работы с ML и алгоритмами, а также переобучите новую модель с помощью настраиваемого кода.

Вы можете создать код для экспериментов автоматизированного ML с классификацией типов задач, регрессией и прогнозированием временных рядов.

Предупреждение

Модели компьютерных концепций и модели на основе обработки естественных языков в AutoML в настоящее время не поддерживают создание кода для обучения модели.

На следующей схеме показано, как можно включить создание кода для любой модели, созданной AutoML, из пользовательского интерфейса студии машинного обучения Azure или с помощью пакета SDK для Машинного обучения Azure. Сначала выберите модель. Выбранная модель будет выделена. Затем Машинное обучение Azure скопирует файлы кода, используемые для создания модели, и отобразит их в общей папке записных книжек. Здесь можно просмотреть и настроить код по мере необходимости.

Снимок экрана со вкладкой

Предварительные требования

  • Рабочая область машинного обучения Azure. Сведения о создании рабочей области см. в разделе Создание ресурсов рабочей области.

  • В этой статье предполагается, что вам известны основные принципы настройки эксперимента автоматизированного машинного обучения. Следуйте инструкциям учебника или практического руководства, чтобы ознакомиться с основными конструктивными шаблонами экспериментов автоматизированного машинного обучения.

  • Создание кода автоматизированного машинного обучения доступно только для экспериментов на удаленных целевых объектах вычислений Azure ML. Создание кода не поддерживается для локальных запусков.

  • Чтобы включить создание кода с помощью пакета SDK, доступны следующие варианты:

Создание кода с помощью пакета SDK

По умолчанию каждая модель, обученная посредством автоматизированного ML, создает свой код обучения после завершения обучения. Автоматизированное ML сохраняет этот код в outputs/generated_code эксперимента для этой конкретной модели. Их можно просмотреть в пользовательском интерфейсе студии машинного обучения Azure на вкладке Выходные данные и журналы выбранной модели.

Можно также явно включить создание кода для экспериментов автоматизированного ML в объекте AutoMLConfig с параметром enable_code_generation=True. Этот параметр должен быть установлен перед отправкой эксперимента.

Убедитесь, что вызываете experiment.submit() из среды Conda, которая содержит последнюю версию пакета SDK для Azure ML с автоматизированным ML. Это гарантирует надлежащий запуск создания кода для экспериментов, выполняемых на удаленном целевом объекте вычислений.

config = AutoMLConfig( task="classification",
                       training_data=data,
                       label_column_name="label",
                       compute_target=compute_target,
                       enable_code_generation=True
                     )

В некоторых случаях устранения неполадок может потребоваться отключить создание кода. Перед отправкой эксперимента автоматизированного ML можно отключить создание кода в объекте AutoMLConfig с помощью параметра enable_code_generation=False.

# Disabling Code Generation
config = AutoMLConfig( task="classification", 
                       training_data=data,
                       label_column_name="label",
                       compute_target=compute_target,
                       enable_code_generation=False
                     )

Созданному коду присвоено два основных файла.

  • script.py Это код обучения модели, который, скорее всего, потребуется проанализировать посредством шагов по конструированию признаков, используемого алгоритма и гиперпараметров.

  • script_run_notebook. ipynb Записная книжка с кодом стереотипного для запуска кода обучения модели (script.py) при вычислении AzureML с помощью классов пакета SDK для Azure ML, таких как ScriptRunConfig.

Получение созданного кода и артефактов модели

После завершения запуска обучения посредством автоматизированного ML можно получить файлы script.py и script_run_notebook.ipynb. Следующий код возвращает лучший дочерний запуск и скачивает оба файла.


best_run = remote_run.get_best_child()

best_run.download_file("outputs/generated_code/script.py", "script.py")
best_run.download_file("outputs/generated_code/script_run_notebook.ipynb", "script_run_notebook.ipynb")

Вы также можете просмотреть созданный код и подготовить его к настройке кода с помощью пользовательского интерфейса студии Машинного обучения Azure.

Чтобы сделать это, перейдите на вкладку Модели на странице родительского запуска эксперимента автоматизированного ML. После выбора одной из обученных моделей можно нажать кнопку Просмотр созданного кода (предварительная версия). Эта кнопка перенаправит вас на расширение портала Записные книжки, где можно просмотреть, изменить и запустить созданный код для конкретной выбранной модели.

просмотр вкладки моделей родительского запуска, кнопка

Кроме того, можно также получить доступ к коду, созданному моделью, из верхней части страницы дочернего запуска после перехода на страницу этого дочернего запуска конкретной модели.

просмотр страницы дочернего запуска, кнопка

script.py

Файл script.py содержит основную логику, необходимую для обучения модели с помощью ранее использованных гиперпараметров. Хотя в контексте выполнения сценария Azure ML предполагается выполнение с некоторыми изменениями, обучающий код модели также может быть запущен автономно в собственной локальной среде.

Скрипт можно разделить на несколько следующих частей: загрузка данных, подготовка данных, конструирование признаков данных, спецификация препроцессора и алгоритма, а также обучение.

Загрузка данных

Функция get_training_dataset() загружает ранее использовавшийся набор данных. Предполагается, что сценарий выполняется в скрипте AzureML, который выполняется в той же рабочей области, что и исходный эксперимент.

def get_training_dataset(dataset_id):
    from azureml.core.dataset import Dataset
    from azureml.core.run import Run
    
    logger.info("Running get_training_dataset")
    ws = Run.get_context().experiment.workspace
    dataset = Dataset.get_by_id(workspace=ws, id=dataset_id)
    return dataset.to_pandas_dataframe()

При запуске в ходе выполнения скрипта Run.get_context().experiment.workspace получает нужную рабочую область. Однако если этот сценарий выполняется в другой рабочей области или выполняется локально без использования ScriptRunConfig, необходимо изменить скрипт, чтобы явно указать соответствующую рабочую область.

После получения рабочей области исходный набор данных извлекается по его идентификатору. Другой набор данных с точно такой же структурой также можно указать с помощью идентификатора или имени с get_by_id() или get_by_name(), соответственно. Идентификатор можно найти позже в скрипте, в том же разделе, что и следующий код.

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--training_dataset_id', type=str, default='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx', help='Default training dataset id is populated from the parent run')
    args = parser.parse_args()
    
    main(args.training_dataset_id)

Вы также можете заменить всю эту функцию собственным механизмом загрузки данных. Единственное ограничение заключается в том, что возвращаемое значение должно быть кадром данных Pandas, а данные должны иметь ту же форму, что и в исходном эксперименте.

Код подготовки данных

Функция prepare_data() очищает данные, разделяет их, выделяет весовые столбцы и подготавливает данные для использования в обучении. Эта функция может меняться в зависимости от типа набора данных и типа задачи эксперимента: классификация, регрессия или прогнозирование временных рядов.

В следующем примере показано, что в целом передается кадр данных из шага загрузки данных. Извлекаются столбцы меток и выборки веса, если они были изначально указаны, а строки, содержащие NaN, удаляются из входных данных.

def prepare_data(dataframe):
    from azureml.training.tabular.preprocessing import data_cleaning
    
    logger.info("Running prepare_data")
    label_column_name = 'y'
    
    # extract the features, target and sample weight arrays
    y = dataframe[label_column_name].values
    X = dataframe.drop([label_column_name], axis=1)
    sample_weights = None
    X, y, sample_weights = data_cleaning._remove_nan_rows_in_X_y(X, y, sample_weights,
     is_timeseries=False, target_column=label_column_name)
    
    return X, y, sample_weights

Если вы хотите выполнить дополнительную подготовку данных, это можно сделать на этом этапе, добавив пользовательский код подготовки данных.

Код конструирования признаков

Функция generate_data_transformation_config() задает шаг конструирования признаков в заключительном конвейере scikit-learn. Конструкторы признаков из исходного эксперимента воспроизводятся здесь вместе с их параметрами.

Например, возможное преобразование данных, которое может произойти в этой функции, может основываться на таких импьютерах, как SimpleImputer() и CatImputer(), или в таких преобразователях, как StringCastTransformer() и LabelEncoderTransformer().

Ниже приведен преобразователь типа StringCastTransformer(), который можно использовать для преобразования набора столбцов. В этом случае набор, указанный параметром column_names.

def get_mapper_c6ba98(column_names):
    # ... Multiple imports to package dependencies, removed for simplicity ...
    
    definition = gen_features(
        columns=column_names,
        classes=[
            {
                'class': StringCastTransformer,
            },
            {
                'class': CountVectorizer,
                'analyzer': 'word',
                'binary': True,
                'decode_error': 'strict',
                'dtype': numpy.uint8,
                'encoding': 'utf-8',
                'input': 'content',
                'lowercase': True,
                'max_df': 1.0,
                'max_features': None,
                'min_df': 1,
                'ngram_range': (1, 1),
                'preprocessor': None,
                'stop_words': None,
                'strip_accents': None,
                'token_pattern': '(?u)\\b\\w\\w+\\b',
                'tokenizer': wrap_in_lst,
                'vocabulary': None,
            },
        ]
    )
    mapper = DataFrameMapper(features=definition, input_df=True, sparse=True)
    
    return mapper

Имейте в виду, что при наличии большого количества столбцов, к которым необходимо применить одинаковое конструирование признаков/преобразование (например, 50 столбцов в нескольких группах столбцов), эти столбцы обрабатываются группированием на основе типа.

В следующем примере обратите внимание, что к каждой группе применен уникальный модуль сопоставления. Затем этот модуль сопоставления применяется к каждому из столбцов этой группы.

def generate_data_transformation_config():
    from sklearn.pipeline import FeatureUnion
    
    column_group_1 = [['id'], ['ps_reg_01'], ['ps_reg_02'], ['ps_reg_03'], ['ps_car_11_cat'], ['ps_car_12'], ['ps_car_13'], ['ps_car_14'], ['ps_car_15'], ['ps_calc_01'], ['ps_calc_02'], ['ps_calc_03']]
    
    column_group_2 = ['ps_ind_06_bin', 'ps_ind_07_bin', 'ps_ind_08_bin', 'ps_ind_09_bin', 'ps_ind_10_bin', 'ps_ind_11_bin', 'ps_ind_12_bin', 'ps_ind_13_bin', 'ps_ind_16_bin', 'ps_ind_17_bin', 'ps_ind_18_bin', 'ps_car_08_cat', 'ps_calc_15_bin', 'ps_calc_16_bin', 'ps_calc_17_bin', 'ps_calc_18_bin', 'ps_calc_19_bin', 'ps_calc_20_bin']
    
    column_group_3 = ['ps_ind_01', 'ps_ind_02_cat', 'ps_ind_03', 'ps_ind_04_cat', 'ps_ind_05_cat', 'ps_ind_14', 'ps_ind_15', 'ps_car_01_cat', 'ps_car_02_cat', 'ps_car_03_cat', 'ps_car_04_cat', 'ps_car_05_cat', 'ps_car_06_cat', 'ps_car_07_cat', 'ps_car_09_cat', 'ps_car_10_cat', 'ps_car_11', 'ps_calc_04', 'ps_calc_05', 'ps_calc_06', 'ps_calc_07', 'ps_calc_08', 'ps_calc_09', 'ps_calc_10', 'ps_calc_11', 'ps_calc_12', 'ps_calc_13', 'ps_calc_14']
    
    feature_union = FeatureUnion([
        ('mapper_ab1045', get_mapper_ab1045(column_group_1)),
        ('mapper_c6ba98', get_mapper_c6ba98(column_group_3)),
        ('mapper_9133f9', get_mapper_9133f9(column_group_2)),
    ])
    return feature_union

Такой подход позволяет создавать более рациональный код, не настраивая блок кода преобразователя для каждого столбца, который может быть особенно громоздким даже при наличии десятков или сотен столбцов в наборе данных.

При использовании задач классификации и регрессии для модулей конструирования признаков используется [FeatureUnion]. Для моделей прогнозирования временных рядов несколько модулей конструирования признаков, учитывающих временные ряды, собираются в конвейер scikit-learn, а затем упаковываются в TimeSeriesTransformer. Любое предоставленное пользователем конструирование признаков для моделей прогнозирования временных рядов, выполняется перед теми, которые предоставляются автоматизированным ML.

Код спецификации препроцессора

Функция generate_preprocessor_config(), если она есть, указывает шаг предварительной обработки, который будет выполнен после добавление признаков в заключительном конвейере scikit-learn.

Как правило, этот этап предварительной обработки состоит только из стандартизации и нормализации данных, которые выполняются с помощью sklearn.preprocessing.

Автоматизированное ML указывает только шаг предварительной обработки для отдельных моделей классификации и регрессии.

Ниже приведен пример созданного кода препроцессора:

def generate_preprocessor_config():
    from sklearn.preprocessing import MaxAbsScaler
    
    preproc = MaxAbsScaler(
        copy=True
    )
    
    return preproc

Код спецификации алгоритма и гиперпараметров

Код спецификации алгоритма и гиперпараметров, скорее всего, является тем, в чем наиболее всего заинтересованы специалисты ML.

Функция generate_algorithm_config() задает фактический алгоритм и гиперпараметры для обучения модели как последнего этапа завершающего конвейера scikit-learn.

В следующем примере используется алгоритм XGBoostClassifier с конкретными гиперпараметрами.

def generate_algorithm_config():
    from xgboost.sklearn import XGBClassifier
    
    algorithm = XGBClassifier(
        base_score=0.5,
        booster='gbtree',
        colsample_bylevel=1,
        colsample_bynode=1,
        colsample_bytree=1,
        gamma=0,
        learning_rate=0.1,
        max_delta_step=0,
        max_depth=3,
        min_child_weight=1,
        missing=numpy.nan,
        n_estimators=100,
        n_jobs=-1,
        nthread=None,
        objective='binary:logistic',
        random_state=0,
        reg_alpha=0,
        reg_lambda=1,
        scale_pos_weight=1,
        seed=None,
        silent=None,
        subsample=1,
        verbosity=0,
        tree_method='auto',
        verbose=-10
    )
    
    return algorithm

В большинстве случаев в созданном коде используются классы и пакеты ПО с открытым исходным кодом (OSS). Существуют экземпляры, в которых для упрощения более сложного кода используются промежуточные классы-оболочки. Например, можно применить классификатор XGBoost и другие часто используемые библиотеки, такие как LightGBM или алгоритмы Scikit-Learn.

В качестве ML Professional вы можете настроить код конфигурации этого алгоритма, настроив его гиперпараметры по своему усмотрению в соответствии с вашими навыками и опытом в отношении такого алгоритма и конкретной проблемы ML.

Для объединенных моделей generate_preprocessor_config_N() (при необходимости) и generate_algorithm_config_N() определяются для каждого обучаемого в объединенной модели, где N представляет размещение каждого обучаемого в списке объединенной модели. Для объединенных моделей в стеке определяется мета-обучение generate_algorithm_config_meta().

Сквозной код обучения

Генерация кода создает build_model_pipeline() и train_model() для определения конвейера scikit-learn и для вызова fit() по нему соответственно.

def build_model_pipeline():
    from sklearn.pipeline import Pipeline
    
    logger.info("Running build_model_pipeline")
    pipeline = Pipeline(
        steps=[
            ('featurization', generate_data_transformation_config()),
            ('preproc', generate_preprocessor_config()),
            ('model', generate_algorithm_config()),
        ]
    )
    
    return pipeline

Конвейер scikit-learn включает шаг конструирования признаков, препроцессор (если используется), а также алгоритм или модель.

Для моделей прогнозирования временных рядов конвейер scikit-learn упаковывается в ForecastingPipelineWrapper, который содержит некоторую дополнительную логику, необходимую для правильной обработки данных временных рядов в зависимости от примененного алгоритма. Для всех типов задач мы используем PipelineWithYTransformer в тех случаях, когда столбец меток необходимо закодировать.

Когда у вас есть конвейер scikit-learn, все, что осталось вызвать, — это метод fit() для обучения модели:

def train_model(X, y, sample_weights):
    
    logger.info("Running train_model")
    model_pipeline = build_model_pipeline()
    
    model = model_pipeline.fit(X, y)
    return model

Возвращаемое значение из train_model() — это модель, которая соответствует или обучена входным данным.

Ниже приведен основной код, запускающий все предыдущие функции:

def main(training_dataset_id=None):
    from azureml.core.run import Run
    
    # The following code is for when running this code as part of an AzureML script run.
    run = Run.get_context()
    setup_instrumentation(run)
    
    df = get_training_dataset(training_dataset_id)
    X, y, sample_weights = prepare_data(df)
    split_ratio = 0.1
    try:
        (X_train, y_train, sample_weights_train), (X_valid, y_valid, sample_weights_valid) = split_dataset(X, y, sample_weights, split_ratio, should_stratify=True)
    except Exception:
        (X_train, y_train, sample_weights_train), (X_valid, y_valid, sample_weights_valid) = split_dataset(X, y, sample_weights, split_ratio, should_stratify=False)

    model = train_model(X_train, y_train, sample_weights_train)
    
    metrics = calculate_metrics(model, X, y, sample_weights, X_test=X_valid, y_test=y_valid)
    
    print(metrics)
    for metric in metrics:
        run.log(metric, metrics[metric])

После обучения модели ее можно использовать для прогнозирования с помощью метода predict(). Если ваш эксперимент предназначен для модели временных рядов, используйте метод forecast() для прогнозов.

y_pred = model.predict(X)

Наконец, модель сериализуется и сохраняется как файл .pkl с именем "model.pkl":

    with open('model.pkl', 'wb') as f:
        pickle.dump(model, f)
    run.upload_file('outputs/model.pkl', 'model.pkl')

script_run_notebook. ipynb

Записная книжка script_run_notebook.ipynb служит простым способом выполнения script.py в вычислении Azure ML. Эта записная книжка аналогична имеющимся примерам записных книжек автоматизированного машинного обучения, однако, существует несколько ключевых отличий, как описано в следующих разделах.

Среда

Как правило, среда обучения для запуска автоматического ML автоматически задается пакетом SDK. Однако при запуске пользовательского скрипта, подобного созданному коду, автоматизированное ML больше не задает процесс, поэтому для выполнения сценария необходимо указать среду.

Если возможно, при создании кода используется среда, которая использовалась в исходном эксперименте автоматизированного ML. Это гарантирует, что запуск скрипта обучения не завершится сбоем из-за отсутствия зависимостей, и имеет побочное преимущество в том, что не требует перестроения образа Docker, что экономит время и ресурсы вычислений.

Если вы вносите изменения в script.py, требующие дополнительных зависимостей, или хотите использовать собственную среду, необходимо соответствующим образом обновить ячейку Create environment в script_run_notebook.ipynb.

Дополнительные сведения о средах AzureML см. в документации по классу среды.

Отправка эксперимента

Поскольку созданный код не управляется автоматизированным ML, вместо создания AutoMLConfig и последующей передачи в experiment.submit() необходимо создать ScriptRunConfig и предоставить созданный код (script.py).

В следующем примере содержатся параметры и обычные зависимости, необходимые для выполнения ScriptRunConfig, такие как расчеты, среда и т. д. Дополнительные сведения об использовании ScriptRunConfig см. в статье Настройка и отправка запусков обучения.

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=project_folder, 
                      script='script.py', 
                      compute_target=cpu_cluster, 
                      environment=myenv,
                      docker_runtime_config=docker_config)
 
run = experiment.submit(config=src)

Скачивание и загрузка сериализованной обученной модели в памяти

После создания обученной модели ее можно сохранить или сериализовать в файл .pkl с помощью pickle.dump() и pickle.load() . Также можно использовать joblib.dump() и joblib.load().

В следующем примере показано, как скачать и загрузить модель в памяти, которая была обучена вычислению AzureML с помощью ScriptRunConfig. Этот код можно запустить в той же записной книжке, где вы использовали пакет SDK ScriptRunConfig для Azure ML.

import joblib

# Load the fitted model from the script run.

# Note that if training dependencies are not installed on the machine
# this notebook is being run from, this step can fail.
try:
    # Download the model from the run in the Workspace
    run.download_file("outputs/model.pkl", "model.pkl")

    # Load the model into memory
    model = joblib.load("model.pkl")

except ImportError:
    print('Required dependencies are missing; please run pip install azureml-automl-runtime.')
    raise

Создание прогнозов с помощью модели в памяти

Наконец, можно загрузить данные теста в кадр данных Pandas и использовать модель для создания прогнозов.

import os
import numpy as np
import pandas as pd

DATA_DIR = "."
filepath = os.path.join(DATA_DIR, 'porto_seguro_safe_driver_test_dataset.csv')

test_data_df = pd.read_csv(filepath)

print(test_data_df.shape)
test_data_df.head(5)

#test_data_df is a Pandas dataframe with test data
y_predictions = model.predict(test_data_df)

В вычислительном экземпляре Azure ML у вас есть все зависимости автоматизированного ML, поэтому вы можете загрузить модель и прогнозировать ее из любой записной книжки в недавно созданном вычислительном экземпляре.

Однако для загрузки этой модели в записную книжку в собственной локальной среде Conda необходимо иметь все зависимости, поступающие из среды, используемой при обучении (среда AutoML).

Дальнейшие действия