Explicabilidade do modelo

Durante o processo de treinamento, os modelos de aprendizado de máquina inferem relacionamentos entre entradas e saídas, em vez de exigir que esses relacionamentos sejam declarados explicitamente de antemão. Isso permite que técnicas de ML lidem com cenários complicados envolvendo muitas variáveis sem uma configuração extensa, particularmente quando os fatores causais de um resultado específico são complexos ou pouco claros, mas o modelo resultante pode ser uma espécie de caixa-preta. Se um modelo tem desempenho insatisfatório, pode ser difícil entender o motivo e, além disso, como melhorar seu desempenho. O modelo de caixa preta também pode ocultar preconceitos implícitos e não definir razões claras para as decisões. Setores que têm regulamentações sobre sistemas confiáveis, como finanças e saúde, podem exigir evidências mais fortes de que o modelo está produzindo os resultados corretos pelos motivos certos.

Para ajudar a resolver essas preocupações, o Snowflake Model Registry inclui uma função de explicabilidade baseada em valores de Shapley. Os valores de Shapley são uma maneira de atribuir a saída de um modelo de aprendizado de máquina aos seus recursos de entrada. Ao considerar todas as combinações possíveis de características, os valores de Shapley medem a contribuição marginal média de cada recurso para a previsão do modelo. Essa abordagem garante justiça na atribuição de importância e fornece uma base sólida para a compreensão de modelos complexos. Embora exijam muita computação, os insights obtidos a partir dos valores de Shapley são inestimáveis para a interpretabilidade e depuração do modelo.

Por exemplo, suponha que temos um modelo para prever o preço de uma casa, que foi treinado com base no tamanho da casa, local, número de quartos e se animais de estimação são permitidos. Neste exemplo, o preço médio das casas é de US$ 100 mil, e a previsão final do modelo foi de US$ 250 mil para uma casa de 2 mil metros quadrados, à beira-mar, com três quartos e que não permite animais de estimação. Cada um desses valores de recurso pode contribuir para a previsão do modelo final, conforme mostrado na tabela a seguir.

Recurso

Valor

Contribuição vs. uma casa média

Tamanho

2000

+$50,000

Local

Beira-mar

+$75,000

Quartos

3

+$50,000

Animais de estimação

Não

-$25,000

Juntas, essas contribuições explicam por que esta casa em particular tem um preço US$ 150 mil mais alto do que uma casa comum. Os valores de Shapley podem afetar o resultado final positiva ou negativamente, resultando em uma diferença de resultados em comparação à média. Neste exemplo, é menos desejável morar em uma casa onde animais de estimação não são permitidos, então a contribuição do valor desse recurso é de -US$ 25 mil.

O valor médio é calculado usando dados contextuais, uma amostra representativa de todo o conjunto de dados. Para obter mais informações, consulte Modelos de registro com dados em segundo plano.

Tipos de modelo compatíveis

Este lançamento de versão oferece suporte aos seguintes pacotes de modelo nativos do Python.

  • XGBoost

  • CatBoost

  • LightGBM

  • Scikit-learn

As seguintes classes de modelagem de ML Snowpark de snowflake.ml.modeling são compatíveis.

  • XGBoost

  • LightGBM

  • Scikit-learn (exceto modelos de pipeline)

A explicabilidade está disponível por padrão para os modelos acima registrados usando o Snowpark ML 1.6.2 e posteriores. A implementação usa a biblioteca SHAP

Modelos de registro com dados em segundo plano

Dados em segundo plano, normalmente uma amostra de dados representativos, são um ingrediente importante das explicações baseadas em valores de Shapley. Os dados em segundo plano dão ao algoritmo Shapley uma ideia de como são as entradas “médias”, com as quais ele pode comparar explicações individuais.

O valor de Shapley é calculado perturbando sistematicamente os recursos de entrada e substituindo-os pelos dados em segundo plano. Como ele relata desvios dos dados em segundo plano, é importante usar dados de segundo plano consistentes ao comparar os valores de Shapley de vários conjuntos de dados.

Alguns modelos baseados em árvore codificam implicitamente dados de fundo em sua estrutura durante o treinamento e podem não exigir dados em segundo plano explícitos. A maioria dos modelos, no entanto, exige que dados em segundo plano sejam fornecidos separadamente para explicações úteis, e todos os modelos (incluindo modelos baseados em árvores) podem ser explicados com mais precisão se você fornecer dados de contexto.

É possível fornecer até mil linhas de dados de segundo plano ao registrar um modelo, passando-os no parâmetro sample_input_data, conforme mostrado abaixo.

Nota

Se o modelo for um tipo que requer dados em segundo plano explícitos para calcular os valores de Shapley, a explicabilidade não pode ser habilitada sem esses dados.

mv = reg.log_model(
    catboost_model,
    model_name="diamond_catboost_explain_enabled",
    version_name="explain_v0",
    conda_dependencies=["snowflake-ml-python"],
    sample_input_data = xs, # xs will be used as background data
)
Copy

Você também pode fornecer dados de segundo plano ao registrar o modelo com uma assinatura, conforme mostrado abaixo.

mv = reg.log_model(
    catboost_model,
    model_name="diamond_catboost_explain_enabled",
    version_name="explain_v0",
    conda_dependencies=["snowflake-ml-python"],
    signatures={"predict": predict_signature, "predict_proba": predict_proba_signature},
    sample_input_data = xs, # xs will be used as background data
    options= {"enable_explainability": True} # you will need to set this flag in order to pass both signatures and background data
)
Copy

Recuperando valores de explicabilidade

Modelos com explicabilidade têm um método chamado explain que retorna os valores de Shapley aos recursos do modelo.

Como os valores de Shapley são explicações de previsões feitas a partir de entradas específicas, é necessário passar dados de entrada para explain para gerar as previsões a serem explicadas.

O objeto da versão do modelo Snowflake terá um método chamado explain, e você o chamará usando ModelVersion.run em Python.

reg = Registry(...)
mv = reg.get_model("Explainable_Catboost_Model").default
explanations = mv.run(input_data, function_name="explain")
Copy

A seguir está um exemplo de recuperação da explicação em SQL.

WITH MV_ALIAS AS MODEL DATABASE.SCHEMA.DIAMOND_CATBOOST_MODEL VERSION EXPLAIN_V0
SELECT *,
      FROM DATABASE.SCHEMA.DIAMOND_DATA,
          TABLE(MV_ALIAS!EXPLAIN(CUT, COLOR, CLARITY, CARAT, DEPTH, TABLE_PCT, X, Y, Z));
Copy

Importante

Se você estiver usando um snowflake-ml-python de versão anterior à 1.7.0, poderá receber o erro UnicodeDecodeError: 'utf-8' codec can't decode byte com modelos XGBoost. Isso ocorre devido a uma incompatibilidade entre a versão 0.42.1 da biblioteca SHAP e a versão mais recente do XGBoost (2.1.1) compatível com o Snowflake. Se você não puder atualizar o snowflake-ml-python para a versão 1.7.0 ou posterior, faça o downgrade da versão do XGBoost para 2.0.3 do e registre o modelo com a opção relax_version definida como False, conforme mostrado no exemplo a seguir.

mv_new = reg.log_model(
    model,
    model_name="model_with_explain_enabled",
    version_name="explain_v0",
    conda_dependencies=["snowflake-ml-python"],
    sample_input_data = xs,
    options={"relax_version": False}
)
Copy

Como adicionar explicabilidade aos modelos existentes

Modelos que foram registrados no registro usando uma versão do Snowpark ML anterior à 1.6.2 não têm o recurso de explicabilidade. Como as versões do modelo são imutáveis, você deve criar uma nova versão do modelo para adicionar explicabilidade a um modelo existente. É possível usar ModelVersion.load para recuperar o objeto Python que representa a implementação do modelo e, em seguida, registrá-lo em log como uma nova versão do modelo. Certifique-se de passar seus dados em segundo plano como sample_input_data. Essa abordagem é mostrada abaixo.

Importante

O ambiente Python no qual você carrega o modelo deve ser exatamente o mesmo (ou seja, a mesma versão do Python e de todas as bibliotecas) que o ambiente onde o modelo foi implantado. Para obter mais detalhes, consulte Carregamento da versão do modelo.

mv_old = reg.get_model("model_without_explain_enabled").default
model = mv_old.load()
mv_new = reg.log_model(
    model,
    model_name="model_with_explain_enabled",
    version_name="explain_v0",
    conda_dependencies=["snowflake-ml-python"],
    sample_input_data = xs
)
Copy

Modelos de registro em log sem explicabilidade

A explicabilidade é habilitada por padrão se for compatível com o modelo. Para registrar uma versão do modelo no registro sem explicação, passe False para a opção enable_explainability ao registrar o modelo, conforme mostrado aqui.

mv = reg.log_model(
    catboost_model,
    model_name="diamond_catboost_explain_enabled",
    version_name="explain_v0",
    conda_dependencies=["snowflake-ml-python"],
    sample_input_data = xs,
    options= {"enable_explainability": False}
)
Copy