Strojové učení – polynomiální regrese
Polynomiální regrese
Pokud vaše datové body zjevně nevyhovují lineární regresi (přímá čára přes všechny datové body), může být ideální pro polynomiální regresi.
Polynomiální regrese, stejně jako lineární regrese, používá vztah mezi proměnnými x a y k nalezení nejlepšího způsobu, jak nakreslit čáru přes datové body.
Jak to funguje?
Python má metody pro nalezení vztahu mezi datovými body a pro nakreslení čáry polynomiální regrese. Ukážeme vám, jak tyto metody používat místo procházení matematického vzorce.
V níže uvedeném příkladu jsme zaregistrovali 18 aut, která projížděla kolem určité mýtnice.
Zaznamenali jsme rychlost auta a denní dobu (hodinu), kdy došlo k předjetí.
Osa x představuje hodiny dne a osa y rychlost:
Příklad
Začněte kreslením bodového grafu:
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()
Výsledek:
Příklad
Importujte numpy
a
matplotlib
poté nakreslete čáru polynomiální regrese:
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()
Výsledek:
Příklad vysvětlen
Importujte moduly, které potřebujete.
O modulu NumPy se můžete dozvědět v našem výukovém programu NumPy .
O modulu SciPy se můžete dozvědět v našem SciPy Tutoriálu .
import numpy
import matplotlib.pyplot as plt
Vytvořte pole, která představují hodnoty osy x a 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 má metodu, která nám umožňuje vytvořit polynomiální model:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
Poté zadejte, jak se řádek zobrazí, začneme na pozici 1 a skončíme na pozici 22:
myline = numpy.linspace(1, 22, 100)
Nakreslete původní bodový graf:
plt.scatter(x, y)
Nakreslete čáru polynomiální regrese:
plt.plot(myline, mymodel(myline))
Zobrazit diagram:
plt.show()
R-squared
Je důležité vědět, jak dobrý je vztah mezi hodnotami osy x a y, pokud žádný vztah neexistuje, nelze polynomiální regresi použít k předpovědi čehokoli.
Vztah se měří hodnotou nazývanou r-squared.
Hodnota r na druhou se pohybuje od 0 do 1, kde 0 znamená žádný vztah a 1 znamená 100% související.
Python a modul Sklearn vám tuto hodnotu spočítají, vše, co musíte udělat, je zadat ji pomocí polí x a y:
Příklad
Jak dobře zapadají moje data do polynomiální regrese?
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)))
Poznámka: Výsledek 0,94 ukazuje, že existuje velmi dobrý vztah a v budoucích předpovědích můžeme použít polynomiální regresi.
Předvídat budoucí hodnoty
Nyní můžeme nashromážděné informace použít k předpovědi budoucích hodnot.
Příklad: Zkusme předpovědět rychlost auta, které kolem 17:00 projede kolem mýtnice:
K tomu potřebujeme stejné mymodel
pole z výše uvedeného příkladu:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Příklad
Předpovězte rychlost projíždějícího auta v 17:00:
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)
Příklad předpověděl rychlost na 88,87, což jsme také mohli vyčíst z diagramu:
Špatná kondice?
Vytvořme příklad, kde by polynomiální regrese nebyla nejlepší metodou k předpovědi budoucích hodnot.
Příklad
Tyto hodnoty pro osu x a y by měly vést k velmi špatnému přizpůsobení pro polynomiální regresi:
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()
Výsledek:
A hodnota r na druhou?
Příklad
Měli byste získat velmi nízkou hodnotu r na druhou.
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)))
Výsledek: 0,00995 označuje velmi špatný vztah a říká nám, že tento soubor dat není vhodný pro polynomiální regresi.