engelsk versjon:
Hovedproblemet som løses, er unøyaktige/lavkvalitets svar levert av respondenter til en undersøkelse - ofte med svært materielle konsekvenser for det endelige resultatet. Dette tar normalt et team av statistikere et helt år å korrigere (noen ganger resulterer det i at man må kontakte respondentene på nytt) - Jeg skal løse denne oppgaven ved hjelp av maskinlæring og andre statistiske tiltak.
Resultater: En full produksjonskjøring (normalt fullført av et team på 5-7 personer over et helt år) fullført på 600,38 sekunder. Resultatene passerer flere logiske tester og sammenlignet med tidligere produksjoner viser de seg å være svært gunstige. R^2 når man sammenligner det dette programmet produserer mot det som faktisk ble publisert var omtrent 98% med en gjennomsnittlig absolutt feil på omtrent 5.000 NOK - noe som er lavt gitt egenskapene til våre data.
Dette repositoriet vil også fungere som en alt-i-ett butikk for metodetesting og utvikling av maskinlæringsløsninger for statistikk relatert til NØKU. Relevante ReadMe-filer vil bli lagt til i mappene der andre koder er lagret.
Føl deg fri til å klone repoet hvis du har passende tilgang. Jeg vil også demonstrere hva koden gjør her i denne ReadMe-filen:
Visualiseringene som sees her i denne README-filen er for data som allerede er publisert, og det har blitt lagt til støy for å beskytte konfidensialitet. De visuelle elementene her demonstrerer rett og slett hvordan koden fungerer.
Flere visualiseringer brukes til å analysere dataene på industrinivå. Plottene er interaktive, brukeren kan velge år, diagramtyper, fokusvariabler osv. Alle de vanlige interaktive verktøyene fra Plotly er også tilgjengelige. Noen visualiseringer er animerte, og hvis brukeren trykker på spill av, vil de se endringer over tid. Her er hvordan noen av resultatene ser ut (som naturligvis vil justere seg hvis noe annet ble valgt i rullegardinmenyene).
Enkle plot:
Stolpediagrammer og Varmekart:
Kart (ett som er animert):
Histogram med kumulativ prosent:
Koblede plot:
Boblediagrammer:
Parallellkoordinatdiagram:
Geografisk diagram:
Animert stolpediagram:
3D Plot:
Dette programmet har som mål å løse problemet med lavkvalitets svar på økonomiske dataundersøkelser. Vi evaluerer kvaliteten ved å sammenligne svarene med skattetatens data og hvor mange av feltene som er utfylt. Svar av dårlig kvalitet blir imputert ved hjelp av en valgt maskinlæringsalgoritme som er trent på hele datasettet (utenom undersøkelsene av dårlig kvalitet).
Viktige verktøy brukt:
Feature engineering: Jeg samlet ekstra data ved å spørre ulike API-er og samarbeide med flere andre avdelinger innen SSB. Jeg brukte også verktøy som KNN-imputasjon for å fylle NaN-verdier og opprettet nye trendvariabler ved hjelp av lineær regresjon.
GridSearch: Dette ble brukt for hyperparametertuning. Dette kan slås av og på avhengig av brukerens behov.
Andre viktige verktøy og parametere:
Scaler (object): Scalers brukes til å normalisere eller standardisere numeriske funksjoner. Vanlige scalers inkluderer StandardScaler og RobustScaler. Normalisering hjelper til med å akselerere konvergensen av treningsalgoritmen ved å sikre at alle funksjoner bidrar like mye til læringsprosessen.
epochs_number (int): Antallet epoker bestemmer hvor mange ganger læringsalgoritmen skal jobbe gjennom hele treningsdatasettet. Flere epoker kan føre til bedre læring, men kan også føre til overtilpasning hvis for mange.
batch_size (int): Dette definerer antall prøver som vil bli propagert gjennom nettverket samtidig. Mindre batchstørrelser kan føre til mer pålitelige oppdateringer, men er mer krevende å beregne. Jeg valgte en middels størrelse basert på formen på dataene og hvor ofte visse funksjoner vises i df. Hastighet var også en vurdering.
Early Stopping: Jeg bruker tidlige stoppteknikker for å forhindre overtilpasning og forbedre treningstiden.
Learning Curves: Jeg har brukt læringskurver for å avgjøre om modellene er overtilpasset. Resultatene indikerer at dette ikke har skjedd.
Alle parametere kan endres basert på resultater og noen ganger som følge av GridSearch (hyperparametertuning).
learning_rate (float): I funksjonen er standard læringsrate satt til 0,001. Læringsraten styrer hvor mye modellens vekter justeres i forhold til tapets gradient. En læringsrate på 0,001 er et vanlig utgangspunkt da det lar modellen konvergere jevnt uten å overskyte den optimale løsningen.
dropout_rate (float): Standard dropout-rate er satt til 0,5. Dropout er en regulariseringsteknikk som brukes for å forhindre overtilpasning ved å tilfeldig sette en andel av inngangsenhetene til null ved hver oppdatering under trening. En dropout-rate på 0,5 betyr at halvparten av nevronene blir droppet, noe som er en standardverdi for å fremme robusthet i nettverket.
neurons_layer1 (int): Det første laget av det nevrale nettverket har 64 nevroner som standard. Å ha 64 nevroner lar modellen fange komplekse mønstre i dataene samtidig som det opprettholder en balanse mellom beregningseffektivitet og modellkapasitet.
neurons_layer2 (int): Det andre laget har 32 nevroner som standard. Dette mindre antallet nevroner i det påfølgende laget bidrar til å redusere modellkompleksiteten gradvis, noe som kan hjelpe med å fange hierarkiske mønstre i dataene.
activation (str): Aktiveringsfunksjonen som brukes i de skjulte lagene er relu (Rectified Linear Unit). ReLU-funksjonen er populær fordi den introduserer ikke-linearitet samtidig som den er beregningsmessig effektiv og motvirker problemet med forsvinnende gradienter som er vanlig i dypere nettverk.
optimizer (str): Optimalisereren som brukes er adam som standard. Adam (Adaptive Moment Estimation) er en optimaliseringsalgoritme med adaptiv læringsrate som har blitt mye brukt på grunn av sin effektivitet og effektivitet i trening av dype nevrale nettverk. Den kombinerer fordelene med to andre utvidelser av stokastisk gradientavstigning, nemlig AdaGrad og RMSProp, for å gi raskere konvergens.
Ytterligere detaljer om modellbyggingsprosessen
Lagsammensetning:
Det første tette laget med 64 nevroner bruker relu-aktivering, som er ideell for å fange komplekse ikke-lineære sammenhenger. Et dropout-lag følger for å forhindre overtilpasning ved tilfeldig å droppe 50 % av nevronene under trening. Det andre tette laget med 32 nevroner bruker også relu-aktivering, som hjelper til med å finjustere funksjonene som er trukket ut av det første laget. Et annet dropout-lag legges til etter det andre tette laget for ytterligere regularisering. Det siste utgangslaget har en enkelt nevron med en lineær aktiveringsfunksjon, som er passende for regresjonsoppgaver da det gir en kontinuerlig verdi. Regularisering:
kernel_regularizer=tf.keras.regularizers.l2(0.01) brukes på de tette lagene. L2-regularisering bidrar til å forhindre overtilpasning ved å straffe store vekter, og dermed fremme mindre, mer generaliserbare vekter.
Resultater:
XGBoost:
Jeg brukte visualiseringsteknikker for å se viktigheten av flere funksjoner.
K-Nearest Neighbors:
Jeg laget også et dashbord ved hjelp av Dash for å visualisere det endelige produktet. Her er et raskt øyeblikksbilde (det er mer), men i hovedsak er det visualiseringene sett i notatboken, men i dashbordform hvor variabler kan velges og brukes til å oppdatere alle plott samtidig:
Jeg utfører flere logiske tester og backtester programmets output mot faktiske publiseringer:
Basert på disse resultatene er det sannsynlig at jeg vil bruke K-NN nærmeste naboer for 2023-produksjonen. (Men skal teste på enkelt næringer først)
Modeller kan alltid forbedres. Med flere ressurser, spesielt tid, kan det være verdt å undersøke flere andre muligheter, som:
- Å trene modeller for spesifikke industrier. Spesielt hvis disse industriene er særlig unike. For eksempel, for salg av bensin og diesel kan vi prøve å bruke ulike veiinfrastrukturfunksjoner (avstand til nærmeste bensinstasjoner, hvor ofte en vei brukes, etc.):
- Korttransaksjonsdata kan snart bli tilgjengelig, noe som åpner for muligheten for bedre feature engineering - spesielt for detaljhandelsindustrier.
- Det er en mulighet til å identifisere hvilken bransje et selskap kan tilhøre, og som et resultat, identifisere selskaper som for øyeblikket er tildelt feil bransje (nøkkelen som alt aggregeres etter). Nåværende klassifiseringsmodeller presterer dårlig, som vist nedenfor. Men disse bruker bare økonomiske data; jeg forventer at hvis vi bruker funksjoner som stillingstitler (antall ansatte under en gitt stillingstittel), vil modellene prestere bedre.
Veinettverksdata:
Klassifiseringsytelse (så langt)