Интерпретируемость. Описание модели в автоматизированном машинном обучении (предварительная версия)

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

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

Для всех версий SDK после 1.0.85 по умолчанию задано model_explainability=True. В пакете SDK версии 1.0.85 и более ранних версий пользователям необходимо задать model_explainability=True в объекте AutoMLConfig, чтобы использовать интерпретируемость модели.

Вы узнаете, как выполнять следующие задачи:

  • Обеспечение интерпретируемости во время обучения для наилучшей или любой модели.
  • Включение визуализации для просмотра закономерностей в данных и объяснениях.
  • Реализация интерпретируемости во время вывода или оценки.

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

Важно!

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

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

Интерпретируемость во время обучения для наилучшей модели

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

Примечание

Интерпретируемость, т. е. объяснение модели не доступно для модели TCNForecaster, рекомендованной на основании экспериментов по прогнозированию Auto ML.

Загрузите важные признаки разработанных функций из лучшего экземпляра выполнения

Можно использовать ExplanationClient, чтобы загрузить объяснения для разработанных функций из хранилища артефактов best_run.

from azureml.interpret import ExplanationClient

client = ExplanationClient.from_run(best_run)
engineered_explanations = client.download_model_explanation(raw=False)
print(engineered_explanations.get_feature_importance_dict())

Загрузите признаки важности недоработанных компонентов из лучшего экземпляра выполнения

Можно использовать ExplanationClient для загрузки объяснений для недоработанных компонентов из хранилища артефактов best_run.

from azureml.interpret import ExplanationClient

client = ExplanationClient.from_run(best_run)
raw_explanations = client.download_model_explanation(raw=True)
print(raw_explanations.get_feature_importance_dict())

Интерпретируемость во время обучения для любой модели

При вычислении объяснений модели и их визуализации пользователь не ограничен существующим объяснением для модели автоматизированного машинного обучения. Также можно получить объяснение для своей модели с разными тестовыми данными. Действия в этом разделе показывают, как вычислить и визуализировать признаки важности разработанных компонентов на основе тестовых данных.

Получение любой другой модели автоматизированного машинного обучения в процессе обучения

automl_run, fitted_model = local_run.get_output(metric='accuracy')

Настройка объяснений для модели

Используйте automl_setup_model_explanations для получения разработанных и недоработанных объяснений. fitted_model может создавать следующие элементы.

  • Рекомендуемые данные из материалов обучения или тестовых примеров
  • Списки имен разработанных компонентов
  • Классы, которые можно найти в столбце с меткой в сценариях классификации

automl_explainer_setup_obj содержит все структуры из указанного выше списка.

from azureml.train.automl.runtime.automl_explain_utilities import automl_setup_model_explanations

automl_explainer_setup_obj = automl_setup_model_explanations(fitted_model, X=X_train, 
                                                             X_test=X_test, y=y_train, 
                                                             task='classification')

Инициализация Mimic Explainer для определения важности компонентов

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

  • Объект настройки объяснения
  • Используемая рабочая область
  • Суррогатная модель для объяснения модели автоматизированного машинного обучения fitted_model

MimicWrapper также принимает объект automl_run, в который будут загружаться разработанные объяснения.

from azureml.interpret import MimicWrapper

# Initialize the Mimic Explainer
explainer = MimicWrapper(ws, automl_explainer_setup_obj.automl_estimator,
                         explainable_model=automl_explainer_setup_obj.surrogate_model, 
                         init_dataset=automl_explainer_setup_obj.X_transform, run=automl_run,
                         features=automl_explainer_setup_obj.engineered_feature_names, 
                         feature_maps=[automl_explainer_setup_obj.feature_map],
                         classes=automl_explainer_setup_obj.classes,
                         explainer_kwargs=automl_explainer_setup_obj.surrogate_model_params)

Использование Mimic Explainer для вычисления и визуализации важности разработанных компонентов

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

engineered_explanations = explainer.explain(['local', 'global'], eval_dataset=automl_explainer_setup_obj.X_test_transform)
print(engineered_explanations.get_feature_importance_dict())

Для моделей автоматизированного машинного обучения можно получить наилучшую модель, используя метод get_output(), и вычислить объяснения локально. Результаты объяснения можно визуализировать с помощью ExplanationDashboard из пакета raiwidgets.

best_run, fitted_model = remote_run.get_output()

from azureml.train.automl.runtime.automl_explain_utilities import AutoMLExplainerSetupClass, automl_setup_model_explanations
automl_explainer_setup_obj = automl_setup_model_explanations(fitted_model, X=X_train,
                                                             X_test=X_test, y=y_train,
                                                             task='regression')

from interpret.ext.glassbox import LGBMExplainableModel
from azureml.interpret.mimic_wrapper import MimicWrapper

explainer = MimicWrapper(ws, automl_explainer_setup_obj.automl_estimator, LGBMExplainableModel,
                         init_dataset=automl_explainer_setup_obj.X_transform, run=best_run,
                         features=automl_explainer_setup_obj.engineered_feature_names,
                         feature_maps=[automl_explainer_setup_obj.feature_map],
                         classes=automl_explainer_setup_obj.classes)
                         
pip install interpret-community[visualization]

engineered_explanations = explainer.explain(['local', 'global'], eval_dataset=automl_explainer_setup_obj.X_test_transform)
print(engineered_explanations.get_feature_importance_dict()),
from raiwidgets import ExplanationDashboard
ExplanationDashboard(engineered_explanations, automl_explainer_setup_obj.automl_estimator, datasetX=automl_explainer_setup_obj.X_test_transform)

 

raw_explanations = explainer.explain(['local', 'global'], get_raw=True,
                                     raw_feature_names=automl_explainer_setup_obj.raw_feature_names,
                                     eval_dataset=automl_explainer_setup_obj.X_test_transform)
print(raw_explanations.get_feature_importance_dict()),
from raiwidgets import ExplanationDashboard
ExplanationDashboard(raw_explanations, automl_explainer_setup_obj.automl_pipeline, datasetX=automl_explainer_setup_obj.X_test_raw)

Использование Mimic Explainer для вычисления и визуализации важности недоработанных компонентов

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

raw_explanations = explainer.explain(['local', 'global'], get_raw=True,
                                     raw_feature_names=automl_explainer_setup_obj.raw_feature_names,
                                     eval_dataset=automl_explainer_setup_obj.X_test_transform,
                                     raw_eval_dataset=automl_explainer_setup_obj.X_test_raw)
print(raw_explanations.get_feature_importance_dict())

Интерпретируемость во время вывода

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

Регистрация модели и блок объяснения для оценки

Используйте TreeScoringExplainer для создания блока объяснения для оценки, который будет вычислять значения важности компонентов во время вывода. Инициализация блока объяснения для оценки выполняется с использованием значения feature_mapвычисленного ранее.

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

from azureml.interpret.scoring.scoring_explainer import TreeScoringExplainer, save

# Initialize the ScoringExplainer
scoring_explainer = TreeScoringExplainer(explainer.explainer, feature_maps=[automl_explainer_setup_obj.feature_map])

# Pickle scoring explainer locally
save(scoring_explainer, exist_ok=True)

# Register trained automl model present in the 'outputs' folder in the artifacts
original_model = automl_run.register_model(model_name='automl_model', 
                                           model_path='outputs/model.pkl')

# Register scoring explainer
automl_run.upload_file('scoring_explainer.pkl', 'scoring_explainer.pkl')
scoring_explainer_model = automl_run.register_model(model_name='scoring_explainer', model_path='scoring_explainer.pkl')

Создание зависимостей conda для настройки службы

Создайте необходимые зависимости среды в контейнере для развернутой модели. Обратите внимание, что значения azureml-defaults с версией >= 1.0.45 должны быть указаны как зависимость pip, поскольку они содержат функции, необходимые для размещения модели как веб-службы.

from azureml.core.conda_dependencies import CondaDependencies

azureml_pip_packages = [
    'azureml-interpret', 'azureml-train-automl', 'azureml-defaults'
]

myenv = CondaDependencies.create(conda_packages=['scikit-learn', 'pandas', 'numpy', 'py-xgboost<=0.80'],
                                 pip_packages=azureml_pip_packages,
                                 pin_sdk_version=True)

with open("myenv.yml","w") as f:
    f.write(myenv.serialize_to_string())

with open("myenv.yml","r") as f:
    print(f.read())

Создание сценария оценки

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

%%writefile score.py
import joblib
import pandas as pd
from azureml.core.model import Model
from azureml.train.automl.runtime.automl_explain_utilities import automl_setup_model_explanations


def init():
    global automl_model
    global scoring_explainer

    # Retrieve the path to the model file using the model name
    # Assume original model is named automl_model
    automl_model_path = Model.get_model_path('automl_model')
    scoring_explainer_path = Model.get_model_path('scoring_explainer')

    automl_model = joblib.load(automl_model_path)
    scoring_explainer = joblib.load(scoring_explainer_path)


def run(raw_data):
    data = pd.read_json(raw_data, orient='records')
    # Make prediction
    predictions = automl_model.predict(data)
    # Setup for inferencing explanations
    automl_explainer_setup_obj = automl_setup_model_explanations(automl_model,
                                                                 X_test=data, task='classification')
    # Retrieve model explanations for engineered explanations
    engineered_local_importance_values = scoring_explainer.explain(automl_explainer_setup_obj.X_test_transform)
    # Retrieve model explanations for raw explanations
    raw_local_importance_values = scoring_explainer.explain(automl_explainer_setup_obj.X_test_transform, get_raw=True)
    # You can return any data type as long as it is JSON-serializable
    return {'predictions': predictions.tolist(),
            'engineered_local_importance_values': engineered_local_importance_values,
            'raw_local_importance_values': raw_local_importance_values}

Развертывание службы

Разверните службу с помощью файла conda и файла оценки из предыдущих действий.

from azureml.core.webservice import Webservice
from azureml.core.webservice import AciWebservice
from azureml.core.model import Model, InferenceConfig
from azureml.core.environment import Environment

aciconfig = AciWebservice.deploy_configuration(cpu_cores=1,
                                               memory_gb=1,
                                               tags={"data": "Bank Marketing",  
                                                     "method" : "local_explanation"},
                                               description='Get local explanations for Bank marketing test data')
myenv = Environment.from_conda_specification(name="myenv", file_path="myenv.yml")
inference_config = InferenceConfig(entry_script="score_local_explain.py", environment=myenv)

# Use configs and models generated above
service = Model.deploy(ws,
                       'model-scoring',
                       [scoring_explainer_model, original_model],
                       inference_config,
                       aciconfig)
service.wait_for_deployment(show_output=True)

Вывод с тестовыми данными

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

if service.state == 'Healthy':
    # Serialize the first row of the test data into json
    X_test_json = X_test[:1].to_json(orient='records')
    print(X_test_json)
    # Call the service to get the predictions and the engineered explanations
    output = service.run(X_test_json)
    # Print the predicted value
    print(output['predictions'])
    # Print the engineered feature importances for the predicted value
    print(output['engineered_local_importance_values'])
    # Print the raw feature importances for the predicted value
    print('raw_local_importance_values:\n{}\n'.format(output['raw_local_importance_values']))

Визуализация для обнаружения закономерностей в данных и объяснениях во время обучения

Можно визуализировать диаграмму важности компонентов в своей рабочей области в Студии машинного обучения Azure. После завершения выполнения автоматизированного машинного обучения выберите Просмотреть сведения о модели, чтобы просмотреть сведения по конкретному выполнению. Выберите вкладку "Объяснения", чтобы увидеть визуализации на информационной панели объяснений.

Архитектура интерпретируемости машинного обучения

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

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

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