Datavidenskab med Python: 8 måder at udføre lineær regression på og måle deres hastighed

I denne artikel diskuterer vi 8 måder at udføre simpel lineær regression ved hjælp af Python-kode / pakker. Vi glans over deres fordele og ulemper og viser deres relative beregningsmæssige kompleksitetsmål.

For mange dataforskere er lineær regression udgangspunktet for mange statistiske modellerings- og forudsigelige analyseprojekter. Vigtigheden af ​​at tilpasse (nøjagtigt og hurtigt) en lineær model til et stort datasæt kan ikke overvurderes. Som påpeget i denne artikel henviser ' LINEAR ' udtryk i den lineære regressionsmodel til koefficienterne og ikke til graden af ​​funktionerne.

Funktioner (eller uafhængige variabler) kan være af en hvilken som helst grad eller endda transcendentale funktioner som eksponentiel, logaritmisk, sinusformet. Således kan en stor mængde naturlige fænomener modelleres (ca.) ved hjælp af disse transformationer og lineær model, selvom det funktionelle forhold mellem output og funktioner er meget ikke-lineært.

På den anden side fremstår Python hurtigt som det de facto programmeringssprog, der vælges for dataforskere. Derfor er det afgørende for en datavidenskabsmand at være opmærksom på alle de forskellige metoder, han / hun hurtigt kan tilpasse en lineær model til et ret stort datasæt og vurderer den relative betydning af hver funktion i resultatet af processen.

Er der kun en måde at udføre lineær regressionsanalyse på i Python? I tilfælde af flere tilgængelige muligheder, hvordan vælger man den mest effektive metode?

På grund af maskinlæringsbibliotekets store popularitet scikit-learning er en almindelig tilgang ofte at kalde klassen Linear Model fra dette bibliotek og tilpasse dataene. Selvom dette kan tilbyde yderligere fordele ved at anvende andre pipeline-funktioner ved maskinindlæring (f.eks. Datanormalisering, modelkoefficientregularisering, fodring af den lineære model til en anden downstream-model), er dette ofte ikke den hurtigste eller reneste metode, når en dataanalytiker kun har brug for en hurtig og nem måde at bestemme regressionskoefficienterne (og nogle grundlæggende tilknyttede statistikker).

Der er hurtigere og renere metoder. Men alle af dem tilbyder muligvis ikke den samme mængde information eller modelleringsfleksibilitet.

Læs videre.

Hele kedelpladekoden til forskellige lineære regressionsmetoder er tilgængelig her på mit GitHub-lager. De fleste af dem er baseret på SciPy-pakken.

SciPy er en samling af matematiske algoritmer og komfortfunktioner bygget på Numpy-udvidelsen af ​​Python . Det tilføjer betydelig styrke til den interaktive Python-session ved at give brugeren kommandoer og klasser på højt niveau til manipulation og visualisering af data.

Lad mig diskutere hver metode kort,

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

Dette er en temmelig generel polynomial tilpasningsfunktion med mindst kvadrater, som accepterer datasættet og en polynomfunktion af enhver grad (specificeret af brugeren) og returnerer en række koefficienter, der minimerer den kvadratiske fejl. Detaljeret beskrivelse af funktionen er givet her. For enkel lineær regression kan man vælge grad 1. Hvis du vil tilpasse en model af højere grad, kan du konstruere polynomiske træk ud af de lineære funktionsdata og også passe til modellen.

Metode: Stats.linregress ()

Dette er en højt specialiseret lineær regressionsfunktion tilgængelig i Scipy's statistikmodul. Det er ret begrænset i sin fleksibilitet, da det er optimeret til kun at beregne en lineær mindste kvadraters regression for to sæt målinger. Således kan du ikke tilpasse en generaliseret lineær model eller multi-variat regression ved hjælp af denne. Men på grund af dets specialiserede natur er det en af ​​de hurtigste metoder, når det kommer til simpel lineær regression. Bortset fra den monterede koefficient og intercepttermen returnerer den også grundlæggende statistikker såsom R ²-koefficient og standardfejl.

Metode: Optimize.curve_fit ()

Dette er på samme linje som Polyfit-metoden, men mere generelt. Denne kraftfulde funktion fra scipy.optimize-modulet kan passe enhver brugerdefineret funktion til et datasæt ved at gøre mindst kvadratisk minimering.

For enkel lineær regression kan man bare skrive en lineær mx + c-funktion og kalde denne estimator. Det siger sig selv, at det også fungerer for multi-variabel regression. Det returnerer en række funktionsparametre, for hvilke det mindste kvadratiske mål er minimeret, og den tilknyttede kovariansmatrix.

Metode: numpy.linalg.lstsq

Dette er den grundlæggende metode til beregning af mindst kvadratisk opløsning til et lineært ligningssystem ved hjælp af matrixfaktorisering. Det kommer fra det praktiske lineære algebramodul med numpy pakke. Under emhætten løser den ligningen ax = b ved at beregne en vektor x, der minimerer den euklidiske 2-norm || b - økse || ² .

Ligningen kan være under-, godt- eller overbestemt (dvs. antallet af lineært uafhængige rækker af a kan være mindre end, lig med eller større end antallet af lineært uafhængige søjler). Hvis a er firkantet og af fuld rang, er x (men for afrundingsfejl) den "nøjagtige" løsning af ligningen.

Du kan enten foretage enkel eller multi-variabel regression med dette og få de beregnede koefficienter og rester tilbage. Et lille trick er, at inden du kalder denne funktion, skal du tilføje en kolonne med 1 til x-dataene for at beregne skæringsperioden. Det viser sig, at det er en af ​​de hurtigere metoder til at prøve lineære regressionsproblemer.

Metode: Statsmodels.OLS ()

Statsmodels er en dejlig lille Python-pakke, der giver klasser og funktioner til estimering af mange forskellige statistiske modeller såvel som til udførelse af statistiske tests og udforskning af statistiske data. En omfattende liste over resultatstatistikker er tilgængelig for hver estimator. Resultaterne testes mod eksisterende statistiske pakker for at sikre korrekthed.

Til lineær regression kan man bruge OLS- eller Ordinær-Mindste-Firkant-funktionen fra denne pakke og få den fuldblæste statistiske information om estimeringsprocessen.

Et lille trick at huske er, at du skal tilføje en konstant manuelt til x-dataene til beregning af skæringspunktet, ellers rapporterer det som standard kun koefficienten. Nedenfor er et øjebliksbillede af OLS-modelens fulde resultatoversigt. Det er lige så rig som ethvert funktionelt statistisk sprog som R eller Julia.

Metode: Analytisk opløsning ved hjælp af matrix invers metode

For velkonditionerede lineære regressionsproblemer (i det mindste hvor # af datapunkter> # af funktioner) findes en simpel matrixløsning med lukket form til beregning af koefficienterne, som garanterer minimering af mindst kvadratisk. Det er givet af,

Detaljeret afledning og diskussion om denne løsning diskuteres her.

Man har to valg her:

(a) ved anvendelse af simpel multiplikativ matrix invers.

(b) først beregning af Moore-Penrose generaliserede pseudoinvers matrix af x-data efterfulgt af at tage et punktprodukt med y-data. Fordi denne 2. proces involverer nedbrydning af entalværdi (SVD), er den langsommere, men den kan fungere for ikke velkonditioneret datasæt godt.

Metode: sklearn.linear_model.LinearRegression ()

Dette er den afgørende metode, der anvendes af flertallet af maskinlæringsingeniører og dataforskere. Selvfølgelig er det sandsynligvis aldrig meget brugt til problemer i den virkelige verden og erstattes af krydsvaliderede og regulerede algoritmer som Lasso-regression eller Ridge-regression. Men den væsentlige kerne i disse avancerede funktioner ligger i denne model.

Måling af hastighed og tidskompleksitet af disse metoder

Som dataforsker skal man altid kigge efter nøjagtige, men hurtige metoder / funktion til at udføre datamodelleringsarbejdet. Hvis metoden i sagens natur er langsom, skaber den eksekveringsflaskehals for store datasæt.

En god måde at bestemme skalerbarhed på er at køre modellerne for at øge datasættets størrelse, udtrække udførelsestiderne for alle kørsler og tegne trenden.

Her er kedelpladekoden til dette. Og her er resultatet. På grund af deres enkelhed er stats.linregress og enkle matrixinverse metoder hurtigste, endda op til 10 millioner datapunkter.

Resumé

Som datavidenskab skal man altid undersøge flere muligheder for at løse den samme analyse- eller modelleringsopgave og vælge det bedste til hans / hendes særlige problem.

I denne artikel diskuterede vi 8 måder at udføre simpel lineær regression på. De fleste af dem er skalerbare til mere generaliserede modeller med multivariat og polynomregression. Vi anførte ikke R²-egnet til disse metoder, da de alle er meget tæt på 1.

For en enkelt variabel regression med millioner af kunstigt genererede datapunkter estimeres regressionskoefficienten meget godt.

Målet med denne artikel er primært at diskutere den relative hastighed / beregningskompleksitet af disse metoder. Vi viste det beregningsmæssige kompleksitetsmål for hver af dem ved at teste på et syntetiseret datasæt med stigende størrelse (op til 10 millioner prøver). Overraskende fungerer den enkle matrix inverse analytiske løsning temmelig hurtigt sammenlignet med scikit-lears meget anvendte Lineær Model.

Hvis du har spørgsmål eller ideer til at dele, bedes du kontakte forfatteren på tirthajyoti [AT] gmail.com . Du kan også kontrollere forfatterens GitHub-arkiver for andre sjove kodestykker i Python, R eller MATLAB og maskinlæringsressourcer. Hvis du, ligesom mig, brænder for maskinlæring / datalogi / halvledere, er du velkommen til at tilføje mig på LinkedIn eller følge mig på Twitter.