Validação cruzada k-fold em python (passo a passo)


Para avaliar o desempenho de um modelo em um conjunto de dados, precisamos medir até que ponto as previsões feitas pelo modelo correspondem aos dados observados.

Um método comumente usado para fazer isso é conhecido como validação cruzada k-fold , que usa a seguinte abordagem:

1. Divida aleatoriamente um conjunto de dados em k grupos, ou “dobras”, de tamanho aproximadamente igual.

2. Escolha uma das dobras como conjunto de contenção. Ajuste o modelo às dobras k-1 restantes. Calcule o teste MSE nas observações da camada que foi tensionada.

3. Repita esse processo k vezes, cada vez usando um conjunto diferente como conjunto de exclusão.

4. Calcule o MSE geral do teste como a média dos k MSEs do teste.

Este tutorial fornece um exemplo passo a passo de como realizar a validação cruzada k-fold para um determinado modelo em Python.

Etapa 1: carregue as bibliotecas necessárias

Primeiro, carregaremos as funções e bibliotecas necessárias para este exemplo:

 from sklearn. model_selection import train_test_split
from sklearn. model_selection import KFold
from sklearn. model_selection import cross_val_score
from sklearn. linear_model import LinearRegression
from numpy import means
from numpy import absolute
from numpy import sqrt
import pandas as pd

Etapa 2: crie os dados

A seguir, criaremos um DataFrame do pandas que contém duas variáveis preditoras, x1 e x2 , e uma única variável de resposta y.

 df = pd.DataFrame({' y ': [6, 8, 12, 14, 14, 15, 17, 22, 24, 23],
                   ' x1 ': [2, 5, 4, 3, 4, 6, 7, 5, 8, 9],
                   ' x2 ': [14, 12, 12, 13, 7, 8, 7, 4, 6, 5]})

Etapa 3: realizar validação cruzada K-Fold

A seguir, ajustaremos um modelo de regressão linear múltipla ao conjunto de dados e realizaremos LOOCV para avaliar o desempenho do modelo.

 #define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']

#define cross-validation method to use
cv = KFold ( n_splits = 10 , random_state = 1 , shuffle = True )

#build multiple linear regression model
model = LinearRegression()

#use k-fold CV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_absolute_error ',
                         cv=cv, n_jobs=-1)

#view mean absolute error
mean(absolute(scores))

3.6141267491803646

Pelo resultado, podemos perceber que o erro absoluto médio (MAE) foi de 3,614 . Ou seja, o erro absoluto médio entre a previsão do modelo e os dados efetivamente observados é 3,614.

Em geral, quanto menor o MAE, melhor o modelo é capaz de prever as observações reais.

Outra métrica comumente usada para avaliar o desempenho do modelo é a raiz do erro quadrático médio (RMSE). O código a seguir mostra como calcular essa métrica usando LOOCV:

 #define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']

#define cross-validation method to use
cv = KFold ( n_splits = 5 , random_state = 1 , shuffle = True ) 

#build multiple linear regression model
model = LinearRegression()

#use LOOCV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_squared_error ',
                         cv=cv, n_jobs=-1)

#view RMSE
sqrt(mean(absolute(scores)))

4.284373111711816

A partir do resultado, podemos ver que a raiz do erro quadrático médio (RMSE) foi 4,284 .

Quanto menor o RMSE, melhor o modelo é capaz de prever as observações reais.

Na prática, normalmente ajustamos vários modelos diferentes e comparamos o RMSE ou MAE de cada modelo para decidir qual modelo produz as taxas de erro de teste mais baixas e é, portanto, o melhor modelo a ser usado.

Observe também que neste exemplo optamos por usar k=5 dobras, mas você pode escolher qualquer número de dobras que desejar.

Na prática, normalmente escolhemos entre 5 e 10 camadas, pois este é o número ideal de camadas que produz taxas de erro de teste confiáveis.

Você pode encontrar a documentação completa da função KFold() do sklearn aqui .

Recursos adicionais

Uma introdução à validação cruzada K-Fold
Um guia completo para regressão linear em Python
Validação cruzada Leave-One-Out em Python

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *