Datatiede Pythonilla: 8 tapaa tehdä lineaarinen regressio ja mitata niiden nopeus

Tässä artikkelissa käsitellään 8 tapaa suorittaa yksinkertainen lineaarinen regressio Python-koodin / pakettien avulla. Kiihdytämme heidän etujaan ja haittojaan ja osoitamme heidän suhteellisen laskennallisen monimutkaisuutensa.

Monille datatieteilijöille lineaarinen regressio on lähtökohta monille tilastollisille mallinnus- ja ennusteanalyysiprojekteille. Lineaarisen mallin (täsmällisesti ja nopeasti) sovittamisen merkitystä suurelle tietojoukolle ei voida yliarvioida. Kuten tässä artikkelissa todettiin, lineaarisen regressiomallin termi ' LINEAR ' viittaa kertoimiin eikä ominaisuuksien asteeseen.

Ominaisuudet (tai riippumattomat muuttujat) voivat olla missä tahansa asteessa tai jopa transsendentaalisia toimintoja, kuten eksponentiaalinen, logaritminen, sinimuotoinen. Siten suuri joukko luonnonilmiöitä voidaan mallintaa (suunnilleen) käyttämällä näitä muunnoksia ja lineaarista mallia, vaikka ulostulon ja ominaisuuksien välinen toiminnallinen suhde olisi erittäin epälineaarinen.

Toisaalta Python on nopeasti nousemassa datatieteilijöiden valitsemaksi tosiasialliseksi ohjelmointikieleksi. Siksi on tärkeää, että datatieteilijä on tietoinen kaikista erilaisista menetelmistä, joihin hän pystyy sovittamaan lineaarisen mallin nopeasti melko suureen tietojoukkoon, ja arvioi kunkin ominaisuuden suhteellisen merkityksen prosessin lopputuloksessa.

Onko kuitenkin vain yksi tapa suorittaa lineaarinen regressioanalyysi Pythonissa? Kuinka valita tehokkain menetelmä, jos käytettävissä on useita vaihtoehtoja?

Koneoppimiskirjaston scikit-learn-oppimisen suuren suosion vuoksi yleinen lähestymistapa on usein kutsua Linear Model -luokka kyseisestä kirjastosta ja sovittaa tiedot. Vaikka tämä voi tarjota lisäetuja koneoppimisen muiden pipeline-ominaisuuksien (esim. Tietojen normalisointi, mallikerroinlaillistaminen, lineaarisen mallin syöttäminen toiseen loppupään malliin) soveltamisesta, tämä ei usein ole nopein tai puhtain tapa, kun data-analyytikko tarvitsee vain nopean ja helppo tapa määrittää regressiokertoimet (ja joitain niihin liittyviä perustilastoja).

On nopeampia ja puhtaampia menetelmiä. Mutta ne kaikki eivät välttämättä tarjoa yhtä paljon tietoa tai mallinnuksen joustavuutta.

Ole hyvä ja lue eteenpäin.

Koko kattilalevykoodi erilaisille lineaarisille regressiomenetelmille on saatavana täältä GitHub-arkistostani. Suurin osa niistä perustuu SciPy-pakettiin.

SciPy on kokoelma matemaattisia algoritmeja ja mukavuusfunktioita, jotka on rakennettu Pythonin Numpy-laajennukseen . Se lisää merkittävää tehoa interaktiiviseen Python-istuntoon tarjoamalla käyttäjälle korkean tason komentoja ja luokkia tietojen manipuloimiseksi ja visualisoimiseksi.

Haluan keskustella kustakin menetelmästä lyhyesti,

Menetelmä: Scipy.polyfit () tai numpy.polyfit ()

Tämä on melko yleinen pienimmän neliösumman polynomin sovitustoiminto, joka hyväksyy tietojoukon ja minkä tahansa asteen polynomifunktion (jonka käyttäjä on määrittänyt) ja palauttaa kerroinjoukon, joka minimoi neliövirheen. Yksityiskohtainen kuvaus toiminnosta on tässä. Yksinkertaista lineaarista regressiota varten voidaan valita aste 1. Jos haluat sovittaa korkeamman asteen mallin, voit rakentaa polynomiominaisuudet lineaaristen piirteiden tiedoista ja sovittaa myös malliin.

Menetelmä: Stats.linregress ()

Tämä on pitkälle erikoistunut lineaarinen regressiofunktio, joka on käytettävissä Scipyn tilastomoduulissa. Sen joustavuus on melko rajoitettu, koska se on optimoitu laskemaan lineaarinen pienimmän neliösumman regressio vain kahdelle mittaussarjalle. Siten et voi sovittaa yleistettyä lineaarista mallia tai monen muunnelman regressiota tällä tavalla. Mutta erityisluonteensa vuoksi se on yksi nopeimmista menetelmistä yksinkertaisen lineaarisen regression suhteen. Sovitetun kertoimen ja sieppaustermin lisäksi se palauttaa myös perustilastot, kuten R2- kertoimen ja standardivirheen.

Menetelmä: Optimize.curve_fit ()

Tämä on samaa linjaa kuin Polyfit-menetelmä, mutta luonteeltaan yleisempi. Tämä scipy.optimize-moduulin tehokas toiminto voi sovittaa minkä tahansa käyttäjän määrittelemän toiminnon tietojoukkoon tekemällä pienimmän neliön minimoinnin.

Yksinkertaista lineaarista regressiota varten voidaan vain kirjoittaa lineaarinen mx + c-funktio ja kutsua tätä estimaattoria. Menee sanomatta, että se toimii myös monivaiheisessa regressiossa. Se palauttaa joukon toimintaparametreja, joille pienimmän neliön mitta on minimoitu, ja siihen liittyvän kovarianssimatriisin.

Menetelmä: numpy.linalg.lstsq

Tämä on perusmenetelmä pienimmän neliösumman ratkaisun laskemiseksi lineaariselle yhtälöjärjestelmälle matriisifaktoroinnilla. Se tulee numpy-paketin kätevästä lineaarisesta algebramoduulista. Hupun alla se ratkaisee yhtälön ax = b laskemalla vektorin x, joka minimoi euklidisen 2-normin || b - kirves || ² .

Yhtälö voi olla ali-, hyvin, tai yli- määritetty (eli määrä lineaarisesti riippumattomia riviä voi olla pienempi kuin, sama tai suurempi kuin sen määrä lineaarisesti riippumaton pylväät). Jos a on neliö ja täysi sijoitus, niin x (mutta pyöristysvirheen tapauksessa) on yhtälön "tarkka" ratkaisu.

Voit tehdä tällä joko yksinkertaisen tai monivaiheen regressiota ja palauttaa lasketut kertoimet ja jäännökset. Yksi pieni temppu on, että ennen tämän toiminnon kutsumista sinun on liitettävä 1-sarake x-tietoihin sieppausjakson laskemiseksi. Osoittautuu, että se on yksi nopeimmista menetelmistä kokeilla lineaarisia regressio-ongelmia.

Menetelmä: Tilastomallit.OLS ()

Statsmodels on loistava pieni Python-paketti, joka tarjoaa luokkia ja toimintoja useiden erilaisten tilastomallien estimointiin sekä tilastollisten testien suorittamiseen ja tilastollisten tietojen tutkimiseen. Kullekin estimaattorille on saatavana laaja luettelo tulostilastoista. Tulokset testataan olemassa olevien tilastopakettien kanssa oikeellisuuden varmistamiseksi.

Lineaarisessa regressiossa voidaan käyttää tämän paketin OLS- tai Ordinary-Least-Square -funktiota ja saada täysi puhallettu tilastotieto arviointiprosessista.

Yksi pieni temppu muistaa on, että sinun on lisättävä vakio manuaalisesti x-tietoihin sieppauksen laskemiseksi, muuten oletusarvoisesti se ilmoittaa vain kertoimen. Alla on tilannekuva OLS-mallin täydellisestä tulosyhteenvedosta. Se on yhtä rikas kuin mikä tahansa toiminnallinen tilastollinen kieli, kuten R tai Julia.

Menetelmä: Analyyttinen liuos matriisikäänteismenetelmällä

Hyvin hoidetuissa lineaarisissa regressio-ongelmissa (ainakin missä datapisteiden lukumäärä> ominaisuuksien #) on olemassa yksinkertainen suljetun muodon matriisiratkaisu kertoimien laskemiseksi, mikä takaa pienimmän neliön minimoinnin. Sen antaa

Yksityiskohtaista johdantoa ja keskustelua tästä ratkaisusta käsitellään tässä.

Yhdellä on kaksi vaihtoehtoa:

(a) käyttämällä yksinkertaista multiplikatiivista matriisikäänteistä.

(b) lasketaan ensin Moore-Penrose-yleistetty x-datan pseudoinversoitu matriisi, jonka jälkeen otetaan pistetulo y-datan kanssa. Koska tähän toiseen prosessiin liittyy singulaariarvon hajoaminen (SVD), se on hitaampaa, mutta se voi toimia huonosti ehdollistetuissa tiedoissa.

Menetelmä: sklearn.linear_model.LinearRegression ()

Tämä on tärkein menetelmä, jota suurin osa koneoppimisinsinööreistä ja datatieteilijöistä käyttää. Tietysti tosielämän ongelmissa sitä ei todennäköisesti koskaan käytetä paljon, ja se korvataan ristivalidoiduilla ja säännöllisillä algoritmeilla, kuten Lasso-regressio tai Ridge-regressio. Mutta näiden kehittyneiden toimintojen keskeinen ydin on tässä mallissa.

Näiden menetelmien nopeuden ja ajan monimutkaisuuden mittaaminen

Datatieteilijänä tulisi aina etsiä tarkkoja mutta nopeita menetelmiä / toimintoja tietojen mallintamistyön tekemiseksi. Jos menetelmä on luonnostaan ​​hidas, se luo toteutuksen pullonkaulan suurille tietojoukoille.

Hyvä tapa määrittää skaalautuvuus on ajaa malleja dataryhmän koon lisäämiseksi, poimia kaikkien ajoiden suoritusajat ja piirtää trendi.

Tässä on kattilan levykoodi. Ja tässä on tulos. Yksinkertaisuutensa vuoksi stats.linregress ja yksinkertaiset matriisikäänteiset menetelmät ovat nopeimpia, jopa 10 miljoonaa datapistettä.

Yhteenveto

Datatieteilijänä on aina tutkittava useita vaihtoehtoja saman analyysi- tai mallinnustehtävän ratkaisemiseksi ja valittava parhaiten hänen erityisongelmansa.

Tässä artikkelissa keskustelimme 8 tapasta suorittaa yksinkertainen lineaarinen regressio. Suurin osa niistä on skaalautuva yleisempään monivariaatioon ja polynomiin regressiomallinnukseen. Emme listanneet näille menetelmille sopivaa R²-arvoa, koska ne kaikki ovat hyvin lähellä arvoa 1.

Yhden muuttujan regressiolle, jossa on miljoonia keinotekoisesti tuotettuja datapisteitä, regressiokerroin arvioidaan erittäin hyvin.

Tämän artikkelin tavoitteena on ensisijaisesti keskustella näiden menetelmien suhteellisesta nopeudesta / laskennallisesta monimutkaisuudesta. Osoitimme kummankin laskennallisen monimutkaisuusmittauksen testaamalla kasvavan koon (jopa 10 miljoonaa näytettä) syntetisoidulla tietojoukolla. Yllättäen yksinkertainen matriisin käänteinen analyyttinen ratkaisu toimii melko nopeasti verrattuna Scikit-Learnin laajalti käytettyyn lineaariseen malliin.

Jos sinulla on kysyttävää tai ideoita jaettavaksi, ota yhteyttä kirjoittajaan osoitteessa tirthajyoti [AT] gmail.com . Voit myös tarkistaa kirjoittajan GitHub-arkistoista muita hauskoja koodinpätkiä Pythonissa, R: ssä tai MATLABissa ja koneoppimisresursseissa. Jos olet, kuten minä, intohimoisesti koneoppimisesta / datatieteestä / puolijohteista, voit lisätä minut LinkedIniin tai seurata minua Twitterissä.