koneoppiminen - monomittainen regressio

Monimutkainen regressio (Polynomial Regression)

Jos tietojen kohteet eivät selvästikään sovellu lineaariseen regressioon (läpäisee tietopisteiden väliset suorat), monimutkainen regressio saattaa olla ihanteellinen valinta.

Kuten lineaariregressiossa, polynomiregressio käyttää muuttujia x ja y välillä olevaa suhdetta löytääkseen parhaan tavan piirtää datapisteiden viivat.


Toimintamekanismi

Pythonilla on joitakin tapoja löytää tietojen välisiä suhteita ja piirtää polynomiregressiolinjan.

Alapuoleisessa esimerkissä rekisteröimme 18 autoa, jotka kulkevat läpi tietyn maksukanavan.

Olemme tallentaneet autojen nopeuden ja läpikulun ajankohdan (tunti).

x-akseli edustaa päivän tuntia, y-akseli nopeutta:

Esimerkki

Ensimmäinen askel on piirtää pisteiden joukko:

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

Tulos:


Suorita Esimerkki

Esimerkki

tuo numpy ja matplotlibja sitten piirrä polynomiregressiolinja:

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

Tulos:


Suorita Esimerkki

Esimerkki selityksestä

Tuo tarvittavat moduulit:

import numpy
import matplotlib.pyplot as plt

Luo taulukko, joka edustaa x- ja y-akselin arvoja:

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:llä on tapa rakentaa polynomimalli:

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

Määritä sitten rivien näyttö tapa, aloitamme paikasta 1 ja päätymme paikkaan 22:

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

Piirrä alkuperäinen pisteiden joukko:

plt.scatter(x, y)

Piirrä polynomiregressiolinja:

plt.plot(myline, mymodel(myline))

Näytä kaaviot:

plt.show()

R-Squared

On tärkeää tietää, kuinka hyvin x- ja y-akselin arvojen välillä on suhde, koska ilman suhdetta polynomiregressio ei voi ennustaa mitään.

Tämä suhde mitataan arvon nimellä r-squared (r-neliö).

R-squared -arvon alue on 0-1, jossa 0 tarkoittaa epäriippuvuutta ja 1 tarkoittaa 100% riippuvuutta.

Python ja Sklearn-moduuli laskentaa tämän arvon puolestasi, sinun täytyy vain syöttää x- ja y-taulukot:

Esimerkki

Kuinka hyvin minun dataani sovittaa polynomiregressio?

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

Suorita Esimerkki

Huomautus:Tulos 0.94 osoittaa hyvän suhteen, ja voimme käyttää polynomiregressiota tulevissa ennusteissa.

Ennusta tulevaisuuden arvoja

Nyt voimme käyttää keräämiämme tietoja tulevien arvojen ennustamiseen.

Esimerkiksi: yritetään ennustaa autojen nopeutta noin 17 tunnin ajalla, kun ne kulkevat läpi maksukanavan:

Tätä varten tarvitsemme saman esimerkin: mymodel Taulukko:

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

Esimerkki

Ennusta 17 tunnin kuluttua autojen nopeutta:

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)

Suorita Esimerkki

Esimerkin ennustusnopeus on 88.87, ja sen voimme nähdä myös kuvassa:


Huono sovitus?

Lähdetään luomaan esimerkki, jossa polynomiregressio ei ole paras tapa ennustaa tulevaisuuden arvoja.

Esimerkki

Nämä x- ja y-aksojen arvot aiheuttavat polynomiregression sopivuuden erittäin huonoksi:

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

Tulos:


Suorita Esimerkki

Mikä on r-squared-arvo?

Esimerkki

Varmasti saat erittäin alhaisen r-squared-arvon.

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

Suorita Esimerkki

Tulos: 0.00995 osoittaa erittäin heikon suhteen ja kertoo, että tietojoukko ei sovellu polynomiregressiolle.