Interpretabilidade: Explicabilidade do modelo em ML automatizado (visualização)

APLICA-SE A: Python SDK azureml v1

Neste artigo, você aprenderá a obter explicações para modelos de aprendizado de máquina automatizado (ML automatizado) no Aprendizado de Máquina do Azure usando o SDK do Python. O ML automatizado ajuda a entender a importância dos recursos dos modelos gerados.

Todas as versões do SDK após 1.0.85 definidas model_explainability=True por padrão. No SDK versão 1.0.85 e versões anteriores, os usuários precisam definir model_explainability=True o objeto para usar a interpretabilidade do AutoMLConfig modelo.

Neste artigo, vai aprender a:

  • Execute a interpretabilidade durante o treinamento para o melhor modelo ou qualquer modelo.
  • Habilite visualizações para ajudá-lo a ver padrões em dados e explicações.
  • Implementar a interpretabilidade durante a inferência ou pontuação.

Pré-requisitos

  • Recursos de interpretabilidade. Execute pip install azureml-interpret para obter o pacote necessário.
  • Conhecimento da construção de experimentos automatizados de ML. Para obter mais informações sobre como usar o SDK do Azure Machine Learning, conclua este tutorial de modelo de deteção de objeto ou veja como configurar experimentos automatizados de ML.

Importante

Esta funcionalidade está atualmente em pré-visualização pública. Esta versão de pré-visualização é fornecida sem um contrato de nível de serviço e não a recomendamos para cargas de trabalho de produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas.

Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Interpretabilidade durante a formação para o melhor modelo

Recupere a explicação do best_run, que inclui explicações para recursos brutos e projetados.

Nota

A interpretabilidade, explicação do modelo, não está disponível para o modelo TCNForecaster recomendado pelos experimentos de previsão do Auto ML.

Faça o download das importâncias dos recursos projetados da melhor execução

Você pode usar ExplanationClient para baixar as explicações de recursos projetados do repositório de artefatos do 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())

Faça o download das importâncias dos recursos brutos da melhor execução

Você pode usar ExplanationClient para baixar as explicações de recursos brutos do repositório de artefatos do 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())

Interpretabilidade durante a formação para qualquer modelo

Quando você calcula explicações de modelo e as visualiza, não está limitado a uma explicação de modelo existente para um modelo AutoML. Você também pode obter uma explicação para o seu modelo com diferentes dados de teste. As etapas nesta seção mostram como calcular e visualizar a importância do recurso de engenharia com base em seus dados de teste.

Recupere qualquer outro modelo AutoML do treinamento

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

Configurar as explicações do modelo

Use automl_setup_model_explanations para obter as explicações brutas e de engenharia. O fitted_model pode gerar os seguintes itens:

  • Dados em destaque de amostras treinadas ou de teste
  • Listas de nomes de recursos projetados
  • Classes localizáveis na coluna rotulada em cenários de classificação

O automl_explainer_setup_obj contém todas as estruturas da lista acima.

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')

Inicializar o Mimic Explainer para a importância do recurso

Para gerar uma explicação para modelos de ML automatizados, use a MimicWrapper classe. Você pode inicializar o MimicWrapper com estes parâmetros:

  • O objeto de configuração do explicador
  • O seu espaço de trabalho
  • Um modelo substituto para explicar o modelo automatizado de fitted_model ML

O MimicWrapper também leva o automl_run objeto onde as explicações projetadas serão carregadas.

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)

Use o Mimic Explainer para calcular e visualizar a importância dos recursos projetados

Você pode chamar o explain() método em MimicWrapper com as amostras de teste transformadas para obter a importância do recurso para os recursos de engenharia gerados. Você também pode entrar no estúdio do Azure Machine Learning para exibir a visualização do painel de explicações dos valores de importância do recurso dos recursos de engenharia gerados por participantes automatizados de ML.

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

Para modelos treinados com ML automatizado, você pode obter o melhor modelo usando o get_output() método e explicações de computação localmente. Você pode visualizar os resultados da explicação com ExplanationDashboard o raiwidgets pacote.

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)

Use o Mimic Explainer para calcular e visualizar a importância do recurso bruto

Você pode chamar o explain() método em MimicWrapper com as amostras de teste transformadas para obter a importância do recurso para os recursos brutos. No estúdio de Aprendizado de Máquina, você pode exibir a visualização do painel dos valores de importância do recurso dos recursos brutos.

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())

Interpretabilidade durante a inferência

Nesta seção, você aprenderá a operacionalizar um modelo de ML automatizado com o explicador que foi usado para calcular as explicações na seção anterior.

Registre o modelo e o explicador de pontuação

Use o TreeScoringExplainer para criar o explicador de pontuação que calculará os valores de importância do recurso projetado no momento da inferência. Você inicializa o explicador de pontuação com o feature_map que foi computado anteriormente.

Salve o explicador de pontuação e, em seguida, registre o modelo e o explicador de pontuação com o Serviço de Gerenciamento de Modelo. Execute o seguinte código:

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')

Criar as dependências de conda para configurar o serviço

Em seguida, crie as dependências de ambiente necessárias no contêiner para o modelo implantado. Observe que azureml-defaults com versão >= 1.0.45 deve ser listado como uma dependência pip, pois contém a funcionalidade necessária para hospedar o modelo como um serviço Web.

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())

Criar o script de pontuação

Escreva um script que carregue seu modelo e produza previsões e explicações com base em um novo lote de dados.

%%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}

Implementar o serviço

Implante o serviço usando o arquivo conda e o arquivo de pontuação das etapas anteriores.

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)

Inferência com dados de teste

Inferência com alguns dados de teste para ver o valor previsto do modelo AutoML, atualmente suportado apenas no SDK do Azure Machine Learning. Veja as importâncias dos recursos que contribuem para um valor previsto.

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']))

Visualize para descobrir padrões em dados e explicações no momento do treinamento

Você pode visualizar o gráfico de importância do recurso em seu espaço de trabalho no estúdio do Azure Machine Learning. Após a conclusão da execução do AutoML, selecione Exibir detalhes do modelo para exibir uma execução específica. Selecione a guia Explicações para ver as visualizações no painel de explicações.

Arquitetura de interpretabilidade de aprendizado de máquina

Para obter mais informações sobre as visualizações do painel de explicação e gráficos específicos, consulte o documento de instruções sobre interpretabilidade.

Próximos passos

Para obter mais informações sobre como habilitar explicações de modelo e importância de recursos em áreas diferentes do ML automatizado, consulte mais técnicas para interpretabilidade de modelo.