Regressão multilinear com Julia
usando GLM, Estatísticas, MLDataUtils…
O que é regressão linear múltipla?
A regressão multilinear é um método estatístico para analisar a relação entre múltiplas variáveis independentes (preditores) e uma variável dependente (resposta).
Nesse caso, y é a variável dependente e as variáveis x são os preditores independentes .
O objetivo é modelar a relação entre as variáveis independentes e a variável dependente, para que possamos usar o modelo para fazer previsões sobre a resposta dados novos valores dos preditores.
A ideia básica por trás da regressão linear múltipla é estender a regressão linear simples (que possui apenas uma variável preditora) para variáveis preditoras múltiplas. Na regressão linear múltipla, a relação entre a variável dependente (y) e as variáveis independentes (x) é modelada usando uma equação linear:
y = β0 + β1x1 + β2x2 + … + βpxp
Vejamos um exemplo
using Plots, DataFrames, Random, GLM, MLDataUtils, CSV, Statistics, UrlDownload; pyplot()
Random.seed!(22)
url = "https://raw.githubusercontent.com/NicJC/SalesTrain/main/SalesTrain.csv"
data = urldownload(url) |> DataFrame
df = data[!,[:Customers,:Date,:DayOfWeek,:Store,:Sales,:Open,:Promo,:StateHoliday,:SchoolHoliday]]
describe(df)
Confira meu artigo sobre EDA:
Vou dividir os dados em um conjunto de teste/validação e um conjunto de treinamento.
A divisão de dados é uma etapa comum no aprendizado de máquina para dividir um conjunto de dados em duas ou mais partes: um conjunto de treinamento e um conjunto de teste (ou às vezes um conjunto de validação). O objetivo da divisão de dados é garantir que o modelo seja avaliado em um conjunto de dados diferente daquele usado para treinamento, para que você possa avaliar seu desempenho de generalização, ou seja, sua capacidade de fazer previsões precisas sobre dados não vistos.
Quero dividir o conjunto de dados pelos seguintes motivos:
- Overfitting: o overfitting ocorre quando um modelo é muito complexo e ajusta os dados de treinamento muito de perto, capturando ruído ou flutuações aleatórias nos dados em vez dos padrões subjacentes.
- Seleção de modelo: a divisão de dados também pode ser usada para comparar diferentes modelos e selecionar aquele que apresenta melhor desempenho no conjunto de teste.
- Estimativa de incerteza: ao avaliar o modelo em um conjunto de teste, você pode estimar a incerteza nas previsões do modelo e quantificar a variabilidade em seu desempenho devido a flutuações aleatórias nos dados.
train, test = splitobs(shuffleobs(df), at = 0.75)
Eu acesso os 2 conjuntos de dados diferentes para ver as primeiras 8 linhas:
first(train,8)
first(test,8)
Ajuste os modelos
Vou ajustar um modelo aditivo, um modelo de interação e um modelo onde removo a interceptação do modelo.
Interação
model = lm(@formula(Sales ~ Customers + Promo * SchoolHoliday), train)
Aditivo
model1= lm(@formula(Sales ~ Customers + StateHoliday + DayOfWeek + Store), train)
model2= lm(@formula(Sales ~ -1 + Customers + StateHoliday + DayOfWeek + Store), train)
Na regressão linear múltipla, você pode optar por incluir ou excluir o termo de interceptação β0no modelo, dependendo do contexto específico da análise e da questão de pesquisa que está tentando responder. O modelo 2 acima teve a interceptação removida.
Remover a interceptação significa que você está forçando a linha de regressão a passar pela origem e, portanto, está assumindo que o valor esperado da variável de resposta é zero quando todas as variáveis preditoras são iguais a zero.
Isso pode ser útil em alguns casos, se você padronizou ou centralizou as variáveis preditoras e deseja interpretar os coeficientes como alterações na variável de resposta para alterações de um desvio padrão nas variáveis preditoras.
Podemos obter coeficientes e erros padrão dos modelos:
coef(model)
stderror(model)
Podemos prever o modelo em relação ao conjunto de dados de teste:
pred1 = predict(model, test)
pred2 = predict(model1, test)
pred3 = predict(model2, test)
Podemos dar uma olhada no desempenho do modelo e calcular o erro quadrático médio , o erro médio absoluto , bem como a raiz do erro quadrático médio :
mse = mean((pred1 - test.Sales).^2)
mae = mean(abs.(pred1 - test.Sales))
rmse = sqrt(mse)
1578.6920913169515
mãe:
1116.0229620133257
mse:
2.4922687191866897e6
Essas são métricas de modelo que podem ser usadas para comparar diferentes modelos entre si. Normalmente, ajustaríamos alguns modelos diferentes, verificaríamos as métricas e escolheríamos um modelo adequado.
Também podemos olhar para o R ao quadrado, que basicamente dá a proporção de variação no resultado que é explicada pelas variáveis preditoras
r2(model)
O número acima é lido como 83,3049… % da saída é explicada pelos dados/preditores.
Parcelas
Traçamos os preditores (x) contra a resposta (y)
A regressão linear múltipla encontra a resposta relacionada a vários preditores, Y~x. No nosso caso, existem múltiplos valores de x! Precisamos incluir isso em uma variável x.
X = [train.Customers , train.StateHoliday , train.DayOfWeek , train.Store]
using StatsPlots
gr()
gr(size = (900, 950))
@df train scatter(X,pred2
, title="Scatter plot of Predictions"
, xlabel = "Sales"
, ylabel = "Prediction"
)
- Previsão 1 x Clientes
using StatsPlots
gr(size = (900, 950))
theme(:vibrant)
@df train scatter(:Customers,pred1,
title="Scatter plot of Customer vs Predictions"
, xlabel = "Customer"
, ylabel = "Prediction"
,marker = (:dot)
)
using StatsPlots
gr(size = (900, 950))
@df train scatter(:Customers,pred3
,title="Scatter plot of Customer vs Predictions - no intercept"
, xlabel = "Customer"
, ylabel = "Prediction"
)
using StatsPlots
gr(size = (900, 950))
@df train scatter(:Sales,pre2,
title="Scatter plot of Sales vs Predictions"
, xlabel = "Sales"
, ylabel = "Prediction"
)
Também poderíamos ter examinado os dados antes de fazer qualquer coisa, algum EDA (análise exploratória de dados) antes de ajustar os modelos. Na verdade, é assim que deve ser feito!
Espero que você tenha achado útil a implementação de Julia da regressão linear múltipla e que tenha gostado do meu artigo!
Confira meus artigos sobre regressão linear de mínimos quadrados :
ou
Variância residual em modelos lineares :
Variância residual em modelos linearesVamos nos conectar no Linkedin , ou github , ou me seguir para mais artigos sobre Julia, R, Python e estatísticas aplicadas!





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)