Guias de modelos e modalidades10 de novembro de 2026Flatkey Team

Machine learning com Python: primeiro modelo e quando usar GPU

Um tutorial prático em CPU com scikit-learn, avaliação de erros e uma decisão de infraestrutura baseada no trabalho real, sem exigir GPU para começar.

Machine learning com Python: primeiro modelo e quando usar GPU

Para começar com machine learning com Python, escolha uma tarefa pequena, separe os dados de treino e teste e compare um modelo simples com uma referência básica. Você não precisa alugar uma GPU para o primeiro exercício. Neste guia, vamos montar um classificador completo em CPU, interpretar seus erros e decidir quando faz sentido mudar a infraestrutura.

O objetivo é sair com um experimento que você consegue repetir e explicar. Acertar uma previsão isolada é menos útil do que saber quais dados o modelo viu, como foi avaliado e onde ele falha.

O que aprender primeiro em machine learning com Python

Um projeto de aprendizado supervisionado tem entradas, chamadas de atributos, e uma resposta conhecida, chamada de alvo. No exemplo deste artigo, os atributos são medidas de flores e o alvo é a espécie. O modelo aprende uma relação usando o conjunto de treino e depois tenta classificar exemplos que ficaram separados.

Antes de escolher uma biblioteca, escreva a pergunta que deseja responder:

Tarefa Tipo de resposta Primeiro experimento possível
Classificar uma observação Uma categoria Regressão logística ou árvore de decisão
Estimar uma quantidade Um número Regressão linear e análise dos erros
Encontrar grupos sem rótulos Agrupamentos Um método de clustering e inspeção dos grupos
Trabalhar com imagens ou linguagem em grande escala Representações e previsões mais complexas Uma biblioteca apropriada de deep learning, depois de definir a avaliação

Não escolha uma rede neural apenas porque ela parece mais avançada. Se uma solução simples resolve a tarefa dentro do custo e do prazo necessários, ela é uma referência importante para qualquer alternativa posterior.

Prepare um ambiente isolado

Você precisa de uma instalação de Python compatível com o scikit-learn e de acesso ao terminal. Crie uma pasta de trabalho e um ambiente virtual para evitar conflitos com outros projetos:

python -m venv .venv

No macOS ou Linux, ative com source .venv/bin/activate. No PowerShell do Windows, use .venv\Scripts\Activate.ps1, conforme as políticas locais do terminal. Depois instale a biblioteca e registre as versões:

python -m pip install scikit-learn
python -m pip freeze > requirements.txt

Use python3 no lugar de python se esse for o nome do executável no seu computador. O arquivo de dependências ajuda a recriar o ambiente; guarde também a versão do Python, o código e a configuração do experimento.

Um primeiro modelo completo: classificação de flores

O conjunto Iris do scikit-learn contém 150 observações, quatro atributos numéricos e três classes. É pequeno e adequado para aprender o fluxo de trabalho, mas não demonstra que um sistema está pronto para dados reais.

Salve o código abaixo como exemplo_iris.py e execute python exemplo_iris.py. Ele usa 120 observações para treino e 30 para teste. A divisão estratificada mantém a representação das classes; a semente fixa permite repetir a mesma divisão.

import platform
from time import perf_counter
import sklearn
from sklearn.datasets import load_iris
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42, stratify=y
)
models = {
    "baseline": DummyClassifier(strategy="most_frequent"),
    "logistica": make_pipeline(
        StandardScaler(), LogisticRegression(max_iter=1000)
    ),
}
for name, model in models.items():
    start = perf_counter()
    model.fit(X_train, y_train)
    train_seconds = perf_counter() - start
    pred = model.predict(X_test)
    print(name, "acuracia=", round(accuracy_score(y_test, pred), 3),
          "f1_macro=", round(f1_score(
              y_test, pred, average="macro", zero_division=0
          ), 3))
    print("matriz de confusao:", confusion_matrix(y_test, pred).tolist())
    print("tempo de treino (s):", round(train_seconds, 6))
print("Python:", platform.python_version(),
      "scikit-learn:", sklearn.__version__)

O DummyClassifier fornece uma comparação que não aprende uma relação entre os atributos e a classe. Com a estratégia usada aqui, ele prevê a classe mais frequente do treino. Se um modelo mais elaborado não melhora uma referência assim, investigue dados, objetivo e avaliação antes de gastar mais recursos. Veja as estratégias na documentação do DummyClassifier.

A regressão logística recebe os dados por uma Pipeline: primeiro a padronização, depois o classificador. As transformações são ajustadas no treino e reaplicadas ao teste. Isso evita calcular a escala usando informações que deveriam estar reservadas para avaliação, uma forma comum de vazamento de dados. A documentação de boas práticas do scikit-learn explica esse cuidado.

Como interpretar a saída sem se enganar

Na execução deste exemplo em CPU, com Python 3.14.4 e scikit-learn 1.9.1, obtivemos os resultados abaixo. São resultados do exercício e desta divisão dos dados, não uma promessa para outro conjunto.

Modelo Acurácia no teste F1 macro
Referência de classe mais frequente 0,333 0,167
Padronização + regressão logística 0,933 0,933

A matriz do segundo modelo foi [[10, 0, 0], [0, 9, 1], [0, 1, 9]]: duas das 30 flores do teste foram confundidas entre as duas últimas classes. Isso é mais informativo que dizer apenas que o modelo acertou cerca de 93%.

A acurácia indica a proporção de previsões corretas no conjunto avaliado. O F1 macro calcula o F1 de cada classe e faz uma média sem dar peso maior à classe mais frequente. A matriz de confusão mostra quais classes foram confundidas. Use as três leituras para entender o comportamento, em vez de procurar somente o maior número.

O tempo impresso é apenas o tempo de treino daquela execução no seu computador. Em um conjunto tão pequeno, ele varia com a máquina e com o ruído de medição. Não use esse número para prometer economia em nuvem ou comparar CPU e GPU.

O resultado do Iris também não deve virar uma expectativa de precisão para seu produto. Em dados próprios, a distribuição, a qualidade dos rótulos e o custo dos erros podem ser completamente diferentes. Uma falha rara pode ser mais importante que dezenas de acertos fáceis.

Antes de mudar o algoritmo, responda:

  1. O modelo superou a referência básica usando exatamente o mesmo teste?
  2. Qual classe concentra os erros e qual é o impacto deles na tarefa?
  3. Existe informação nas entradas que só estaria disponível depois da previsão?
  4. O teste representa exemplos novos ou contém duplicatas e observações relacionadas ao treino?
  5. O desempenho se mantém em outras divisões válidas dos dados?

Do exercício para um conjunto de dados real

A divisão aleatória é conveniente para o Iris. Ela pode ser inadequada se você prevê eventos futuros, tem várias linhas por cliente ou encontra cópias da mesma observação. Nesses casos, considere uma separação temporal ou por grupos, de acordo com a forma como o modelo será usado. O parâmetro random_state não corrige uma divisão conceitualmente errada. A referência de train_test_split descreve os controles disponíveis para essa divisão simples.

Reserve a validação para escolher configurações e mantenha um teste final separado. Se você consulta o teste repetidamente para decidir o próximo ajuste, ele passa a influenciar suas escolhas. Para um projeto pequeno, uma planilha de experimentos já ajuda:

Registro O que anotar
Dados Origem, data, tamanho, colunas e regra de exclusão
Divisão Temporal, por grupos ou aleatória; semente quando aplicável
Modelo Algoritmo, parâmetros e versão das dependências
Avaliação Métrica principal, erros por classe e comparação com a referência
Operação Tempo, memória, tamanho do artefato e custo medido
Decisão O que melhorou e qual problema continua aberto

Quando substituir o Iris por uma tabela própria, valide tipos, campos ausentes e categorias antes de treinar. Mantenha as transformações junto do modelo para que a previsão use a mesma preparação dos dados. Uma coluna que mudou de unidade pode causar problemas mesmo que o código continue executando.

Quando uma GPU ajuda — e quando não ajuda

O exemplo deste guia trabalha em CPU. Adicionar uma placa à máquina não faz automaticamente todo código do scikit-learn usá-la. O projeto documenta suporte a GPU para um conjunto limitado de estimadores e configurações, inclusive por meio de entradas e opções específicas. Verifique o caminho exato do algoritmo escolhido.

Uma GPU merece um experimento quando há uma implementação compatível e uma carga que pode aproveitá-la, como determinados treinamentos de redes neurais ou processamento em lotes. Ainda assim, o ganho precisa compensar transferência de dados, preparação do ambiente e custo da infraestrutura.

Situação observada Próxima ação recomendada
Poucos dados e treino rápido em CPU Priorizar qualidade dos dados e avaliação
Leitura ou preparação consome a maior parte do tempo Medir armazenamento, carregamento e transformações
Algoritmo sem caminho compatível com GPU Rever a biblioteca ou manter CPU
Treino compatível com GPU ocupa grande parte do ciclo Executar um teste controlado na configuração candidata
Modelo grande ou alto volume de inferência Medir memória, latência e concorrência com a carga real

Compare tempo total até um resultado útil, e não apenas a execução de uma operação. Inclua instalação, transferência, treino, validação, armazenamento e períodos ociosos. Uma alternativa mais rápida por época pode ser pior se exigir mais tentativas para atingir a qualidade necessária.

Quando o projeto chegar a essa etapa, a Flatkey Cloud GPU permite avaliar opções de aluguel de GPUs NVIDIA. Confirme configuração, região, disponibilidade e condições para a carga pretendida. Leve o tamanho do conjunto, a biblioteca, a memória necessária e o objetivo do teste; este tutorial não exige contratar uma GPU para ser concluído.

Antes de colocar o modelo em uso

Defina o formato aceito de entrada, o comportamento para campos inválidos e como acompanhar erros após a publicação. Guarde a versão do modelo e a preparação dos dados juntas. Teste uma previsão com dados representativos fora do notebook antes de pensar em escala.

Se o próximo passo for servir um modelo de linguagem com infraestrutura própria, o guia de implantação do vLLM trata de outro tipo de carga. Não confunda um classificador tabular pequeno com a operação de um LLM: requisitos de memória, avaliação e servidor são diferentes.

Perguntas frequentes

Preciso de uma GPU para aprender machine learning com Python?

Não. O exemplo apresentado pode ser executado em CPU. Escolha infraestrutura maior quando existir um gargalo medido e uma implementação que possa aproveitá-la.

Por que usar uma referência básica antes de um modelo mais complexo?

Ela mostra o que é possível obter com uma regra simples. Isso permite avaliar se o modelo aprendeu algo útil e se a complexidade adicional é justificada.

A mesma semente garante o mesmo resultado em qualquer ambiente?

Ela fixa as escolhas aleatórias controladas por aquele parâmetro. Registre também versões e ambiente; diferenças de implementação e execução podem afetar resultados. Não confunda repetibilidade de uma divisão com garantia universal de desempenho.

Qual é o próximo projeto depois do Iris?

Escolha uma tarefa pequena com dados que você entende, um alvo verificável e um critério de sucesso. Repita o processo: referência, divisão correta, modelo, análise dos erros e medição. Esse hábito é a base para evoluir em machine learning com Python sem aumentar o custo antes da necessidade.