Como fazer validação cruzada para desempenho do modelo em r
Nas estatísticas, muitas vezes construímos modelos por dois motivos:
- Entenda o relacionamento entre uma ou mais variáveis preditoras e uma variável de resposta.
- Use um modelo para prever observações futuras.
A validação cruzada é útil para estimar quão bem um modelo é capaz de prever observações futuras.
Por exemplo, podemos construir um modelo de regressão linear múltipla que usa idade e renda como variáveis preditoras e status de inadimplência como variável de resposta. Neste caso, podemos querer ajustar o modelo a um conjunto de dados e depois utilizar esse modelo para prever, com base no rendimento e na idade de um novo requerente, a probabilidade de incumprimento do empréstimo.
Para determinar se o modelo tem forte capacidade preditiva, precisamos usá-lo para fazer previsões sobre dados nunca vistos antes. Isso nos permitirá estimar o erro de previsão do modelo.
Usando validação cruzada para estimar erros de previsão
A validação cruzada refere-se a diferentes maneiras pelas quais podemos estimar o erro de previsão. A abordagem geral para validação cruzada é:
1. Separe um certo número de observações no conjunto de dados – normalmente 15-25% de todas as observações.
2. Ajustar (ou “treinar”) o modelo nas observações que mantemos no conjunto de dados.
3. Teste o quão bem o modelo pode fazer previsões sobre observações que não usamos para treinar o modelo.
Medindo a qualidade de um modelo
Quando usamos o modelo ajustado para fazer previsões sobre novas observações, podemos usar diversas métricas diferentes para medir a qualidade do modelo, incluindo:
Múltiplo R-quadrado: Mede a força da relação linear entre as variáveis preditoras e a variável de resposta. Um múltiplo R ao quadrado de 1 indica uma relação linear perfeita, enquanto um múltiplo R ao quadrado de 0 indica nenhuma relação linear. Quanto maior o múltiplo R-quadrado, maior a probabilidade de as variáveis preditoras preverem a variável resposta.
Erro quadrático médio (RMSE): mede o erro médio de previsão cometido pelo modelo ao prever o valor de uma nova observação. Esta é a distância média entre o valor verdadeiro de uma observação e o valor previsto pelo modelo. Valores mais baixos para RMSE indicam melhor ajuste do modelo.
Erro Médio Absoluto (MAE): Esta é a diferença média absoluta entre o valor verdadeiro de uma observação e o valor previsto pelo modelo. Esta métrica é geralmente menos sensível a valores discrepantes do que o RMSE. Valores mais baixos para MAE indicam melhor ajuste do modelo.
Implementando quatro técnicas diferentes de validação cruzada em R
Explicaremos então como implementar as seguintes técnicas de validação cruzada em R:
1. Abordagem do conjunto de validação
2. Validação cruzada k-fold
3. Deixe a validação cruzada de lado
4. Validação cruzada repetida de k-fold
Para ilustrar como usar essas diferentes técnicas, usaremos um subconjunto do conjunto de dados R integrado mtcars :
#define dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #view first six rows of new data head(data) # mpg disp hp drat #Mazda RX4 21.0 160 110 3.90 #Mazda RX4 Wag 21.0 160 110 3.90 #Datsun 710 22.8 108 93 3.85 #Hornet 4 Drive 21.4 258 110 3.08 #Hornet Sportabout 18.7 360 175 3.15 #Valiant 18.1 225 105 2.76
Construiremos um modelo de regressão linear múltipla usando disp , hp e drat como variáveis preditoras e mpg como variável de resposta.
Abordagem do conjunto de validação
A abordagem do conjunto de validação funciona da seguinte maneira:
1. Divida os dados em dois conjuntos: um conjunto é usado para treinar o modelo (ou seja, estimar os parâmetros do modelo) e o outro conjunto é usado para testar o modelo. Geralmente, o conjunto de treinamento é gerado selecionando aleatoriamente 70-80% dos dados, e os 20-30% restantes dos dados são usados como conjunto de teste.
2. Crie o modelo usando o conjunto de dados de treinamento.
3. Use o modelo para fazer previsões sobre os dados do conjunto de testes.
4. Meça a qualidade do modelo usando métricas como R-quadrado, RMSE e MAE.
Exemplo:
O exemplo a seguir usa o conjunto de dados que definimos acima. Primeiro, dividimos os dados em
um conjunto de treinamento e um conjunto de teste, usando 80% dos dados como conjunto de treinamento e os 20% restantes dos dados como conjunto de teste. A seguir, construímos o modelo usando o conjunto de treinamento. Em seguida, usamos o modelo para fazer previsões sobre o conjunto de testes. Por fim, medimos a qualidade do modelo usando R-quadrado, RMSE e MAE.
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #split the dataset into a training set (80%) and test set (20%). training_obs <- data$mpg %>% createDataPartition(p = 0.8, list = FALSE) train <- data[training_obs, ] test <- data[-training_obs, ] # Build the linear regression model on the training set model <- lm(mpg ~ ., data = train) # Use the model to make predictions on the test set predictions <- model %>% predict(test) #Examine R-squared, RMSE, and MAE of predictions data.frame(R_squared = R2(predictions, test$mpg), RMSE = RMSE(predictions, test$mpg), MAE = MAE(predictions, test$mpg)) #R_squared RMSE MAE #1 0.9213066 1.876038 1.66614
Ao comparar diferentes modelos, aquele que produz o menor RMSE no conjunto de teste é o modelo preferido.
Vantagens e desvantagens desta abordagem
A vantagem da abordagem do conjunto de validação é que ela é simples e computacionalmente eficiente. A desvantagem é que o modelo é construído usando apenas parte do total de dados. Se os dados que deixamos de fora do conjunto de treinamento contiverem informações interessantes ou valiosas, o modelo não as levará em consideração.
abordagem de validação cruzada k-fold
A abordagem de validação cruzada k-fold funciona da seguinte forma:
1. Divida aleatoriamente os dados em k “dobras” ou subconjuntos (por exemplo, 5 ou 10 subconjuntos).
2. Treine o modelo em todos os dados, deixando de fora apenas um subconjunto.
3. Use o modelo para fazer previsões sobre os dados do subconjunto que foi deixado de fora.
4. Repita esse processo até que cada um dos k subconjuntos tenha sido usado como conjunto de teste.
5 . Meça a qualidade do modelo calculando a média dos k erros de teste. Isto é conhecido
como um erro de validação cruzada.
Exemplo
Neste exemplo, primeiro dividimos os dados em 5 subconjuntos. Em seguida, ajustamos o modelo usando todos os dados, exceto um subconjunto. Em seguida, usamos o modelo para fazer previsões sobre o subconjunto que foi deixado de fora e registrar o erro do teste (usando R-quadrado, RMSE e MAE). Repetimos esse processo até que cada subconjunto tenha sido usado como conjunto de teste. Então simplesmente calculamos a média dos 5 erros de teste.
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets (or "folds") to use train_control <- trainControl(method = "cv", number = 5) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #Summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold) #Summary of sample sizes: 26, 25, 26, 25, 26 #Resampling results: # # RMSE Rsquared MAE #3.095501 0.7661981 2.467427 # #Tuning parameter 'intercept' was held constant at a value of TRUE
Vantagens e desvantagens desta abordagem
A vantagem da abordagem de validação cruzada k-fold sobre a abordagem do conjunto de validação é que ela constrói o modelo várias vezes diferentes usando diferentes partes de dados a cada vez, portanto, não temos a chance de omitir dados importantes ao construir o modelo.
A parte subjetiva desta abordagem é escolher o valor a ser usado para k, ou seja, o número de subconjuntos nos quais dividir os dados. Em geral, valores de k mais baixos levam a um viés mais alto, mas a uma variabilidade menor, enquanto valores de k mais altos levam a um viés mais baixo, mas a uma variabilidade mais alta.
Na prática, k é geralmente escolhido como igual a 5 ou 10, porque esse número de subconjuntos tende a evitar simultaneamente muito viés e muita variabilidade.
Abordagem de validação cruzada Leave One Out (LOOCV)
A abordagem LOOCV funciona da seguinte forma:
1. Construa o modelo usando todas as observações do conjunto de dados, exceto uma.
2. Use o modelo para prever o valor da observação faltante. Registre o erro ao testar esta previsão.
3. Repita este processo para cada observação no conjunto de dados.
4. Meça a qualidade do modelo calculando a média de todos os erros de previsão.
Exemplo
O exemplo a seguir demonstra como executar LOOCV para o mesmo conjunto de dados usado nos exemplos anteriores:
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #specify that we want to use LOOCV train_control <- trainControl( method = "LOOCV" ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Leave-One-Out Cross-Validation #Summary of sample sizes: 31, 31, 31, 31, 31, 31, ... #Resampling results: # # RMSE Rsquared MAE #3.168763 0.7170704 2.503544 # #Tuning parameter 'intercept' was held constant at a value of TRUE
Vantagens e desvantagens desta abordagem
A vantagem do LOOCV é que usamos todos os pontos de dados, o que geralmente reduz possíveis vieses. Porém, como utilizamos o modelo para prever o valor de cada observação, isso poderia levar a uma maior variabilidade no erro de previsão.
Outra desvantagem desta abordagem é que ela deve se ajustar a um número tão grande de modelos que pode se tornar ineficiente e computacionalmente pesada.
Abordagem repetida de validação cruzada k-fold
Podemos realizar validação cruzada repetida de k dobras simplesmente realizando a validação cruzada de k dobras várias vezes. O erro final é o erro médio do número de repetições.
O exemplo a seguir realiza uma validação cruzada de 5 vezes, repetida 4 vezes:
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets to use and number of times to repeat k-fold CV train_control <- trainControl(method = "repeatedcv", number = 5, repeats = 4 ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold, repeated 4 times) #Summary of sample sizes: 26, 25, 26, 25, 26, 25, ... #Resampling results: # # RMSE Rsquared MAE #3.176339 0.7909337 2.559131 # #Tuning parameter 'intercept' was held constant at a value of TRUE
Vantagens e desvantagens desta abordagem
A vantagem da abordagem de validação cruzada repetida k-fold é que para cada repetição os dados serão divididos em subconjuntos ligeiramente diferentes, o que deve fornecer uma estimativa ainda mais imparcial do erro de previsão do modelo. A desvantagem desta abordagem é que ela pode ser computacionalmente intensiva, uma vez que temos que repetir o processo de ajuste do modelo várias vezes.
Como escolher o número de dobras na validação cruzada
A parte mais subjetiva da validação cruzada é decidir quantas dobras (ou seja, subconjuntos) usar. Em geral, quanto menor o número de dobras, mais enviesadas serão as estimativas de erro, mas menos variáveis elas serão. Por outro lado, quanto maior o número de dobras, menos enviesadas serão as estimativas de erro, mas mais variáveis elas serão.
Também é importante ter em mente o tempo de cálculo. Para cada dobra, você precisará treinar um novo padrão e, embora seja um processo lento, pode demorar muito se você escolher um número alto de dobras.
Na prática, a validação cruzada geralmente é realizada com 5 ou 10 dobras, pois proporciona um bom equilíbrio entre variabilidade e viés, além de ser computacionalmente eficiente.
Como escolher um modelo após realizar a validação cruzada
A validação cruzada é usada para avaliar o erro de previsão de um modelo. Isso pode nos ajudar a escolher entre dois ou mais modelos diferentes, destacando qual modelo tem o menor erro de previsão (com base em RMSE, R-quadrado, etc.).
Depois de usarmos a validação cruzada para selecionar o melhor modelo, usamos todos os dados disponíveis para ajustar o modelo escolhido. Não usamos as instâncias reais do modelo que treinamos durante a validação cruzada para nosso modelo final.
Por exemplo, podemos usar a validação cruzada de 5 vezes para determinar qual modelo é melhor usar entre dois modelos de regressão diferentes. No entanto, uma vez identificado qual modelo é melhor usar, usamos todos os dados para ajustar o modelo final. Ou seja, não esquecemos nenhuma das dobras na hora de construir o modelo final.