Uczenie maszynowe — regresja wielomianowa
Regresja wielomianowa
Jeśli twoje punkty danych wyraźnie nie pasują do regresji liniowej (linia prosta przechodząca przez wszystkie punkty danych), może to być idealne rozwiązanie dla regresji wielomianowej.
Regresja wielomianowa, podobnie jak regresja liniowa, wykorzystuje zależność między zmiennymi x i y, aby znaleźć najlepszy sposób na narysowanie linii przez punkty danych.
Jak to działa?
Python ma metody znajdowania relacji między punktami danych i rysowania linii regresji wielomianowej. Pokażemy Ci, jak korzystać z tych metod zamiast przechodzić przez wzór matematyczny.
W poniższym przykładzie zarejestrowaliśmy 18 samochodów, które przejeżdżały przez określony punkt poboru opłat.
Zarejestrowaliśmy prędkość samochodu, a także porę dnia (godzinę) mijania.
Oś x reprezentuje godziny dnia, a oś y prędkość:
Przykład
Zacznij od narysowania wykresu punktowego:
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:
Przykład
Zaimportuj numpy
, a
matplotlib
następnie narysuj linię regresji wielomianowej:
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:
Przykład wyjaśniony
Zaimportuj potrzebne moduły.
Możesz dowiedzieć się o module NumPy w naszym samouczku NumPy .
Możesz dowiedzieć się o module SciPy w naszym samouczku SciPy .
import numpy
import matplotlib.pyplot as plt
Utwórz tablice reprezentujące 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 posiada metodę, która pozwala na stworzenie modelu wielomianowego:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
Następnie określ sposób wyświetlania linii, zaczynamy od pozycji 1, a kończymy na pozycji 22:
myline = numpy.linspace(1, 22, 100)
Narysuj oryginalny wykres punktowy:
plt.scatter(x, y)
Narysuj linię regresji wielomianowej:
plt.plot(myline, mymodel(myline))
Wyświetl schemat:
plt.show()
R-kwadrat
Ważne jest, aby wiedzieć, jak dobrze jest związek między wartościami osi x i y, jeśli nie ma związku, regresji wielomianowej nie można użyć do przewidzenia czegokolwiek.
Zależność mierzy się wartością zwaną r-kwadrat.
Wartość r-kwadrat mieści się w zakresie od 0 do 1, gdzie 0 oznacza brak związku, a 1 oznacza 100% powiązania.
Python i moduł Sklearn obliczą tę wartość za Ciebie, wszystko, co musisz zrobić, to nakarmić ją tablicami x i y:
Przykład
Jak dobrze moje dane pasują do regresji wielomianowej?
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)))
Uwaga: Wynik 0,94 pokazuje, że istnieje bardzo dobra zależność i możemy użyć regresji wielomianowej w przyszłych przewidywaniach.
Przewiduj przyszłe wartości
Teraz możemy wykorzystać zebrane informacje do przewidywania przyszłych wartości.
Przykład: Spróbujmy przewidzieć prędkość samochodu przejeżdżającego przez bramkę około godziny 17:
Aby to zrobić, potrzebujemy tej samej mymodel
tablicy z powyższego przykładu:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Przykład
Wytypuj prędkość przejeżdżającego samochodu o godzinie 17:
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)
Przykład przewidywał prędkość 88,87, co również mogliśmy odczytać z wykresu:
Złe dopasowanie?
Stwórzmy przykład, w którym regresja wielomianowa nie byłaby najlepszą metodą przewidywania przyszłych wartości.
Przykład
Te wartości dla osi x i y powinny skutkować bardzo złym dopasowaniem dla regresji wielomianowej:
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:
A wartość r-kwadrat?
Przykład
Powinieneś otrzymać bardzo niską wartość r-kwadrat.
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)))
Wynik: 0,00995 wskazuje na bardzo złą zależność i mówi nam, że ten zestaw danych nie nadaje się do regresji wielomianowej.