9. Regressão Linear
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
| Tipo | Saída | Exemplo |
|---|---|---|
| Classificação | Discreta (rótulo) | Risco Alto / Baixo |
| Regressão | Contí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,19 | Correlação bem fraca |
| 0,20 – 0,39 | Fraca |
| 0,40 – 0,69 | Moderada |
| 0,70 – 0,89 | Forte |
| 0,90 – 1,00 | Muito 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étrica | Descriçã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 * x1b0(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*xnCada 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): calculab0e 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)