Aprendizado de Máquina - Regressão Polinomial

Regressão Polinomial

Se os seus pontos de dados não se adequam claramente ao ajuste linear (reta que passa pelos pontos de dados), a regressão polinomial pode ser a escolha ideal.

Como a regressão linear, a regressão polinomial usa a relação entre as variáveis x e y para encontrar o melhor método para desenhar a linha dos pontos de dados.


Princípio de funcionamento

O Python tem algumas maneiras de encontrar a relação entre os pontos de dados e desenhar a linha de regressão polinomial. Vamos mostrar como usar esses métodos em vez de fórmulas matemáticas.

No exemplo a seguir, registramos 18 carros passando por um posto de pedágio específico.

Já registramos a velocidade do carro e o tempo de passagem (horas).

O eixo x representa as horas do dia, e o eixo y representa a velocidade:

Exemplo

Primeiro, desenhar o gráfico de dispersão:

import matplotlib.pyplot as plt
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
plt.scatter(x, y)
plt.show()

Resultados:


Executar Exemplo

Exemplo

importar numpy e matplotlibDepois de isso, desenhar a linha de regressão polinomial:

import numpy
import matplotlib.pyplot as plt
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Resultados:


Executar Exemplo

Explicação do exemplo

Importar módulos necessários:

import numpy
import matplotlib.pyplot as plt

Criar arrays que representam os valores do eixo x e y:

x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]

O NumPy tem um método que nos permite construir um modelo polinomial:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Então, especifique o modo de exibição das linhas, começando no ponto 1 e terminando no ponto 22:

myline = numpy.linspace(1, 22, 100)

Desenhar o gráfico de dispersão original:

plt.scatter(x, y)

Desenhar a linha de regressão polinomial:

plt.plot(myline, mymodel(myline))

Exibir gráfico:

plt.show()

R-Squared

É importante saber quão bem os valores do eixo x e y estão relacionados, pois se não houver relação, a regressão polinomial não pode ser usada para prever nada.

A relação é medida por um valor chamado coeficiente de determinação (R²).

O valor do coeficiente de determinação (R²) varia de 0 a 1, onde 0 representa não correlação e 1 representa 100% de correlação.

O módulo Sklearn e Python calcularão esse valor para você, o que você precisa fazer é inserir os arrays x e y:

Exemplo

Como minha dados se ajustam na regressão polinomial?

import numpy
from sklearn.metrics import r2_score
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Executar Exemplo

Notas:O resultado 0,94 indica uma boa relação, que podemos usar na regressão polinomial para previsões futuras.

Prever valores futuros

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

Por exemplo: vamos tentar prever a velocidade do carro passando pelo posto de pedágio ao redor das 17h:

Para isso, precisamos do mesmo exemplo acima mymodel Array:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Exemplo

Prever a velocidade do veículo passando às 17h:

import numpy
from sklearn.metrics import r2_score
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)

Executar Exemplo

A velocidade de previsão do exemplo é 88,87, e também podemos vê-lo na figura:


Fitting ruim?

Vamos criar um exemplo no qual a regressão polinomial não é o melhor método para prever valores futuros.

Exemplo

Esses valores no eixo x e y causarão uma adaptação muito ruim da regressão polinomial:

import numpy
import matplotlib.pyplot as plt
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]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

Resultados:


Executar Exemplo

O que é o valor de r-squared?

Exemplo

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

import numpy
from sklearn.metrics import r2_score
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]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))

Executar Exemplo

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