Polynomial regression w uczeniu maszynowym

多项式回归(Polynomial Regression)

Jeśli Twoje punkty danych显然不适合线性回归(穿过数据点之间的直线),那么多项式回归可能是理想的选择。

Jak liniowa regresja, wielokrotna regresja używa związku między zmiennymi x i y, aby znaleźć najlepszy sposób rysowania linii danych punktów.


Działanie

Python ma kilka metod znalezienia związku między punktami danych i rysowania linii wielokrotnej regresji. Pokażemy Ci, jak używać tych metod zamiast wzorów matematycznych.

W poniższym przykładzie zarejestrowaliśmy 18 aut przejeżdżających przez określoną stację poboru opłat.

Zarejestrowaliśmy prędkość aut i czas przejazdu (godziny).

Oś x reprezentuje godzinę dnia, a oś y prędkość:

Przykład

Najpierw narysuj wykres punktów:

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()

Wynik:


Uruchomienie przykładu

Przykład

załaduj numpy i matplotlibi następnie narysuj linię wielokrotnej regresji:

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()

Wynik:


Uruchomienie przykładu

Przykład wyjaśnienie

Załaduj wymagane moduły:

import numpy
import matplotlib.pyplot as plt

Stwórz tablicę reprezentującą wartości osi x i 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]

NumPy ma metodę, która pozwala nam tworzyć modele wielokrotne:

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

Następnie określ sposób wyświetlania wierszy, zaczynamy od pozycji 1 do pozycji 22:

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

Narysuj oryginalny wykres punktów:

plt.scatter(x, y)

Narysuj linię wielokrotnej regresji:

plt.plot(myline, mymodel(myline))

Pokazuj wykres:

plt.show()

R-Squared

Ważne jest, aby wiedzieć, jak dobrze są ze sobą związane wartości osi x i y, ponieważ bez związku wielokrotna regresja nie może być użyta do przewidywania żadnych wartości.

Związek ten jest mierzony wartością nazywaną r kwadrat (r-squared).

Zakres wartości r kwadratowych wynosi od 0 do 1, gdzie 0 oznacza brak korelacji, a 1 oznacza 100% korelacji.

Python i moduł Sklearn obliczą dla Ciebie tę wartość, wszystko, co musisz zrobić, to wprowadzić tablice x i y:

Przykład

Jakie jest dopasowanie moich danych w wielokrotnej regresji?

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)))

Uruchomienie przykładu

Komentarz:Wynik 0.94 wskazuje na dobrą relację, którą możemy użyć w przyszłych przewidywaniach wielokrotnej regresji.

Przewidywanie przyszłych wartości

Teraz możemy użyć zebranych informacji do przewidywania przyszłych wartości.

Na przykład: spróbujmy przewidzieć prędkość aut przejeżdżających przez stację poboru opłat około 17:00 wieczorem:

Dla tego potrzebujemy takiego samego przykładu jak wyżej: mymodel Tablica:

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

Przykład

Przewiduj prędkość aut przejeżdżających o 17:00 popołudnia:

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)

Uruchomienie przykładu

Prędkość przewidywania wynosi 88.87, co również widać na rysunku:


Zła dopasowanie?

Pozwólmy stworzyć przykład, w którym wielokrotne regresja nie jest najlepszym sposobem przewidywania przyszłych wartości.

Przykład

Te wartości osi x i y będą powodować bardzo słabą dopasowanie regresji wielokrotnej:

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()

Wynik:


Uruchomienie przykładu

Czym jest wartość r-squared?

Przykład

Powinieneś uzyskać bardzo niską wartość 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)))

Uruchomienie przykładu

Wynik: 0.00995 oznacza bardzo słabe związki i informuje nas, że ten zestaw danych nie jest odpowiedni dla regresji wielokrotnej.