Construindo um modelo de Regressão Linear do zero
Tutorial de regressão linear
- Dados
- Como você fará no dia a dia
- Implementando (e entendendo) um modelo de regressão linear
- Step (passo)
- Repetir n-vezes
!pip install -Uqqq matplotlib
num_vendedores = [8, 20, 26, 2, 8, 20, 22, 12, 6, 16]
num_de_vendas = [88, 169, 202, 58, 118, 157, 149, 117, 105, 137]
import matplotlib.pyplot as plt
plt.scatter(num_vendedores, num_de_vendas);
import numpy as np
from sklearn.linear_model import LinearRegression
x = np.array(num_vendedores)
y = np.array(num_de_vendas)
reg = LinearRegression().fit(x.reshape((-1,1)), y)
a, b = reg.coef_.item(), reg.intercept_
a, b
a, b = np.polyfit(x, y, 1)
a, b
plt.scatter(num_vendedores, num_de_vendas);
plt.axline((0, b), slope = a, color = 'red', linestyle = '--');
nova_loja_num_vendedores = 14
nova_loja_venda_esperada = a * nova_loja_num_vendedores + b
nova_loja_venda_esperada
plt.scatter(num_vendedores, num_de_vendas);
plt.axline((0, b), slope = a, color = 'red', linestyle = '--');
plt.scatter(nova_loja_num_vendedores, nova_loja_venda_esperada, color = 'red');
import torch
x = torch.tensor(num_vendedores)
y = torch.tensor(num_de_vendas)
a = torch.randn(1).requires_grad_()
b = torch.randn(1).requires_grad_()
a, b
y_pred = a * x + b
y_pred
plt.scatter(x, y);
plt.scatter(x, y_pred.detach(), color = 'red');
plt.axline((0, b.item()), slope = a.item(), color = 'red', linestyle = '--');
erro = y - y_pred
erro
rmse = (erro**2).mean()**0.5
rmse
rmse.backward()
a.grad, b.grad
a.data = a.data - a.grad
b.data = b.data - b.grad
a.grad.zero_()
b.grad.zero_();
historico_rmse = []
## Hiperparâmetros
n_epoch = 10000
lr = 0.05
## Inicialização
a = torch.randn(1).requires_grad_()
b = torch.randn(1).requires_grad_()
## Otimização
for epoch in range(n_epoch):
## Predição
y_pred = a * x + b
## Calcula perda (loss)
erro = y - y_pred
rmse = (erro**2).mean()**0.5
if epoch % 1000 == 0:
print(f'RMSE: {rmse.item()}')
historico_rmse.append(rmse.item())
## Calcula gradiente
rmse.backward()
## Step
a.data = a.data - lr * a.grad
b.data = b.data - lr * b.grad
a.grad.zero_()
b.grad.zero_()
plt.scatter(x, y);
plt.axline((0, b.item()), slope = a.item(), color = 'red', linestyle = '--');
a, b
plt.plot(historico_rmse[:100]);