Questão 1) Disserte sobre o processo de treinamento de modelo de regressão em aprendizagem de máquina. Explique cada um dos passos considerando a imagem que segue:
Esquema de treinamento de um modelo de aprendizagem de máquina usando validação cruzada.
Resposta: O procedimento de k-fold cross-validation, como ilustrado na imagem em 4-fold, é uma técnica fundamental em aprendizado de máquina, especialmente útil para a obtenção de uma avaliação precisa do desempenho preditivo de um modelo. Ao treinar e validar o modelo em diferentes partes do conjunto de dados, essa abordagem oferece uma estimativa mais confiável do risco preditivo \(R(g)\), o que é essencial para garantir que o modelo generalize bem para novos dados. Não esqueça de explicar:
Resposta:Validação Cruzada é uma técnica utilizada para avaliar o desempenho de um modelo de aprendizado de máquina e sua capacidade de generalização, ou seja, sua habilidade de fazer previsões precisas em dados novos que não foram usados durante o treinamento. A técnica envolve a divisão dos dados em partes, onde uma dessas partes é usada para validação, enquanto as demais são usadas para treinamento do modelo. O Leave-One-Out Cross-Validation (LOOCV) e o k-Fold Cross-Validation são métodos de validação cruzada usados para avaliar o desempenho de um modelo de aprendizado de máquina, e diferem principalmente na forma como dividem os dados e no custo computacional.
No LOOCV, o conjunto de dados é dividido em n partes, onde n é o número total de observações. Cada uma dessas partes é uma única observação, que é usada como conjunto de validação, enquanto as n−1 observações restantes são usadas para treinar o modelo. Assim, o modelo é treinado n vezes, com cada iteração utilizando uma observação diferente para validação. Isso proporciona uma avaliação muito precisa do desempenho do modelo, mas pode ser extremamente caro em termos computacionais, especialmente para grandes conjuntos de dados.
No k-Fold Cross-Validation, o conjunto de dados é dividido em k folds de tamanho aproximadamente igual. Em cada uma das k iterações, um fold é usado como conjunto de validação, enquanto os folds restantes são usados para treinamento do modelo. O modelo é treinado k vezes. Isso oferece uma boa precisão e eficiência, já que a média dos desempenhos em cada fold fornece uma estimativa confiável do modelo, e um menor custo computacional em comparação ao LOOCV.
Resposta: O risco preditivo é uma métrica que indica o erro esperado ao aplicar o modelo em dados que não foram usados durante o treinamento, sendo usualmente calculado pelo Erro Quadrático Médio (EQM).
Resposta: Ele fornece uma medida imparcial da performance do modelo, sem influências dos dados usados no treinamento e validação. Isso ajuda a prevenir o overfitting, garantindo que o modelo não esteja apenas ajustado aos dados específicos de treinamento, mas que também funcione para novos dados. Além disso, a base de dados de teste oferece uma visão precisa de como o modelo se comportará em situações reais, proporcionando uma estimativa realista de sua eficácia. Ela também valida a capacidade do modelo de fazer previsões precisas. Após ajustes e validação, a base de dados de teste é usada para uma avaliação final, assegurando que o modelo seja robusto e confiável.
Questão 2) Considere o modelo de regressão real definido pela equação abaixo:
\[r(x) = 2.76 + 0.5x_1-0.75x_2 + 0.5x_3 - 0.75x_4 + x_5 +\sum_{i=6}^{30}0x_i + \varepsilon \]
em que \(\varepsilon\) ~ \(N(0,0.5^2)\) e \(x_i\) ~ \(N(0,1)\), \(\forall_i\)=1,…,30.
Treine um modelo de regressão linear múltipla e estime o risco preditivo do modelo estimado.
Dicas:
Resposta:
set.seed(0) #Fixando uma semente
# Número de observações
n2 = 1000
# Gerar variáveis independentes x1, x2, ..., x30
X2 = matrix(rnorm(n2 * 30), n2, 30)
# Adicionando uma coluna de intercepto 1's ao X
X2 = cbind(1, X2)
# Coeficientes do modelo
coefficients2 = c(2.76, 0.5, -0.75, 0.5, -0.75, 1.0, rep(0, 25))
# Gerando o erro
epsilon2 = rnorm(n2, mean = 0, sd = 0.5)
# Gerarando a variável dependente r(x)
y2 = X2 %*% coefficients2 + epsilon2
# Criando um DataFrame
df2 = as.data.frame(X2)
names(df2) = paste0("x", 0:30)
df2$y2 = y2
# Realizando o hold-out
dados2 = rsample::initial_split(df2, prop = 0.8, strata = "y2")
# Dividindo os dados em treinamento e teste
treino2 = rsample::training(dados2)
teste2 = rsample::testing(dados2)
# Ajustando o modelo usando o conjunto de treinamento
modelo2 = lm(y2 ~ ., data = treino2)
# Fazer as previsões no conjunto de teste
ypred2 = predict(modelo2, newdata = teste2)
# Calculando o EQM
eqm2 = mean((teste2$y2 - ypred2)^2)
# Calcular o risco preditivo
riscopred2 = sqrt(eqm2)
riscopred2
## [1] 0.5140222
Questão 3) Considere o modelo de regressão real dado por:
\[r(x)=1.6 + 5sin(x) - 8x^2 + \varepsilon \] em que, \(x\) ~ \(U(0,20)\) e \(\varepsilon\) ~ \(N(0,1)\). Treine modelos de regressão polinomial com o grau do do polinômio p=1,2,3 e estime o risco preditivo de cada um dos modelos.
Dicas:
Interprete o resultado obtido.
Resposta:
set.seed(0) # Fixando a semente
n3 = 10000 # Número de observações
# Gerando x ~ U(0,20)
x3 = runif(n3, min = 0, max = 20)
# Gerando ε ~ N(0, 1)
epsilon3 = rnorm(n3, mean = 0, sd = 1)
# Calculando y de acordo com a função r(x)
y3 = 1.6 + 5 * sin(x3) - 8 * x3^2 + epsilon3
# Criação do DataFrame
df3 = data.frame(x3 = x3, y3 = y3)
# Realizando o hold-out
dados3 = rsample::initial_split(df3, prop = 0.8)
# Dividindo os dados3 em treinamento e teste
treino3 = rsample::training(dados3)
teste3 = rsample::testing(dados3)
# Função para calcular o RMSE
calcular_rmse = function(modelo, teste3) {
y_pred = predict(modelo, newdata = teste3)
eqm3 = mean((teste3$y3 - y_pred)^2)
return(sqrt(eqm3))
}
# Ajustar e avaliar modelos de grau p = 1, 2, 3
graus = 1:3
resultados3 = data.frame(Grau = graus, RMSE = NA)
for (p in graus) {
# Ajustar o modelo polinomial de grau p
formula = as.formula(paste("y3 ~ poly(x3, ", p, ")", sep = ""))
modelo = lm(formula, data = treino3)
# Estimação do risco preditivo
rmse3 = calcular_rmse(modelo, teste3)
resultados3[resultados3$Grau == p, "RMSE"] = rmse3
}
resultados3
## Grau RMSE
## 1 1 242.191735
## 2 2 3.517754
## 3 3 3.505617
Questão 4) Considere a base de dados referente à vendas de sorvetes. A base de dados contém as seguintes variáveis:
1.Temperatura: Temperatura média do dia;
2.vendas:quantidade de sorvetes vendidos no dia.
Estamos interessados em estimar as vendas de sorvetes dado a temperatura. Dessa forma, considere o número de vendas como sendo o label (variável \(y\)) e as temperaturas como sendo as features (variáveis \(x\)).
Considerando a base de dados fornecida, treine um modelo de regressão polinomial com grau p=1,2,3,4,5 e estime o risco preditivo do modelo selecionado. Além disso, construa um gráfico do modelo selecionado ajustado aos dados.
Dicas:
Resposta:
# Carregar pacotes necessários
library(dplyr)
library(rsample)
library(ggplot2)
# Carregar a base de dados
dados= read.csv("C:/Users/gleyc/Downloads/archive (1)/Ice_cream selling data.csv")
# Renomear as variáveis
dados4 = dados %>%
rename(
temperatura = Temperature...C.,
vendas = Ice.Cream.Sales..units.
)
# Dividir os dados em treino e teste
set.seed(0) # Para reprodutibilidade
dados_split = initial_split(dados4, prop = 0.8)
treino = training(dados_split)
teste = testing(dados_split)
# Função para ajustar o modelo polinomial e calcular RMSE
ajustar_e_avaliar_modelo = function(dados_treino, grau, dados_teste) {
# Criar fórmula do modelo
formula_modelo = as.formula(paste("vendas ~ poly(temperatura, ", grau, ", raw=TRUE)", sep = ""))
# Ajustar o modelo
modelo = lm(formula_modelo, data = dados_treino)
# Fazer previsões
previsoes = predict(modelo, newdata = dados_teste)
# Calcular o MSE
mse = mean((dados_teste$vendas - previsoes)^2)
# Calcular o RMSE
rmse = sqrt(mse)
return(rmse)
}
# Grau do polinômio a ser avaliado
graus = 1:5
resultados = data.frame(Grau = graus, RMSE = NA)
for (p in graus) {
# Ajustar e avaliar o modelo
rmse = ajustar_e_avaliar_modelo(treino, p, teste)
resultados[resultados$Grau == p, "RMSE"] = rmse
}
# Resultados do RMSE
resultados
## Grau RMSE
## 1 1 10.511022
## 2 2 2.933840
## 3 3 3.002500
## 4 4 3.258332
## 5 5 3.205414
# Ajustar o modelo de grau escolhido (o de menor RMSE) para visualização
melhor_grau = resultados$Grau[which.min(resultados$RMSE)]
# Criar fórmula do modelo para o melhor grau
formula_melhor_modelo = as.formula(paste("vendas ~ poly(temperatura, ", melhor_grau, ", raw=TRUE)", sep = ""))
# Ajustar o modelo com o melhor grau
modelo_melhor = lm(formula_melhor_modelo, data = treino)
# Visualizar o ajuste do modelo
ggplot(data = dados4, aes(x = temperatura, y = vendas)) +
geom_point() +
stat_smooth(method = "lm", formula = formula_melhor_modelo, color = "blue") +
labs(title = paste("Ajuste do Modelo Polinomial de Grau", melhor_grau),
x = "Temperatura (°C)",
y = "Vendas de Sorvetes")
Baseado no RMSE, o modelo polinomial de grau 2 é o mais adequado, pois proporciona o menor erro de previsão.
Questão 5) Considere a regressão real dada por:
\[r(x)= 45 * tanh(\frac{x}{1.9}{-7}) + 57 + \varepsilon\]
em que \(x\) são observações de uma variável aleatória \(X\) ~ \(U(0,18)\) e \(\varepsilon\) ~ \(N(0,4)\). Considerando um conjunto de dados de 10 mil observações, treine um modelo de regressão polonomial com grau p=1,…,15. Estime o risco preditivo do melhor modelo. Construa um gráfico do melhor modelo ajustado aos dados de teste, i.e, \(y\) versus \(\hat{y}\) do conjunto de teste.
Resposta:
set.seed(0) # Fixando a
# Carregar pacotes necessários
library(dplyr)
library(rsample)
library(ggplot2)
# Gerar os dados
n = 10000 # Número de observações
sigma = 2 # Desvio padrão do erro (raiz quadrada da variância 4)
x = runif(n, 0, 18) # x ~ U(0, 18)
epsilon = rnorm(n, mean = 0, sd = sigma) # Erro aleatório
y = 45 * tanh((x / 1.9) - 7) + 57 + epsilon # Gerar variável resposta
# Criar dataframe
dados = data.frame(x = x, y = y)
# Dividir os dados em treino e teste
set.seed(123) # Para reprodutibilidade
dados_split = initial_split(dados, prop = 0.8)
treino = training(dados_split)
teste = testing(dados_split)
# Função para ajustar o modelo polinomial e calcular RMSE
ajustar_e_avaliar_modelo = function(dados_treino, grau, dados_teste) {
# Criar fórmula do modelo
formula_modelo = as.formula(paste("y ~ poly(x, ", grau, ", raw=TRUE)", sep = ""))
# Ajustar o modelo
modelo = lm(formula_modelo, data = dados_treino)
# Fazer previsões
previsoes = predict(modelo, newdata = dados_teste)
# Calcular o MSE
mse = mean((dados_teste$y - previsoes)^2)
# Calcular o RMSE
rmse = sqrt(mse)
return(rmse)
}
# Grau do polinômio a ser avaliado
graus = 1:15
resultados = data.frame(Grau = graus, RMSE = NA)
for (p in graus) {
# Ajustar e avaliar o modelo
rmse = ajustar_e_avaliar_modelo(treino, p, teste)
resultados[resultados$Grau == p, "RMSE"] = rmse
}
# Exibir resultados
print(resultados)
## Grau RMSE
## 1 1 17.593831
## 2 2 7.663284
## 3 3 7.609732
## 4 4 5.059295
## 5 5 3.108056
## 6 6 3.107820
## 7 7 2.478697
## 8 8 2.166167
## 9 9 2.168909
## 10 10 2.025225
## 11 11 1.992083
## 12 12 1.995474
## 13 13 1.995474
## 14 14 1.982476
## 15 15 1.982476
# Identificar o grau do modelo com menor RMSE
melhor_grau = resultados$Grau[which.min(resultados$RMSE)]
# Criar fórmula do modelo para o melhor grau
formula_melhor_modelo = as.formula(paste("y ~ poly(x, ", melhor_grau, ", raw=TRUE)", sep = ""))
# Ajustar o modelo com o melhor grau
modelo_melhor = lm(formula_melhor_modelo, data = treino)
# Fazer previsões no conjunto de teste
previsoes_test = predict(modelo_melhor, newdata = teste)
# Criar gráfico de y versus \hat{y}
ggplot(data = teste, aes(x = y, y = previsoes_test)) +
geom_point() +
geom_abline(intercept = 0, slope = 1, color = "red") +
labs(title = paste("Gráfico de y versus y estimado para o Modelo Polinomial de Grau", melhor_grau),
x = "Valores Observados (y)",
y = "Valores Estimados (y)") +
theme_minimal()