Regressão Linear no Aprendizado de Máquina

Regressão

Quando você tenta encontrar relações entre variáveis, é usado o termo "regressão" (regressão).

Nesta relação, usada em aprendizado de máquina e modelagem estatística, prevê os resultados de eventos futuros.

Regressão linear

A regressão linear desenha uma linha reta entre todos os pontos de dados com base nas relações entre os pontos de dados.

Esta linha pode ser usada para prever valores futuros.


Na aprendizado de máquina, prever o futuro é muito importante.

Princípio de funcionamento

O Python oferece algumas maneiras de encontrar relações entre pontos de dados e desenhar linhas de regressão linear. Vamos mostrar como usar esses métodos em vez de fórmulas matemáticas.

No exemplo a seguir, o eixo x representa a idade do carro e o eixo y representa a velocidade. Nós já registramos a idade e a velocidade de 13 carros passando pelo pedágio. Vamos ver se os dados que coletamos podem ser usados para regressão linear:

Exemplo

Primeiro desenhar o gráfico de dispersão:

import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()

Resultados:


Executar Exemplo

Exemplo

importar scipy e desenhar a linha de regressão linear:

import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

Resultados:


Executar Exemplo

Exemplo de explicação

Importar módulos necessários:

import matplotlib.pyplot as plt
from scipy import stats

Criar um array que representa os valores do eixo x e y:

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

Executar um método que retorna alguns valores importantes da regressão linear:

slope, intercept, r, p, std_err = stats.linregress(x, y)

Criar um que usa slope e intercept A função de valor retorna novos valores. Este novo valor representa a posição na qual o valor correspondente do eixo x será colocado no eixo y:

def myfunc(x):
  return slope * x + intercept

Executar cada valor do array x com a função. Isso produzirá um novo array, onde o eixo y terá novos valores:

mymodel = list(map(myfunc, x))

Desenhar gráfico de dispersão original:

plt.scatter(x, y)

Desenhar linha de regressão linear:

plt.plot(x, mymodel)

Mostrar gráfico:

plt.show()

Coeficiente de Determinação

É importante saber quão boa é a relação entre os valores do eixo x e os valores do eixo y, pois se não houver relação, a regressão linear não pode ser usada para prever nada.

A relação é medida por um valor chamado coeficiente de determinação (r-squared).

O valor do coeficiente de determinação (r^2) varia de 0 a 1, onde 0 indica não correlação e 1 indica 100% de correlação.

O módulo Python e Scipy calcularão esse valor para você, tudo o que você precisa fazer é fornecer os valores de x e y:

Exemplo

Como meu dados se ajustam na regressão linear?

from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)

Executar Exemplo

Notas:O resultado -0.76 indica que existe uma relação, mas não perfeita, mas indica que podemos usar a regressão linear nas previsões futuras.

Prever valores futuros

Agora, podemos usar as informações coletadas para prever valores futuros.

Por exemplo: vamos tentar prever a velocidade de um carro com 10 anos de história.

Para isso, precisamos do mesmo que no exemplo anterior myfunc() Função:

def myfunc(x):
  return slope * x + intercept

Exemplo

Prever a velocidade de um carro com 10 anos de idade:

from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
speed = myfunc(10)
print(speed)

Executar Exemplo

A previsão tem uma velocidade de 85.6, também podemos ler isso no gráfico:


Pior ajuste?

Vamos criar um exemplo em que a regressão linear não é o melhor método para prever valores futuros.

Exemplo

Esses valores para o eixo x e y resultarão em uma boa adaptação para a regressão linear:

import matplotlib.pyplot as plt
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

Resultados:


Executar Exemplo

e o valor de r-squared?

Exemplo

Você deve ter obtido um valor muito baixo de r-squared.

import numpy
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)

Executar Exemplo

Resultados: 0,013 indica uma relação muito ruim e nos diz que o conjunto de dados não é adequado para regressão linear.