Verifique o seu código localmente

Concluído

Sempre que você alterar qualquer código em seu projeto de aprendizado de máquina, você deseja verificar a qualidade do código e do modelo.

Durante a integração contínua, você cria e verifica ativos para seu aplicativo. Como cientista de dados, você provavelmente se concentrará na criação de scripts usados para preparação de dados e treinamento de modelos. O engenheiro de aprendizado de máquina usa os scripts posteriormente em pipelines para automatizar esses processos.

Para verificar seus scripts, há duas tarefas comuns:

  • Linting: Verifique se há erros programáticos ou estilísticos em scripts Python ou R.
  • Teste de unidade: Verifique o desempenho do conteúdo dos scripts.

Diagram of verification flow with local and automated testing.

Ao verificar seu código, você evita bugs ou problemas quando o modelo é implantado. Você pode verificar seu código localmente, executando linters e testes de unidade localmente em um IDE como o Visual Studio Code.

Você também pode executar linters e testes de unidade em um fluxo de trabalho automatizado com Pipelines do Azure ou Ações do GitHub.

Você aprenderá como executar linting e testes de unidade no Visual Studio Code.

Lint seu código

A qualidade do seu código depende dos padrões acordados entre você e sua equipe. Para garantir que a qualidade acordada seja cumprida, você pode executar linters que verificarão se o código está em conformidade com os padrões da equipe.

Dependendo da linguagem de código que você usa, há várias opções para lint seu código. Por exemplo, se você trabalha com Python, pode usar Flake8 ou Pylint.

Use Flake8 para lint seu código

Para usar Flake8 localmente com o Visual Studio Code:

  1. Instale o Flake8 com pip install flake8o .
  2. Crie um arquivo de configuração e armazene o arquivo .flake8 em seu repositório.
  3. Configure o Visual Studio Code para usar Flake8 como linter indo para suas configurações (Ctrl+,).
  4. Procurar flake8.
  5. Habilite Python > Linting > Flake8 Enabled.
  6. Defina o caminho Flake8 para o local no repositório onde você armazenou o .flake8 arquivo.

Screenshot of configuring Flake8 in Visual Studio Code.

Para especificar quais são os padrões da sua equipe para a qualidade do código, você pode configurar o Linter Flake8. Um método comum para definir os padrões é criando um .flake8 arquivo que é armazenado com seu código.

O .flake8 arquivo deve começar com [flake8], seguido por qualquer uma das configurações que você deseja usar.

Gorjeta

Uma lista completa de possíveis parâmetros de configuração pode ser encontrada na documentação do Flake8.

Por exemplo, se quiser especificar que o comprimento máximo de qualquer linha não pode ser superior a 80 caracteres, você adicionará a seguinte linha ao arquivo .flake8 :

[flake8]
max-line-length = 80

Flake8 tem uma lista predefinida de erros que pode retornar. Além disso, você pode usar códigos de erro baseados no guia de estilo PEP 8. Por exemplo, você pode incluir códigos de erro que se referem ao uso adequado de recuo ou espaços em branco.

Você pode optar por selecionar () um conjunto de códigos de erro que farão parte do linter ou selecionar quais códigos de erro ignorar (selectignore) na lista padrão de opções.

Como resultado, seu .flake8 arquivo de configuração pode se parecer com o exemplo a seguir:

[flake8]
ignore = 
    W504,
    C901,
    E41
max-line-length = 79
exclude = 
    .git,
    .cache,
per-file-ignores =
    code/__init__.py:D104
max-complexity = 10
import-order-style = pep8

Gorjeta

Para obter uma visão geral dos códigos de erro aos quais você pode consultar, consulte a lista de erros Flake8

Quando você tiver configurado o Visual Studio Code para lint seu código, você pode abrir qualquer arquivo de código para revisar os resultados do lint. Quaisquer avisos ou erros serão sublinhados. Você pode selecionar Exibir problema para inspecionar o problema e entender o erro.

Screenshot of Flake 8 results in Visual Studio Code.

Lint com Pipelines do Azure ou ações do GitHub

Você também pode executar o linter automaticamente com o Azure Pipelines ou o GitHub Actions. O agente fornecido por qualquer uma das plataformas executará o linter quando:

  1. Crie um arquivo de configuração e armazene o arquivo .flake8 em seu repositório.
  2. Defina o pipeline de integração contínua ou fluxo de trabalho no YAML.
  3. Como tarefa ou etapa, instale o Flake8 com python -m pip install flake8.
  4. Como uma tarefa ou etapa, execute o flake8 comando para lint seu código.

Testes de unidade

Onde o linting verifica como você escreveu o código, os testes de unidade verificam como o código funciona. As unidades referem-se ao código que você cria. O teste de unidade é, portanto, também conhecido como teste de código.

Como prática recomendada, seu código deve existir principalmente fora de funções. Se você criou funções para preparar dados ou para treinar um modelo. Você pode aplicar testes de unidade a, por exemplo:

  • Verifique se os nomes das colunas estão corretos.
  • Verifique o nível de previsão do modelo em novos conjuntos de dados.
  • Verifique a distribuição dos níveis de previsão.

Quando você trabalha com Python, você pode usar Pytest e Numpy (que usa a estrutura Pytest) para testar seu código. Para saber mais sobre como trabalhar com o Pytest, saiba como escrever testes com o Pytest.

Gorjeta

Analise um passo a passo mais detalhado do teste Python no Visual Studio Code.

Imagine que você criou um script train.pyde treinamento, que contém a seguinte função:

# Train the model, return the model
def train_model(data, ridge_args):
    reg_model = Ridge(**ridge_args)
    reg_model.fit(data["train"]["X"], data["train"]["y"])
    return reg_model

Suponha que você armazenou o script de treinamento no diretório src/model/train.py dentro do seu repositório. Para testar a train_model função, você deve importá-la do src.model.train.

Você cria o test_train.pytests arquivo na pasta. Uma maneira de testar o código Python é usar numpyo . O Numpy oferece várias assert funções para comparar matrizes, cadeias de caracteres, objetos ou itens.

Gorjeta

Saiba mais sobre as diretrizes de teste ao usar o teste do Numpy e o suporte ao teste do Numpy.

Por exemplo, para testar a train_model função, você pode usar um pequeno conjunto de dados de treinamento e usar assert para verificar se as previsões são quase iguais às suas métricas de desempenho predefinidas.

import numpy as np
from src.model.train import train_model

def test_train_model():
    X_train = np.array([1, 2, 3, 4, 5, 6]).reshape(-1, 1)
    y_train = np.array([10, 9, 8, 8, 6, 5])
    data = {"train": {"X": X_train, "y": y_train}}

    reg_model = train_model(data, {"alpha": 1.2})

    preds = reg_model.predict([[1], [2]])
    np.testing.assert_almost_equal(preds, [9.93939393939394, 9.03030303030303])

Para testar seu código no Visual Studio Code usando a interface do usuário:

  1. Instale todas as bibliotecas necessárias para executar o script de treinamento.
  2. Verifique se pytest está instalado e habilitado no Visual Studio Code.
  3. Instale a extensão Python para Visual Studio Code.
  4. Selecione o train.py script que deseja testar.
  5. Selecione a guia Teste no menu à esquerda.
  6. Configure o teste Python selecionando pytest e definindo o diretório de teste para sua tests/ pasta.
  7. Execute todos os testes selecionando o botão play e revise os resultados.

Screenshot of successful unit test results in Visual Studio Code.

Para executar o teste em um Pipeline de DevOps do Azure ou Ação do GitHub:

  1. Verifique se todas as bibliotecas necessárias estão instaladas para executar o script de treinamento. Idealmente, use uma requirements.txt listagem de todas as bibliotecas com pip install -r requirements.txt
  2. Instalar pytest com pip install pytest
  3. Execute os testes com pytest tests/

Os resultados dos testes serão mostrados na saída do pipeline ou fluxo de trabalho executado.

Nota

Se durante o teste de forro ou de unidade, um erro for retornado, o pipeline de CI poderá falhar. Portanto, é melhor verificar seu código localmente primeiro, antes de acionar o pipeline de CI.