A Regressão Linear é um algoritmo de aprendizado supervisionado usado em tarefas de regressão — quando a saída é um valor contínuo (número), e não uma categoria discreta como na classificação.

Exemplos práticos:

  • Plano de saúde: idade (X) → preço do plano (Y).
  • Cartão de crédito: gasto e histórico (X) → limite do cartão (Y).
  • Imóveis: metragem e características (X) → preço de venda (Y).

Classificação vs regressão

TipoSaídaExemplo
ClassificaçãoDiscreta (rótulo)Risco Alto / Baixo
RegressãoContínua (número)Preço R$ 1.850,00

Em ambos os casos há entradas (X) e uma saída conhecida (y) no treinamento.

Covariância e correlação

Antes de modelar, é importante medir a relação entre as variáveis:

  • Covariância > 0: variáveis se movem juntas (ex.: maior metragem → maior preço).
  • Covariância = 0: variáveis independentes.
  • Covariância < 0: variáveis se movem em direções opostas.

O coeficiente de correlação normaliza a covariância pelos desvios padrão de X e Y, resultando em um valor entre -1 e 1:

Valor |Cr|Interpretação
0,00 – 0,19Correlação bem fraca
0,20 – 0,39Fraca
0,40 – 0,69Moderada
0,70 – 0,89Forte
0,90 – 1,00Muito forte

No exemplo do plano de saúde, np.corrcoef(idade, preco) retorna ~0,93 — correlação muito forte.

Medidas de erro

O modelo gera uma reta de melhor ajuste, mas cada ponto real pode ficar acima ou abaixo da previsão (erro). As três métricas principais são:

MétricaDescrição
MAE (Mean Absolute Error)Média do valor absoluto da diferença entre real e previsto. Mais simples de interpretar.
MSE (Mean Squared Error)Média dos erros ao quadrado. Penaliza erros grandes.
RMSE (Root MSE)Raiz do MSE. Mesma unidade da variável alvo.

Quanto menor MAE, MSE e RMSE, melhor o modelo.

Regressão linear simples

Uma variável previsora (X) e uma variável alvo (Y):

Y = b0 + b1 * x1
  • b0 (intercept_): constante — ponto onde a reta cruza o eixo Y.
  • b1 (coef_): coeficiente angular — inclinação da reta.
  • x1: atributo previsor.
  • Y: valor previsto.

O treinamento encontra b0 e b1 que minimizam o erro nos dados de treino.

Regressão linear múltipla

Várias variáveis previsoras:

Y = b0 + b1*x1 + b2*x2 + ... + bn*xn

Cada atributo recebe um coeficiente próprio. O score() mede o quanto o modelo explica a variância dos dados (R²).

Implementação em Python (Scikit-learn)

  • Classe: LinearRegression
  • Treinamento (fit): calcula b0 e os coeficientes.
  • Previsão (predict): estima valores para novas entradas.
  • Avaliação: score(), mean_absolute_error, mean_squared_error.

Talk is cheap, show me the code: Bases utilizadas nesta aula (disponíveis no Google Drive): plano_saude.csv · house_prices.csv

Roteiro para a aula de Aprendizado Supervisionado - Regressão Linear
======================================PARTE I ============================================
1 – Executar a importação das bibliotecas (pode ser no mesmo arquivo da semana passada):

#biblioteca para gerar gráficos dinâmicos
!pip install plotly --upgrade
#pandas é uma biblioteca que trabalha com a importação de arquivos .csv
import pandas as pd
#numpy é uma biblioteca para a realização de operações em arrays
import numpy as np
#seaborn é uma biblioteca para vizualização de gráficos
import seaborn as sb
#matplotlib é também uma biblioteca para a geração de gráficos
import matplotlib.pyplot as plt
import plotly.express as px

2 - Base plano de saúde (importar o arquivo .csv disponibilizado pelo professor):

base_plano_saude = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/Arquivos .csv/plano_saude.csv')

3 - Divisão de atributos previsores (X) e explanatório (Y)
X_plano_saude = base_plano_saude.iloc[:, 0].values
Y_plano_saude = base_plano_saude.iloc[:, 1].values

#Calcular o coeficiente de correlação # 0.93 indica forte correlação
np.corrcoef(X_plano_saude, Y_plano_saude)

#poderia ser feito o reshape(-1, 1) para deixar no formato de matriz bidimensional
X_plano_saude = base_plano_saude.iloc[:, 0:1].values

4 - Importar a classe para trabalhar com Regressão Linear

#importar a classe para trabalhar com regressão linear
from sklearn.linear_model import LinearRegression

#instanciar
regressorPlano = LinearRegression()

5 - Treinamento e previsão
regressorPlano.fit(X_plano_saude, Y_plano_saude)

#b0 --> inicio da linha (constante)
regressorPlano.intercept_

#b1 --> coeficiente de correlção da linha
regressorPlano.coef_

previsoes = regressorPlano.predict(X_plano_saude)#foram passadas cada valor de idade

6 - Montagem do gráfico
#Gráfico para mostrar as previsões
#scatter = gráfico de dispersão
grafico = px.scatter(x = X_plano_saude.ravel(), y = Y_plano_saude)
grafico.add_scatter(x = X_plano_saude.ravel(), y = previsoes, name = 'Regressão Linear')
grafico.show()

regressorPlano.intercept_ + regressorPlano.coef_ * 18

regressorPlano.predict([[18]])

regressorPlano.score(X_plano_saude, Y_plano_saude)


===================================================PARTE II - REGRESSÃO LINEAR SIMPLES - BASE PREÇOS CASA ============================================
1 - Importar a base 
base_precoCasa = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/Arquivos .csv/house_prices.csv')

2 - Atributos previsores e classe
X_base_precoCasa = base_precoCasa.iloc[:, 5:6].values
Y_base_precoCasa = base_precoCasa.iloc[:, 2].values

3 - possíveis correlações entre os atributos
base_precoCasa.corr(numeric_only=True)

figura = plt.figure(figsize=(20,20))
sb.heatmap(base_precoCasa.corr(numeric_only=True), annot=True);

4 - Divisão de treinamento e teste
#divisao da base em dados de treinamento e teste
from sklearn.model_selection import train_test_split

X_base_precoCasa_treinamento, X_base_precoCasa_teste, Y_base_precoCasa_treinamento, Y_base_precoCasa_teste = train_test_split(X_base_precoCasa, Y_base_precoCasa, test_size = 0.25, random_state = 0)  


5 - Salvando em formato .pkl


6 - Importando a classe e instanciando
#importando a classe de regrassão linear
from sklearn.linear_model import LinearRegression

#instanciação
regressorPrecoCasa = LinearRegression()

7 - Treinamento e previsão
#treinamento
regressorPrecoCasa.fit(X_base_precoCasa_treinamento, Y_base_precoCasa_treinamento)

#b0
regressorPrecoCasa.intercept_

#b1
regressorPrecoCasa.coef_

regressorPrecoCasa.score(X_base_precoCasa_treinamento, Y_base_precoCasa_treinamento)

regressorPrecoCasa.score(X_base_precoCasa_teste, Y_base_precoCasa_teste)


previsoes = regressorPrecoCasa.predict(X_base_precoCasa_teste)

8 - Gráfico
#gerar o gráfico
grafico = px.scatter(x = X_base_precoCasa_teste.ravel(), y = Y_base_precoCasa_teste)
grafico.add_scatter(x = X_base_precoCasa_teste.ravel(), y = previsoes, name = 'Regressão Linear')
grafico.show()


9 - Cálculo do erro
#calcular a diferença entre os valores
abs(Y_base_precoCasa_teste - previsoes).mean()

#o mesmo cálculo, com funções do sklearn
from sklearn.metrics import mean_absolute_error, mean_squared_error

mean_absolute_error(Y_base_precoCasa_teste, previsoes)

mean_squared_error(Y_base_precoCasa_teste, previsoes)

np.sqrt(mean_squared_error(Y_base_precoCasa_teste, previsoes))



===================================================PARTE III - REGRESSÃO LINEAR MÚLTIPLA - BASE PREÇOS CASA ============================================
1 - Dividir entre os atributos previsores e a classe explanatória (Y)
X_preco_casa = base_precoCasa.iloc[:, 3:19].values
Y_preco_casa = base_precoCasa.iloc[:, 2].values

2 - Dividir em base de dados de treinamento e teste
from sklearn.model_selection import train_test_split

x_preco_casa_treinamento, x_preco_casa_teste, y_preco_casa_treinamento, y_preco_casa_teste = train_test_split(X_preco_casa, Y_preco_casa, test_size = 0.25, random_state = 0)
#

3 - treinamento e previsão
regressorMultiplo = LinearRegression()

regressorMultiplo.fit(x_preco_casa_treinamento, y_preco_casa_treinamento)

#bo ou a (y = a + bx)
regressorMultiplo.intercept_

#um coeficiente para cada atributo
regressorMultiplo.coef_

regressorMultiplo.score(x_preco_casa_treinamento, y_preco_casa_treinamento)

regressorMultiplo.score(x_preco_casa_teste, y_preco_casa_teste)

previsoes = regressorMultiplo.predict(x_preco_casa_teste)

4 - verificando erros
from sklearn.metrics import mean_absolute_error, mean_squared_error
mean_absolute_error(y_preco_casa_teste, previsoes)

mean_squared_error(y_preco_casa_teste, previsoes)