Compartilhar via


Detectar o descompasso de dados em conjuntos de dados (versão prévia)

APLICA-SE A:SDK azureml do Python v1

Saiba como monitorar o descompasso de dados e configurar alertas quando o descompasso estiver alto.

Com os monitores de conjunto de dados do Azure Machine Learning (versão prévia), você pode:

  • Analisar o descompasso dos dados para compreender como ele muda com o tempo.
  • Monitorar os dados do modelo quanto às diferenças entre os conjuntos de dados de treinamento e atendimento. Começar coletando dados de modelo nos modelos implantados.
  • Monitorar novos dados para obter as diferenças entre as linhas de base e os conjuntos de dados de destino.
  • Descrever os recursos nos dados para acompanhar a forma como as propriedades estatísticas são alteradas com o tempo.
  • Configurar alertas sobre o descompasso de dados para obter avisos antecipados relacionados a possíveis problemas.
  • Crie uma versão do conjunto de dados quando você determinar que os dados estão em muito descompasso.

Um conjunto de dados do Azure Machine Learning é usado para criar o monitor. Ele deve incluir uma coluna de carimbo de data/hora.

As métricas de descompasso dos dados podem ser exibidas com o SDK do Python ou no Estúdio do Azure Machine Learning. Outras métricas e informações ficam disponíveis por meio do recurso Azure Application Insights associado ao espaço de trabalho do Azure Machine Learning.

Importante

Atualmente, a detecção do descompasso de dados para conjuntos de dados está em versão prévia pública. A versão prévia é fornecida sem um contrato de nível de serviço e não é recomendada para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.

Pré-requisitos

Para criar e trabalhar com monitores de conjunto de dados, você precisa de:

O que é descompasso de dados?

A precisão do modelo diminui ao longo do tempo, em grande parte devido ao descompasso de dados. Para modelos do Machine Learning, o descompasso de dados é a alteração nos dados de entrada do modelo que leva a um desempenho pior. O monitoramento desse descompasso ajuda a detectar os problemas de desempenho do modelo.

As causas incluem:

  • Alterações no processo de upstream, como a substituição de um sensor que muda as unidades de medida de polegadas para centímetros.
  • Problemas de qualidade de dados, como um sensor quebrado que sempre lê 0.
  • Descompasso natural nos dados, como a mudança da temperatura média de acordo com as estações.
  • Alteração na relação entre recursos ou deslocamento de covariáveis.

O Azure Machine Learning simplifica a detecção de descompasso pela computação de uma única métrica, abstraindo a complexidade dos conjuntos de dados que estão sendo comparados. Esses conjuntos podem ter centenas de recursos e dezenas de milhares de linhas. Depois que o descompasso for detectado, faça uma busca detalhada dos recursos que estão causando o problema. Em seguida, inspecione as métricas de nível de recurso para depurar e isolar a causa raiz do descompasso.

Em vez das técnicas tradicionais baseadas em regras, essa abordagem de cima para baixo facilita o monitoramento dos dados. As técnicas baseadas em regras, como o intervalo de dados permitido ou valores exclusivos permitidos, podem ser demoradas e estão sujeitas a erros.

No Azure Machine Learning, você usa os monitores de conjunto de dados para detectar o descompasso de dados e fornecer alertas.

Monitores de conjunto de dados

Com um monitor de conjunto de dados, você pode:

  • Detectar e fornecer alertas de descompasso relacionado a novos dados em um conjunto.
  • Analisar os dados históricos do descompasso.
  • Criar perfil de novos dados ao longo do tempo.

O algoritmo de descompasso de dados fornece uma medida geral das alterações nos dados e a indicação de quais recursos são responsáveis por investigações adicionais. Os monitores de conjunto de dados produzem várias outras métricas por meio da criação de perfil de novos dados no conjunto de dados timeseries.

Os alertas personalizados podem ser configurados em todas as métricas geradas pelo monitor através do Azure Application Insights. Os monitores também podem ser usados para detectar rapidamente problemas de dados e reduzir o tempo de depuração, identificando as causas prováveis.

Conceitualmente, há três cenários principais para configurar monitores de conjuntos de dados no Azure Machine Learning.

Cenário Descrição
Monitorar os dados de serviço de um modelo em relação ao descompasso dos dados de treinamento Os resultados desse cenário podem ser interpretados como monitoramento de um proxy quanto à precisão do modelo, uma vez que essa precisão é prejudicada quando os dados de fornecimento apresentam descompasso em relação aos dados de treinamento.
Monitorar um conjunto de dados de uma série temporal quanto ao descompasso de um período de tempo anterior. Esse cenário é mais geral e pode ser usado para monitorar conjuntos de dados envolvidos no upstream ou downstream da construção do modelo. O conjunto de dados de destino deve ter uma coluna de carimbo de data/hora. O conjunto de dados da linha de base pode ser qualquer conjunto tabular que tenha recursos em comum com o conjunto de dados de destino.
Executar uma análise nos dados anteriores. Esse cenário pode ser usado para compreender os dados históricos e informar as decisões nas configurações para os monitores de conjuntos de dados.

Os monitores de conjunto de dados dependem dos seguintes serviços do Azure.

Serviço do Azure Descrição
Conjunto de dados O descompasso usa conjuntos de dados do Machine Learning para recuperar os dados de treinamento e compará-los quanto ao treinamento do modelo. A geração do perfil de dados é usada para gerar algumas métricas relatadas, como mín, máx, valores distintos, contagem de valores distintos.
Pipeline e computação do Azure Machine Learning O trabalho de cálculo de descompasso é hospedado em um pipeline do Azure Machine Learning. Esse trabalho é disparado sob demanda ou por agendamento, para ser executado em uma computação configurada no momento de criação do monitor de descompasso.
Application Insights O descompasso emite métricas para o Application Insights pertencentes ao espaço de trabalho do Machine Learning.
Armazenamento de Blobs do Azure O descompasso emite métricas no formato JSON para o armazenamento de blobs do Azure.

Linha de base e conjuntos de dados de destino

Você monitora os conjuntos de dados do Azure Machine Learning quanto ao descompasso de dados. Ao criar um monitor de conjunto de dados, você faz referência ao:

  • Conjunto de dados da linha de base – geralmente o conjunto de treinamento para um modelo.
  • Conjunto de dados de destino - geralmente, os dados de entrada do modelo – é comparado ao longo do tempo com o conjunto de dados da linha de base. Essa comparação significa que o conjunto de dados de destino deve ter uma coluna de carimbo de data/hora especificada.

O monitor compara os conjuntos de dados da linha de base e de destino.

Criar um conjunto de dados de destino

O conjunto de dados de destino precisa do conjunto de características timeseries, especificando a coluna de carimbo de data/hora de uma coluna nos dados ou de uma coluna virtual derivada do padrão de caminho dos arquivos. Crie o conjunto de dados com um carimbo de data/hora por meio do SDK do Python ou do Estúdio do Azure Machine Learning. A coluna que representa um "carimbo de data/hora" deve ser especificada para adicionar a característica timeseries ao conjunto de dados. Se os dados forem particionados na estrutura de pastas com informações de tempo, como '{yyyy/MM/dd}', crie uma coluna virtual por meio da configuração do padrão de caminho e defina-a como "carimbo de data/hora de partição" para habilitar a funcionalidade da API de série temporal.

APLICA-SE A:SDK azureml do Python v1

O método da Dataset classe with_timestamp_columns() define a coluna de carimbo de data/hora para o conjunto de dados.

from azureml.core import Workspace, Dataset, Datastore

# get workspace object
ws = Workspace.from_config()

# get datastore object
dstore = Datastore.get(ws, 'your datastore name')

# specify datastore paths
dstore_paths = [(dstore, 'weather/*/*/*/*/data.parquet')]

# specify partition format
partition_format = 'weather/{state}/{date:yyyy/MM/dd}/data.parquet'

# create the Tabular dataset with 'state' and 'date' as virtual columns
dset = Dataset.Tabular.from_parquet_files(path=dstore_paths, partition_format=partition_format)

# assign the timestamp attribute to a real or virtual column in the dataset
dset = dset.with_timestamp_columns('date')

# register the dataset as the target dataset
dset = dset.register(ws, 'target')

Dica

Para obter um exemplo completo de como usar a característica de conjuntos de dados timeseries, consulte o bloco de anotações de exemplo ou a documentação do SDK de conjuntos de dados .

Criar monitor de conjunto de dados

Crie um monitor de conjunto de dados para detectar e fornecer alertas relacionados ao descompasso em um novo conjunto de dados. Use o SDK do Python ou o Estúdio do Azure Machine Learning.

Conforme descrito posteriormente, um monitor de conjunto de dados é executado em intervalos de frequência definidos (diários, semanais, mensais). Ele analisa novos dados disponíveis no conjunto de dados de destino desde sua última execução. Em alguns casos, essa análise dos dados mais recentes pode não ser suficiente:

  • Os novos dados da fonte de upstream foram atrasados devido a um pipeline de dados desfeito e esses novos dados não estavam disponíveis quando o monitor do conjunto de dados foi executado.
  • Um conjunto de dados de série temporal tinha apenas dados históricos e você deseja analisar padrões de descompasso no conjunto de dados ao longo do tempo. Por exemplo: compare o tráfego que flui para um site, nas estações de inverno e verão, para identificar padrões sazonais.
  • Você é novo nos monitores de conjunto de dados. Você deseja avaliar como o recurso funciona com seus dados existentes antes de configurá-lo para monitorar dias no futuro. Nesses cenários, você pode enviar uma execução sob demanda, com um intervalo de datas de conjunto de dados de destino específico, para comparar com o conjunto de dados de linha de base.

A função backfill executa um trabalho de provisionamento para um intervalo de datas com início e término especificado. Um trabalho de provisionamento preenche os pontos de dados ausentes esperados em um conjunto de dados, o que é uma maneira de garantir a precisão e a integridade dos dados.

APLICA-SE A:SDK azureml do Python v1

Consulte documentação de referência do SDK do Python sobre descompasso de dados para obter detalhes completos.

O exemplo a seguir mostra como criar um monitor de conjunto de dados usando o SDK do Python

from azureml.core import Workspace, Dataset
from azureml.datadrift import DataDriftDetector
from datetime import datetime

# get the workspace object
ws = Workspace.from_config()

# get the target dataset
target = Dataset.get_by_name(ws, 'target')

# set the baseline dataset
baseline = target.time_before(datetime(2019, 2, 1))

# set up feature list
features = ['latitude', 'longitude', 'elevation', 'windAngle', 'windSpeed', 'temperature', 'snowDepth', 'stationName', 'countryOrRegion']

# set up data drift detector
monitor = DataDriftDetector.create_from_datasets(ws, 'drift-monitor', baseline, target,
                                                      compute_target='cpu-cluster',
                                                      frequency='Week',
                                                      feature_list=None,
                                                      drift_threshold=.6,
                                                      latency=24)

# get data drift detector by name
monitor = DataDriftDetector.get_by_name(ws, 'drift-monitor')

# update data drift detector
monitor = monitor.update(feature_list=features)

# run a backfill for January through May
backfill1 = monitor.backfill(datetime(2019, 1, 1), datetime(2019, 5, 1))

# run a backfill for May through today
backfill1 = monitor.backfill(datetime(2019, 5, 1), datetime.today())

# disable the pipeline schedule for the data drift detector
monitor = monitor.disable_schedule()

# enable the pipeline schedule for the data drift detector
monitor = monitor.enable_schedule()

Dica

Para obter um exemplo completo de como configurar um conjunto de dados timeseries e um detector de descompasso de dados, consulte nosso bloco de anotações de exemplo.

Compreender os resultados do descompasso de dados

Esta seção mostra os resultados do monitoramento de um conjunto de dados, encontrados na página Conjunto de dados / Monitores de conjunto de dados no Estúdio do Azure. Nesta página, é possível atualizar as configurações e analisar os dados existentes para um período de tempo específico.

Comece com as informações de nível superior sobre a magnitude do descompasso de dados e um destaque dos recursos a serem mais investigados.

Drift overview

Métrica Descrição
Magnitude do descompasso de dados Uma porcentagem do descompasso entre a linha de base e o conjunto de dados de destino ao longo do tempo. Esse percentual varia de 0 a 100, em que 0 indica conjuntos de dados idênticos e 100 indica que o modelo de descompasso de dados do Azure Machine Learning pode informar totalmente os dois conjuntos em separado. É esperado ruído na porcentagem exata medida devido às técnicas de aprendizado de máquina usadas para gerar essa magnitude.
Principais recursos em descompasso Mostra os recursos do conjunto de dados que tiveram o maior descompasso e, portanto, estão contribuindo com a maior parte da métrica de Magnitude do Descompasso. Devido ao deslocamento de covariável, a distribuição subjacente de um recurso não necessariamente precisa ser alterada para ter uma importância de recurso relativamente alta.
Limite A magnitude do descompasso de dados além do limite definido dispara alertas. Defina o valor do limite nas configurações do monitor.

Tendência da magnitude do descompasso

Veja como o conjunto de dados difere do conjunto de dados de destino no período de tempo especificado. Quanto mais próximo a 100%, mais diferem os dois conjuntos de dados.

Drift magnitude trend

Magnitude do descompasso por recursos

Esta seção contém informações em nível de recurso sobre a alteração na distribuição do recurso selecionado e outras estatísticas ao longo do tempo.

O conjunto de dados de destino também é analisado com o tempo. A distância estatística entre a distribuição de linha de base de cada recurso é comparada com a do conjunto de dados de destino ao longo do tempo. Conceitualmente, isso se assemelha à magnitude do descompasso de dados. No entanto, essa distância estatística é relacionada a um recurso individual, e não a todos os recursos. Mín., máx. e média também estão disponíveis.

No Estúdio do Azure Machine Learning, selecione uma barra no grafo para ver os detalhes de nível de recurso para a data. Por padrão, você verá a distribuição do conjunto de dados de linha de base e a distribuição do trabalho mais recente do mesmo recurso.

Drift magnitude by features

Essas métricas também podem ser recuperadas no SDK do Python por meio do método get_metrics() em um objeto DataDriftDetector.

Detalhes do recurso

Por fim, role para baixo para exibir os detalhes de cada recurso individual. Use as listas suspensas acima do gráfico para selecionar o recurso e, além disso, selecione a métrica que deseja exibir.

Numeric feature graph and comparison

As métricas no gráfico dependem do tipo de recurso.

  • Recursos numéricos

    Métrica Descrição
    Distância Wasserstein Quantidade mínima de trabalho para transformar a distribuição da linha de base na distribuição de destino.
    Valor médio Valor médio do recurso.
    Valor mínimo Valor mínimo do recurso.
    Valor máximo Valor máximo do recurso.
  • Recursos categóricos

    Métrica Descrição
    Distância euclidiana   Computado para colunas categóricas. A distância euclidiana é computada em dois vetores, gerados da distribuição empírica da mesma coluna categórica de dois conjuntos de dados. 0 indica que não há diferença nas distribuições empíricas.  Quanto mais se desviar de 0, maior será o descompasso dessa coluna. As tendências podem ser observadas em uma plotagem de série temporal dessa métrica e podem ser úteis para descobrir um recurso em descompasso.  
    Valores únicos Número de valores exclusivos (cardinalidade) do recurso.

Neste gráfico, selecione uma única data para comparar a distribuição de recursos entre o destino e essa data para o recurso exibido. Para recursos numéricos, são mostradas duas distribuições de probabilidade. Se o recurso for numérico, um gráfico de barras será mostrado.

Select a date to compare to target

Métricas, alertas e eventos

As métricas podem ser consultadas no recurso Azure Application Insights associado ao espaço de trabalho do Machine Learning. Você tem acesso a todos os recursos do Application Insights incluindo a configuração personalizada de regras de alerta e grupos de ação para disparar uma ação como, por exemplo, um Email/SMS/Push/Voice ou Azure Function. Consulte a documentação completa do Application Insights para obter detalhes.

Para começar, navegue até o Portal do Azure e selecione a página Visão geral do espaço de trabalho. O recurso do Application Insights associado fica na extrema direita:

Azure portal overview

Selecione Logs (Análise) em Monitoramento no painel esquerdo:

Application insights overview

As métricas do monitor de conjunto de um banco de dados são armazenadas como customMetrics. Você pode gravar e executar uma consulta depois de configurar um monitor de conjunto de dados para exibi-los:

Log analytics query

Depois de identificar as métricas para configurar as regras de alerta, crie uma nova regra:

New alert rule

Você pode usar um grupo de ações existente ou criar um novo para definir a ação a ser tomada quando as condições definidas forem atendidas:

New action group

Solução de problemas

Limitações e problemas conhecidos dos monitores de descompasso de dados:

  • O intervalo de tempo durante a análise de dados históricos é limitado a 31 intervalos da configuração de frequência do monitor.

  • Limitação de 200 recursos, a menos que uma lista de recursos não seja especificada (todos os recursos usados).

  • O tamanho da computação deve ser grande o suficiente para tratar os dados.

  • Verifique se o conjunto de dados tem os dados dentro da data de início e de término de um determinado trabalho do monitor.

  • Os monitores de conjunto de dados só funcionam em conjuntos que contenham 50 linhas ou mais.

  • As colunas ou recursos, no conjunto de dados, são classificados como categóricos ou numéricos com base nas condições da tabela a seguir. Se o recurso não atender a essas condições, por exemplo, uma coluna do tipo cadeia de caracteres com valores exclusivos >100, o recurso será descartado do algoritmo de descompasso de dados, mas ainda será analisado.

    Tipo de recurso Tipo de dados Condição Limitações
    Categóricos string O número de valores exclusivos no recurso é menor que 100 e menor que 5% do número de linhas. Nulo é tratado conforme sua própria categoria.
    Numérico int, float Os valores no recurso são do tipo de dados numérico e não atendem à condição de um recurso categórico. Recurso descartado se > 15% dos valores forem nulos.
  • Quando você tiver criado um monitor de descompasso de dados, mas não conseguir ver os dados na página Monitores de conjunto de dados no Estúdio do Azure Machine Learning, tente o seguinte.

    1. Verifique se selecionou o intervalo de datas correto na parte superior da página.
    2. Na guia Monitores de Conjunto de Dados, selecione o link do teste para verificar o status do trabalho. Ele fica na extrema direita da tabela.
    3. Se o trabalho for concluído com êxito, verifique os logs do driver para ver quantas métricas foram geradas ou se há alguma mensagem de aviso. Localize os logs de driver na guia Saída + logs depois de selecionar um experimento.
  • Se a função backfill() do SDK não gerar a saída esperada, pode ser que haja um problema de autenticação. Ao criar a computação para passar por essa função, não use Run.get_context().experiment.workspace.compute_targets. No lugar, use ServicePrincipalAuthentication, como a seguirbackfill():

    auth = ServicePrincipalAuthentication(
            tenant_id=tenant_id,
            service_principal_id=app_id,
            service_principal_password=client_secret
            )
    ws = Workspace.get("xxx", auth=auth, subscription_id="xxx", resource_group="xxx")
    compute = ws.compute_targets.get("xxx")
    
  • No Coletor de Dados do Modelo, pode levar até 10 minutos para que os dados cheguem na conta de armazenamento de blobs. No entanto, geralmente leva menos tempo. Em um script ou notebook, aguarde 10 minutos para garantir que as células abaixo sejam executadas com êxito.

    import time
    time.sleep(600)
    

Próximas etapas