Cross-Validation
A validação cruzada treina e avalia um modelo em k partições rotativas de um conjunto de dados para estimar sua capacidade de generalização. Veja as etapas do K-fold, variantes, vazamento de dados e código.
A validação cruzada estima o desempenho de um modelo com dados não vistos, treinando-o e avaliando-o várias vezes com diferentes divisões do mesmo conjunto de dados e combinando as pontuações. Na validação cruzada k-fold, os dados são divididos em k partes iguais, chamadas folds, e cada fold é usado uma vez como dados de validação, enquanto o modelo treina com os outros k − 1 folds. A média das k pontuações estima o desempenho e a sua dispersão mostra até que ponto essa estimativa depende dos exemplos que calharam no conjunto de validação. A validação cruzada é o método de avaliação padrão quando há poucos dados para que uma única divisão de validação produza uma pontuação fiável; também é muito usada para comparar algoritmos e ajustar hiperparâmetros sem utilizar os dados de teste.
Como funciona a validação cruzada k-fold#
O conjunto de dados é baralhado uma vez e dividido em k folds, normalmente 5 ou 10. Em cada uma das k rondas, é treinado um modelo novo com k − 1 folds e avaliado no fold restante, pelo que cada exemplo é usado exatamente uma vez para validação e k − 1 vezes para treino. Calcula-se a média das k pontuações e apresenta-se o resultado com o respetivo desvio-padrão. Depois de a validação cruzada selecionar um modelo ou conjunto de hiperparâmetros, o modelo final é normalmente novamente treinado com todos os dados de treino e essas definições. A validação cruzada leave-one-out é o caso extremo em que k é igual ao número de exemplos; utiliza a maior quantidade de dados para treino em cada ronda, mas exige treinar tantos modelos quantos os exemplos.
Interpretar as pontuações da validação cruzada#
A dispersão entre folds é tão informativa como a média. O script scikit-learn abaixo executa uma validação cruzada de 5 folds no conjunto de dados de cancro da mama incluído:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# 569 labeled tumor samples with 30 features each
X, y = load_breast_cancer(return_X_y=True)
# The scaler sits inside the pipeline, so each round fits it on that round's training folds only
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
# 5 stratified folds: each sample is validated exactly once
folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(model, X, y, cv=folds)
print("Fold accuracies:", scores.round(3))
print(f"Mean {scores.mean():.3f} +/- {scores.std():.3f}")As cinco precisões por fold variam entre 0.956 e 1.000, com uma média de 0.979 e um desvio-padrão de 0.014. Uma única divisão 80/20 teria apresentado qualquer um desses cinco valores, um intervalo de 4.4 pontos percentuais. Colocar o normalizador no interior do pipeline impede que o fold de validação entre nas estatísticas do pré-processamento dos dados; normalizar primeiro o conjunto de dados completo provocaria fuga de dados de cada fold de validação para o treino.
Escolher uma variante de validação cruzada#
A validação k-fold simples pressupõe que os exemplos são independentes e permutáveis. Quando não são, uma divisão aleatória provoca fuga de informação ou cria folds que não representam a tarefa:
- k-fold estratificado: mantém em cada fold as proporções de classes do conjunto de dados completo, o que é importante quando uma classe rara poderia não aparecer num fold.
- K-fold por grupos: mantém todos os exemplos de um grupo, como um paciente, vídeo ou local de campo, na mesma partição, para que o modelo nunca seja validado com quase duplicatas de suas imagens de treinamento. O k-fold estratificado por grupos combina as duas restrições.
- Divisão de séries temporais: treina apenas com dados passados e valida com o período seguinte, alargando a janela de treino em cada ronda, porque baralhar dados ordenados no tempo permite ao modelo ver o futuro.
- Validação cruzada aninhada: executa um ciclo interno de validação cruzada para ajustar hiperparâmetros dentro de cada fold externo, para que a pontuação externa não seja inflacionada pelo ajuste nos mesmos folds usados para a calcular.
Validação cruzada para aprendizagem profunda#
Treinar uma rede profunda k vezes multiplica o custo computacional por k; por isso, conjuntos de dados grandes, como o ImageNet e o COCO, usam uma única divisão fixa de validação, que já é suficientemente grande para produzir uma pontuação estável. A validação cruzada é vantajosa em pequenos conjuntos de dados de visão, com algumas centenas a alguns milhares de imagens, onde uma divisão de validação pode conter apenas alguns exemplos de cada classe. O guia de validação cruzada K-Fold da Ultralytics divide um conjunto de dados de deteção em cinco folds com o KFold do scikit-learn, cria listas de imagens de treino e validação e um YAML do conjunto de dados para cada fold e treina um modelo YOLO26 por fold. Como as imagens de deteção costumam conter várias classes, não podem ser estratificadas por um único rótulo; por isso, o guia também regista, para cada classe em cada fold, o rácio entre os rótulos de validação e os de treino.
Validação cruzada e termos relacionados#
- Validação hold-out: uma única divisão, como 80/20, avaliada uma vez. Exige uma execução de treino e é adequada para conjuntos de dados grandes; a pontuação depende dos exemplos que ficam na divisão de validação.
- Bootstrapping: cria conjuntos de treino por amostragem com reposição e avalia cada modelo nos exemplos que ficaram de fora da amostra. O k-fold divide os dados sem reposição, pelo que cada exemplo pertence exatamente a um fold.
- Avaliação no conjunto de teste: a validação cruzada seleciona modelos e definições. Um conjunto de teste separado, excluído de todos os folds, fornece a estimativa final para o modelo escolhido.










