Datavitenskap med Python: 8 måter å gjøre lineær regresjon og måle hastigheten på

I denne artikkelen diskuterer vi 8 måter å utføre enkel lineær regresjon ved hjelp av Python-kode / -pakker. Vi glans over fordeler og ulemper, og viser deres relative beregningsmessige kompleksitetsmål.

For mange dataforskere er lineær regresjon utgangspunktet for mange statistiske modellerings- og prediktive analyseprosjekter. Viktigheten av å tilpasse (nøyaktig og raskt) en lineær modell til et stort datasett kan ikke overvurderes. Som påpekt i denne artikkelen, refererer ' LINEAR ' begrep i den lineære regresjonsmodellen til koeffisientene, og ikke til graden av funksjonene.

Funksjoner (eller uavhengige variabler) kan være av hvilken som helst grad eller til og med transcendentale funksjoner som eksponentiell, logaritmisk, sinusformet. Dermed kan en stor mengde naturlige fenomener modelleres (omtrent) ved hjelp av disse transformasjonene og den lineære modellen, selv om det funksjonelle forholdet mellom utdata og funksjoner er svært ikke-lineært.

På den annen side dukker Python raskt opp som det de facto programmeringsspråket du velger for dataforskere. Derfor er det avgjørende for en datavitenskapsmann å være klar over alle de forskjellige metodene han / hun raskt kan tilpasse en lineær modell til et ganske stort datasett og vurderer den relative betydningen av hver funksjon i utfallet av prosessen.

Er det imidlertid bare en måte å utføre lineær regresjonsanalyse på Python? I tilfelle flere tilgjengelige alternativer, hvordan velger du den mest effektive metoden?

På grunn av den brede populariteten til maskinlæringsbiblioteket scikit-learning, er en vanlig tilnærming ofte å ringe til Linear Model-klassen fra det biblioteket og tilpasse dataene. Selv om dette kan gi flere fordeler ved å bruke andre rørledningsfunksjoner ved maskinlæring (f.eks. Datanormalisering, modellkoeffisientregularisering, mating av den lineære modellen til en annen nedstrømsmodell), er dette ofte ikke den raskeste eller reneste metoden når en dataanalytiker trenger bare en rask og enkel måte å bestemme regresjonskoeffisientene (og noen grunnleggende tilknyttet statistikk).

Det er raskere og renere metoder. Men alle av dem tilbyr kanskje ikke like mye informasjon eller modelleringsfleksibilitet.

Vennligst les videre.

Hele kjeleplatekoden for forskjellige lineære regresjonsmetoder er tilgjengelig her på GitHub-depotet mitt. De fleste av dem er basert på SciPy-pakken.

SciPy er en samling av matematiske algoritmer og bekvemmelighetsfunksjoner bygget på Numpy-utvidelsen av Python . Det gir betydelig kraft til den interaktive Python-økten ved å gi brukeren kommandoer og klasser på høyt nivå for å manipulere og visualisere data.

La meg diskutere hver metode kort,

Metode: Scipy.polyfit () eller numpy.polyfit ()

Dette er en ganske generell polynomialtilpasningsfunksjon med minste kvadrater som godtar datasettet og en polynomfunksjon i en hvilken som helst grad (spesifisert av brukeren), og returnerer en rekke koeffisienter som minimerer den kvadrerte feilen. Detaljert beskrivelse av funksjonen er gitt her. For enkel lineær regresjon kan man velge grad 1. Hvis du vil passe en modell av høyere grad, kan du konstruere polynomiske trekk ut av de lineære funksjonsdataene og passe til modellen også.

Metode: Stats.linregress ()

Dette er en høyspesialisert lineær regresjonsfunksjon som er tilgjengelig i statistikkmodulen til Scipy. Det er ganske begrenset i sin fleksibilitet, da det er optimalisert for å beregne en lineær minste kvadratregresjon bare for to sett med målinger. Dermed kan du ikke tilpasse en generalisert lineær modell eller multivariat regresjon ved hjelp av denne. Men på grunn av sin spesialiserte natur er det en av de raskeste metoden når det gjelder enkel lineær regresjon. Bortsett fra den monterte koeffisienten og skjæringsbegrepet, returnerer den også grunnleggende statistikk som R ²-koeffisient og standardfeil.

Metode: Optimize.curve_fit ()

Dette er på samme linje som Polyfit-metoden, men mer generelt. Denne kraftige funksjonen fra scipy.optimize-modulen kan passe enhver brukerdefinert funksjon til et datasett ved å gjøre minst kvadratisk minimering.

For enkel lineær regresjon kan man bare skrive en lineær mx + c-funksjon og kalle denne estimatoren. Det sier seg selv at det også fungerer for regresjon med flere varianter. Den returnerer en rekke funksjonsparametere som det minste kvadratiske målet er minimert med og den tilhørende kovariansmatrisen.

Metode: numpy.linalg.lstsq

Dette er den grunnleggende metoden for å beregne minst kvadratisk løsning til et lineært ligningssystem ved hjelp av matrisefaktorisering. Den kommer fra den praktiske lineære algebramodulen med nummen pakke. Under panseret løser den ligningen ax = b ved å beregne en vektor x som minimerer den euklidiske 2-normen || b - øks || ² .

Ligningen kan være under-, godt- eller overbestemt (dvs. antall lineære uavhengige rader i a kan være mindre enn, lik eller større enn antallet lineært uavhengige kolonner). Hvis a er kvadratisk og av full rang, er x (men for avrundingsfeil) den "eksakte" løsningen på ligningen.

Du kan gjøre enten enkel eller multivariant regresjon med dette og få tilbake de beregnede koeffisientene og restene. Et lite triks er at før du kaller denne funksjonen, må du legge til en kolonne på 1-tallet til x-dataene for å beregne avskjæringsperioden. Det viser seg at det er en av de raskeste metodene for å prøve å få lineære regresjonsproblemer.

Metode: Statsmodels.OLS ()

Statsmodels er en flott liten Python-pakke som gir klasser og funksjoner for estimering av mange forskjellige statistiske modeller, samt for å utføre statistiske tester og utforsking av statistiske data. En omfattende liste over resultatstatistikker er tilgjengelig for hver estimator. Resultatene testes mot eksisterende statistiske pakker for å sikre korrekthet.

For lineær regresjon kan man bruke OLS- eller Ordinær-Minst-kvadrat-funksjonen fra denne pakken og få fullstendig statistisk informasjon om estimeringsprosessen.

Et lite triks å huske er at du må legge til en konstant manuelt i x-dataene for å beregne skjæringspunktet, ellers rapporterer det bare koeffisienten. Nedenfor er øyeblikksbildet av den komplette resultatoversikten for OLS-modellen. Den er like rik som ethvert funksjonelt statistisk språk som R eller Julia.

Metode: Analytisk løsning ved bruk av matrise invers metode

For velutstyrte lineære regresjonsproblemer (i det minste hvor # datapunkter> Antall funksjoner), eksisterer det en enkel matriseløsning i lukket form for beregning av koeffisientene som garanterer minst kvadratisk minimering. Det er gitt av,

Detaljert avledning og diskusjon om denne løsningen blir diskutert her.

Man har to valg her:

(a) ved hjelp av enkel multiplikativ matrise invers.

(b) første beregning av Moore-Penrose generaliserte pseudoinvers matrise av x-data etterfulgt av å ta et punktprodukt med y-dataene. Fordi denne andre prosessen innebærer nedbrytning av singular-value (SVD), er den tregere, men den kan fungere for ikke velkondisjonerte datasett godt.

Metode: sklearn.linear_model.LinearRegression ()

Dette er den viktigste metoden som brukes av flertallet av maskinlæringsingeniører og dataforskere. Selvfølgelig, for problemer i den virkelige verden, er det sannsynligvis aldri mye brukt og erstattes av kryssvaliderte og regulerte algoritmer som Lasso-regresjon eller Ridge-regresjon. Men den essensielle kjernen i disse avanserte funksjonene ligger i denne modellen.

Måling av hastighet og tidskompleksitet av disse metodene

Som dataforsker bør man alltid se etter nøyaktige, men raske metoder / funksjoner for å utføre datamodelleringsarbeidet. Hvis metoden iboende er treg, vil den skape kjøringsflaskehals for store datasett.

En god måte å bestemme skalerbarhet på er å kjøre modellene for å øke datasettstørrelsen, trekke ut kjøringstidene for alle løpene og tegne trenden.

Her er kjeleplatekoden for dette. Og her er resultatet. På grunn av sin enkelhet er stats.linregress og enkle matrixinverse metoder raskest, til og med opptil 10 millioner datapunkter.

Sammendrag

Som dataforsker må man alltid utforske flere alternativer for å løse den samme analyse- eller modelleringsoppgaven og velge det beste for hans / hennes spesielle problem.

I denne artikkelen diskuterte vi åtte måter å utføre enkel lineær regresjon på. De fleste av dem er skalerbare til mer generaliserte modeller for multivariat og polynomregresjon. Vi listet ikke opp R² for disse metodene, da alle er veldig nær 1.

For en enkeltvariabel regresjon, med millioner av kunstig genererte datapunkter, blir regresjonskoeffisienten estimert veldig bra.

Målet med denne artikkelen er primært å diskutere den relative hastigheten / beregningskompleksiteten til disse metodene. Vi viste beregningskompleksitetsmål for hver av dem ved å teste på et syntetisert datasett med økende størrelse (opptil 10 millioner prøver). Overraskende nok fungerer den enkle matrisen invers analytisk løsning ganske raskt i forhold til scikit-learns mye brukte Lineær modell.

Hvis du har spørsmål eller ideer å dele, kan du kontakte forfatteren på tirthajyoti [AT] gmail.com . Du kan også sjekke forfatterens GitHub-arkiver for andre morsomme kodebiter i Python, R eller MATLAB og maskinlæringsressurser. Hvis du, som meg, brenner for maskinlæring / datavitenskap / halvledere, er du velkommen til å legge meg til på LinkedIn eller følge meg på Twitter.