Implementando Regressão Linear Simples em Python

Entenda como funciona e como utilizar Python para criar sua própria Regressão Linear

Emanuel G de Souza
Data Hackers
8 min readJan 23, 2019

--

Após ficar bastante tempo sem escrever nada desde meu último texto, trago uma série de artigos a respeito de Ciência de Dados, mais especificamente, a respeito de Machine Learning.

Para aqueles que não conhecem o que é Machine Learning, ou Aprendizado de Máquina, recomendo este texto do Mateus Facure. Ao final, coloco algumas fontes que sempre consulto e que valem a pena dar uma conferida.

O primeiro post será sobre um dos modelos mais simples de Machine Learning: Regressão Linear, mais especificamente a Regressão Linear Simples. O objetivo é trazer um apanhado de conteúdo e fontes a respeito deste assunto tão vasto em uso e material na internet.

Introdução

Problemas de Regressão são problemas de previsão de dados. Regressão não é um conceito da área de Machine Learning em si, mas da Estatística. Os conceitos que serão abordados, podem ser aplicados tanto para a regressão simples quanto para múltipla. Aliás, como diferenciá-las? E o que é Regressão?

Regressão

É o ato de prever, a partir de dados históricos, dados no futuro. Em Estatística, o termo a se procurar é Análise de Regressão. Este, estuda a relação entre duas ou mais variáveis, em que uma depende de outra ou outras. Quando eu tenho uma relação de um para um, eu tenho uma Regressão Linear Simples (que vou chamar de RLS daqui para frente), e quando eu tenho uma relação de um para muitos, eu tenho uma Regressão Linear Múltipla (RLM ok?).

Quando aprendemos Estatística, seja na escola ou na faculdade, aprendemos um conceito chamado Correlação. Aprendemos que, eu posso ter uma variável dependendo positivamente ou negativamente em relação a alguma outra. Exemplo: eu posso ter a distância percorrida, em metros, em função da velocidade de um objeto, em metros por segundo. Claro que aqui haverá uma correlação perfeita. Mas imagine um outro exemplo: imagine encontrar uma correlação entre o preço de um imóvel e seu tamanho. Neste caso, podemos não ter uma correlação perfeita, mas podemos entender que há um padrão nos dados, e que um valor depende de outro ou outros. Isso é correlação. A Regressão, já é a descoberta dessa função, que expressa o padrão nos dados. Ou seja, quando eu desenvolvo um trabalho de Análise de Regressão, eu busco entender o padrão de um valor dependendo de outro ou outros, e assim encontro uma função que expressa esse padrão.

O que é uma Regressão Linear Simples?

RLS é basicamente uma função de primeiro grau. O objetivo do meu modelo de ML, é dado um conjunto de dados, entender o padrão dentro deles, que possa ser descrito por uma função de primeiro grau, com uma variável. Quando tratamos de mais de uma variável, estamos olhando para uma RLM.

Veja como é a famosa função de primeiro grau para uma variável e seu gráfico

Fonte: https://slideplayer.com.br/slide/7711727/

Antes de continuarmos, alguns conceitos importantes:

  • variável preditora: é a variável independente, que tem o poder de influenciar na variável que nós queremos encontrar. No exemplo do preço da casa, a variável preditora pode ser o seu tamanho, a quantidade de quartos ou alguma outra informação. Quem vai nos dizer? Os dados que dispomos. Na equação acima, ela será o valor de a.
  • variável alvo ou dependente: é a variável que queremos prever. No nosso exemplo, será o preço da casa. Na equação acima, ela terá como valor o resultado da função para cada valor de y.

Os valores de a e b não são conhecidos por nós quando construímos o modelo. São valores que o algorítimo irá descobrir para fazer as predições. Eles possuem um nome especial: chamam-se coeficientes. Vejamos como calcular tais valores.

Acesse o post e saiba com contribuir para o Data Hackers

Como calcular os coeficientes numa função de primeiro grau?

Os algoritmos de Regressão Linear, em sua maioria, utilizam um método para calcular tais coeficientes: o nome dele é Método dos Mínimos Quadrados (MMQ), ou Métodos dos Quadrados Ordinários (MQO) ou ainda, em inglês, Ordinary Least Squares (OLS). Tal método, visa buscar o melhor valor que os coeficientes possam atingir, de maneira que a diferença entre o valor predito pela função e o real, sejam os menores.

Avaliando o Modelo de Regressão Linear

Há alguns fatores que precisam ser considerados na análise do meu modelo, para saber se está tendo uma boa performance. Aqui vão algumas dicas que aprendi no curso de ML da Data Science Academy.

  • Teste F de Significância global: afirma se ao menos uma variável do meu modelo está relacionada com a variável alvo. Para isso, o valor-p desta estatística precisa ser menor que 0.05
  • Teste de Significância individuais ou p-values dos coeficientes: diz o quanto das variáveis preditoras explicam a variável alvo. A métrica padrão é o p-value ser menor que 0.05.
  • Coeficiente R²: diz o quanto o meu modelo explica seus resultados. É um valor entre 0 e 1. Quanto mais próximo de 1, melhor.

A seguir, explico cálculo por trás do R².

Entendendo o cálculo do R²

O R², também chamado de Coeficiente de Determinação, diz o quanto meu modelo está prevendo corretamente. O cálculo dele, envolve três medidas:

  • Soma Total dos Quadrados (STQ): mostra a variação de y em torno da própria média. É o somatório das diferenças entre o valor alvo real e sua média elevado ao quadrado.
y é o valor real, y traço é a média
  • Soma dos Quadrados dos Resíduos (SQU): variação de Y que não é explicada pelo modelo elaborado. É o somatório das diferenças entre o valor predito e o valor real elevados ao quadrado.
y é o valor real, y com chapéu é o valor predito
  • Soma dos Quadrados de Regressão (SQR): oferece a variação de Y considerando as variáveis X utilizadas no modelo. É a diferença entre o valor de SQT e SQU. Portanto: SQR = SQT — SQU

O valor de R² é o próprio SQR dividido pelo SQT, ou seja, é divisão da variação explicada pelo variação total dos dados.

Uma pausa para uma questão interessante, que no vídeo da Univesp é explicado: porque tais cálculos elevam os valores das diferenças ao quadrado? Porque podemos ter diferenças positivas ou negativas que poderiam se anular. Elevar ao quadrado, faz com que tais casos não ocorram, já que um número negativo elevado ao quadrado, vira um número positivo.

Exemplo prático usando scikit-learn e statsmodels

Primeiramente, irei fazer uma análise do nosso modelo com o statsmodels, mostrando alguns números interessante, depois iremos fazer a mesma coisa, só que com o scikit-learn.

Antes de mais nada, quem é o scikit-learn e o statsmodels? O primeiro é a principal biblioteca de ML em Python. Possui implementação de inúmeros algoritmos de ML, desde de algoritmos de Regressão e Classificação como também Redes Neurais. Possui vasta documentação, que pode ser conferida aqui.

Já o statsmodels, é focado em ser uma ferramenta estatística, like R, para Python. Na minha opinião, o uso dele é recomendado, quando estamos explorando modelos de ML para a nossa aplicação, pois ele fornece algumas estatísticas bastante interessante. Aliás, usarei ele agora para termos tais estatísticas.

Antes, vamos importar as bibliotecas que iremos usar e dar uma olhada nos dados que iremos trabalhar

# importando as libs
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
# fonte: # fonte: http://www.portalaction.com.br/analise-de-regressao/12-estimacao-dos-parametros-do-modelo# criando variáveis que serão usadas daqui para frente# variável preditora
X = np.array([ 220, 220, 220, 220, 220, 225, 225, 225, 225, 225, 230, 230, 230, 230, 230, 235, 235, 235, 235, 235 ])
# variável alvo
y = np.array([ 137, 137, 137, 136, 135, 135, 133, 132, 133, 133, 128, 124, 126, 129, 126, 122, 122, 122, 119, 122 ])

Visualizando estatísticas do modelo usando statsmodels

Primeiramente, o que seriam essas estatísticas? Como dito anteriormente, ao construímos nosso modelo, precisamos nos ater a algumas informações, como o R², os p-values para cada coeficiente e Estatística-F. Tais informações, são os dados estatísticos do modelo.

# é necessário adicionar uma constante a matriz X
X_sm = sm.add_constant(X)
# OLS vem de Ordinary Least Squares e o método fit irá treinar o modelo
results = sm.OLS(y, X_sm).fit()
# mostrando as estatísticas do modelo
results.summary()
# mostrando as previsões para o mesmo conjunto passado
results.predict(X_sm)

A imagem a seguir com as estatísticas

O que nos interessa aqui são o R-squared, o F-statistic juntamente com Prob (F-statistic), a coluna coef (os coeficientes) e a coluna P > [t] , que são os p-values para cada coeficiente.

Escrevendo o modelo com o scikit-learn

df = pd.DataFrame()
df['x'] = X
df['y'] = y
# passando os valores de x e y como Dataframes
x_v = df[['x']]
y_v = df[['y']]
# criando e treinando o modelo
model = LinearRegression()
model.fit(x_v, y_v)
# para visualizar os coeficientes encontrados
model.coef_
# para visualizar o R²
model.score()
# mostrando as previsões para o mesmo conjunto passado
model.predict(X_sm)

A seguir, deixo uma implementação simples da Regressão Linear, tendo como base a classe do scikit.

Escrevendo nossa própria classe

Algumas considerações:

  • Foi implementado mais de um método, para o cálculo de alguns dados que passei anteriormente.
  • Para o cálculo dos coeficientes, foi usado o MMQ.
  • O método fit e predict espera um array do numpy.

Espero que o texto tenha sido bastante útil e esclarecedor. Aguardem os próximos!

Referências do texto

Referências que recomendo

Antes de partir, não deixe de dar aquele clap maroto. Ele é um excelente feedback para saber se o texto foi relevante para você, e impulsiona a trazer mais conteúdos. Se tiver alguma crítica a trazer, sinta-se a vontade. Até a próxima!

Sou Emanuel, Desenvolvedor na decision6 e entusiasta de Inteligência Artificial. Maluco por séries e filmes. Amo programação e tudo que a cerca. Conheça meu trabalho no meu site emanuelgsouza.dev e em meu Github. May the force be with you!

--

--