Знакомство с автоматическим ML с помощью Python и Azure ML SDK

Мы все знаем, что Python может многое сделать в машинном обучении, но знаете ли вы, что можете писать код на Python, чтобы воспользоваться преимуществами облачных вычислений, хранилищ и возможностей автоматизации Microsoft Azure?

Давайте посмотрим, как Azure ML Python SDK позволяет регистрировать наборы данных, обучать модели с помощью автоматизированного машинного обучения, оценивать производительность этих моделей, регистрировать их для дальнейшего использования и даже развертывать их как конечные точки REST для использования другими — и все это примерно за 100 строк кода.

Этот материал также доступен в виде видео на YouTube

AutoML

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

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

Automated ML доступен в Интернете в Azure Machine Learning Studio, но быстрее и проще поделиться с другими, запустив свои эксперименты непосредственно из кода Python с помощью Azure ML Python SDK.

Давайте рассмотрим, как работает типичный эксперимент.

Получение рабочего пространства

Первое, что нам нужно сделать, это подключиться к рабочей области Azure Machine Learning Workspace. Для этого мы загружаем файл config.json в наш локальный каталог, а затем вызываем Workspace.from_config() для подключения к этому рабочему пространству:

# Load the workspace information from config.json using the Azure ML SDK
from azureml.core import Workspace

ws = Workspace.from_config()
ws.name
Вход в полноэкранный режим Выход из полноэкранного режима

Подключение к вычислительным ресурсам

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

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

# Now let's make sure we have a compute resource created
cluster_name = "My-Cluster"  # The name of the cluster
vm_size = 'Standard_D2DS_V4' # There are many different specs available for CPU or GPU tasks.
min_nodes = 0                # This is important to prevent billing while idle
max_nodes = 4                # Azure does limit you to a certain quota, but you can get that extended

# Fetch or create the compute resource
try:
    cpu_cluster = ComputeTarget(workspace=ws, name=cluster_name) # This will throw a ComputeTargetException if this doesn't exist
    print('Using existing compute: ' + cluster_name)

except ComputeTargetException:
    # Create the cluster
    print('Provisioning cluster...')
    compute_config = AmlCompute.provisioning_configuration(vm_size=vm_size, min_nodes=min_nodes, max_nodes=max_nodes)
    cpu_cluster = ComputeTarget.create(ws, cluster_name, compute_config)

# Ensure the cluster is ready to go
cpu_cluster.wait_for_completion(show_output=True)
Войти в полноэкранный режим Выйти из полноэкранного режима

Это позволит нам использовать вычислительный кластер на базе Azure для наших задач машинного обучения и платить только за используемое время.

Подробнее: Подробнее о получении и создании вычислительных ресурсов смотрите в моей подробной статье об управлении вычислительными ресурсами Azure с помощью Python SDK.

Регистрация набора данных

Далее мы возьмем CSV-файл, загрузим его во фрейм данных Pandas и зарегистрируем его как табличный набор данных в Azure.

from azureml.core import Dataset
import pandas as pd

# The default datastore is a blob storage container where datasets are stored
datastore = ws.get_default_datastore()

# Load some data into a dataframe (Note: Pandas is just one path into Azure ML)
df = pd.read_csv('my_data.csv')

# Register the dataset
ds = Dataset.Tabular.register_pandas_dataframe(
        dataframe=df, 
        name='DataSet-Name', 
        description='A description of my dataset',
        target=datastore
    )

# Display information about the dataset
print(ds.name + " v" + str(ds.version) + ' (ID: ' + ds.id + ")")
Вход в полноэкранный режим Выход из полноэкранного режима

Подробнее: Подробнее об этом процессе читайте в моей подробной статье о регистрации наборов данных в Azure с помощью Python SDK.

Это регистрирует набор данных в Azure или добавляет новую версию к существующему набору данных. В будущем с этим же набором данных можно будет провести множество экспериментов.

Запуск эксперимента

После этого наступает самое интересное. Нам нужно настроить поведение нашего эксперимента по машинному обучению:

# Create the configuration for the experiment
from azureml.train.automl import AutoMLConfig

# See https://docs.microsoft.com/en-us/python/api/azureml-train-automl-client/azureml.train.automl.automlconfig.automlconfig?view=azure-ml-py for details
automl_config = AutoMLConfig(
        task='regression',                                  # regression, classification, or forecasting
        training_data=ds,                                   # The data to use to train the model
        label_column_name='thingIWantToPredict',            # The column we're trying to predict
        n_cross_validations=3,                              # How many cross-validation sets to use
        primary_metric='normalized_root_mean_squared_error',# The metric we use to compare model performance
        compute_target=cpu_cluster,                         # Where the experiment should be run
        max_concurrent_iterations=max_nodes,                # How many models can be trained simultaneously
        iterations=40,                                      # The total number of models to train
        iteration_timeout_minutes=5                         # The amount of time before giving up on a single model training run
    )            
Войти в полноэкранный режим Выйти из полноэкранного режима

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

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

Как только мы все настроим, мы создадим и отправим наш эксперимент:

from azureml.core.experiment import Experiment
from azureml.widgets import RunDetails

# Find or Create a Machine Learning Experiment in Azure Machine Learning Studio
experiment_name = 'My-Regression-Experiment'
experiment=Experiment(ws, experiment_name)

# Start running the experiment
run = experiment.submit(automl_config)

# Wait for the experiment to complete (displays active details about the run)
RunDetails(run).show()
run.wait_for_completion(show_output=False)
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Azure ML Python SDK также включает некоторые виджеты, которые фактически покажут вам прогресс запущенного эксперимента машинного обучения, чтобы вы могли следить за ним непосредственно в Jupyter Notebook в вашей IDE.

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

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

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

# Grab the resulting model and best run
best_auto_run, automl_model = run.get_output()

# Display details about the best run
print('Best Run: ' + str(best_auto_run.id))
RunDetails(best_auto_run).show()
Вход в полноэкранный режим Выход из полноэкранного режима

Регистрация эксперимента

Далее мы можем зарегистрировать эту модель в Azure, чтобы ее можно было официально развернуть в Azure Container Instance или на Azure Kubernetes Service.

Кроме того, мы можем загрузить файлы, связанные с моделью, для использования вне Azure.

# Register the model in Azure
best_auto_run.register_model(
    model_name='My-AutoML-Model', 
    model_path='outputs/model.pkl', 
    description='A model I trained with Python Code')

best_auto_run.download_files(output_directory='automl-output')
Вход в полноэкранный режим Выход из полноэкранного режима

Развертывание модели

Если нам нравится модель, мы можем развернуть ее прямо из кода как Azure Container Instance или Azure Kubernetes Service с несколькими вариантами аутентификации и масштабирования.

from azureml.core import Environment
from azureml.core.model import InferenceConfig

# Load the environment from the YAML file downloaded from the best run
env = Environment.from_conda_specification("AutoML-env", "automl-output/outputs/conda_env_v_1_0_0.yml")

# Create an inference config pointing at the files we downloaded. This configuration tells Azure how to handle requests
inference_config = InferenceConfig(environment=env, 
                                   source_directory='./automl-output/outputs', 
                                   entry_script='./scoring_file_v_2_0_0.py')

# The deployment configuration configures how the endpoint is hosted
deployment_config = AciWebservice.deploy_configuration(
    cpu_cores = 1, 
    memory_gb = 1, 
    enable_app_insights=True,
    auth_enabled=False) 

# Deploy the model
service = Model.deploy(ws, "endpoint-name", [automl_model], inference_config, deployment_config, overwrite=True)
service.wait_for_deployment(show_output = True)

# Grab our scoring endpoint for testing
print('Endpoint active at ' + service.scoring_uri)
Войдите в полноэкранный режим Выход из полноэкранного режима

Надеюсь, это было интересно для вас. Оставайтесь с нами, чтобы узнать больше о машинном обучении на Azure.

Оцените статью
devanswers.ru
Добавить комментарий