Er funksjonene dine viktige? Det betyr ikke at de er gode - KDnuggets

Er funksjonene dine viktige? Det betyr ikke at de er gode – KDnuggets

Kilde node: 2893531

Er funksjonene dine viktige? Det betyr ikke at de er gode
[Bilde av forfatter]

 

Konseptet "funksjonsviktighet" er mye brukt i maskinlæring som den mest grunnleggende typen modellforklaring. For eksempel brukes den i Rekursive Feature Elimination (RFE), for iterativt å droppe den minst viktige funksjonen i modellen.

Det er imidlertid en misforståelse om det.

At en funksjon er viktig betyr ikke at den er gunstig for modellen!

Faktisk, når vi sier at en funksjon er viktig, betyr dette ganske enkelt at funksjonen gir et høyt bidrag til spådommene laget av modellen. Men det bør vi vurdere slikt bidrag kan være feil.

Ta et enkelt eksempel: en dataforsker glemmer ved et uhell kunde-ID-en mellom modellens funksjoner. Modellen bruker kunde-ID som en svært prediktiv funksjon. Som en konsekvens vil denne funksjonen ha en høy funksjonsviktighet selv om den faktisk forverrer modellen, fordi den ikke fungerer bra på usett data.

For å gjøre ting klarere, må vi skille mellom to konsepter:

  • Prediksjonsbidrag: hvilken del av spådommene skyldes funksjonen; dette tilsvarer funksjonens betydning.
  • Feilbidrag: hvilken del av prediksjonsfeilene som skyldes tilstedeværelsen av funksjonen i modellen.

I denne artikkelen vil vi se hvordan du beregner disse mengdene og hvordan du bruker dem for å få verdifull innsikt om en prediktiv modell (og for å forbedre den).

Merk: denne artikkelen er fokusert på regresjonstilfellet. Er du mer interessert i klassifiseringssaken kan du lese "Hvilke funksjoner er skadelige for klassifiseringsmodellen din?"

Anta at vi bygget en modell for å forutsi inntekten til folk basert på jobb, alder og nasjonalitet. Nå bruker vi modellen til å lage spådommer på tre personer.

Dermed har vi grunnsannheten, modellprediksjonen og den resulterende feilen:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Grunnsannhet, modellprediksjon og absolutt feil (i tusenvis av $). [Bilde av forfatter]

 

Når vi har en prediktiv modell, kan vi alltid dekomponere modellprediksjonene til bidragene fra de enkelte funksjonene. Dette kan gjøres gjennom SHAP-verdier (hvis du ikke vet hvordan SHAP-verdier fungerer, kan du lese artikkelen min: SHAP-verdier forklarte nøyaktig hvordan du ønsket at noen forklarte deg).

Så la oss si at dette er SHAP-verdiene i forhold til modellen vår for de tre individene.

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
SHAP-verdier for modellens spådommer (i tusenvis av $). [Bilde av forfatter]

 

Hovedegenskapen til SHAP-verdier er at de er additive. Dette betyr at – ved å ta summen av hver rad – vil vi få modellens prediksjon for den personen. For eksempel, hvis vi tar den andre raden: 72k $ +3k $ -22k $ = 53k $, som er nøyaktig modellens prediksjon for den andre personen.

Nå er SHAP-verdier en god indikator på hvor viktig en funksjon er for våre spådommer. Faktisk, jo høyere (absolutt) SHAP-verdien er, desto mer innflytelsesrik er funksjonen for spådommen om den spesifikke personen. Merk at jeg snakker om absolutte SHAP-verdier fordi tegnet her spiller ingen rolle: en funksjon er like viktig hvis den skyver prediksjonen opp eller ned.

Derfor, Prediksjonsbidraget til en funksjon er lik gjennomsnittet av de absolutte SHAP-verdiene til den funksjonen. Hvis du har SHAP-verdiene lagret i en Pandas-dataramme, er dette så enkelt som:

prediction_contribution = shap_values.abs().mean()

I vårt eksempel er dette resultatet:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Prediksjonsbidrag. [Bilde av forfatter]

 

Som du kan se, er jobb helt klart den viktigste funksjonen siden den i gjennomsnitt utgjør 71.67k $ av den endelige prediksjonen. Nasjonalitet og alder er henholdsvis den andre og den tredje mest relevante egenskapen.

Det faktum at en gitt funksjon står for en relevant del av den endelige prediksjonen forteller imidlertid ikke noe om funksjonens ytelse. For å vurdere også dette aspektet, må vi beregne "Feilbidrag".

La oss si at vi ønsker å svare på følgende spørsmål: "Hvilke spådommer ville modellen gjort hvis den ikke hadde funksjonen jobb?” SHAP-verdier lar oss svare på dette spørsmålet. Faktisk, siden de er additive, er det nok å trekke fra SHAP-verdiene i forhold til funksjonen jobb fra spådommene laget av modellen.

Selvfølgelig kan vi gjenta denne prosedyren for hver funksjon. I Pandas:

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

Dette er resultatet:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Spådommer som vi ville oppnå hvis vi fjernet den respektive funksjonen. [Bilde av forfatter]

 

Dette betyr at hvis vi ikke hadde funksjonen jobb, da vil modellen forutsi 20k $ for den første personen, -19k $ for den andre, og -8k $ for den tredje. I stedet, hvis vi ikke hadde funksjonen alder, vil modellen forutsi 73k $ for den første personen, 50k $ for den andre, og så videre.

Som du kan se, varierer spådommene for hvert individ mye hvis vi fjernet forskjellige funksjoner. Som en konsekvens vil også prediksjonsfeilene være svært forskjellige. Vi kan enkelt beregne dem:

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

Resultatet er følgende:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Absolutte feil som vi ville oppnå hvis vi fjernet den respektive funksjonen. [Bilde av forfatter]

 

Dette er feilene vi ville fått hvis vi fjernet den respektive funksjonen. Intuitivt, hvis feilen er liten, er det ikke noe problem å fjerne funksjonen - eller det er til og med fordelaktig - for modellen. Hvis feilen er høy, er det ikke en god idé å fjerne funksjonen.

Men vi kan gjøre mer enn dette. Faktisk kan vi beregne forskjellen mellom feilene til den fullstendige modellen og feilene vi ville oppnådd uten funksjonen:

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

Som er:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Forskjellen mellom feilene til modellen og feilene vi ville hatt uten funksjonen. [Bilde av forfatter]

 

Hvis dette tallet er:

  • negativ, så fører tilstedeværelsen av funksjonen til en reduksjon i prediksjonsfeilen, så funksjonen fungerer bra for den observasjonen!
  • positiv, så fører tilstedeværelsen av funksjonen til en økning i prediksjonsfeilen, så funksjonen er dårlig for den observasjonen.

Vi kan beregne "Feilbidrag" som gjennomsnittet av disse verdiene, for hver funksjon. I Pandas:

error_contribution = error_diff.mean()

Dette er resultatet:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Feilbidrag. [Bilde av forfatter]

 

Hvis denne verdien er positiv, betyr det at tilstedeværelsen av funksjonen i modellen i gjennomsnitt fører til en høyere feil. Uten den funksjonen ville derfor spådommen generelt vært bedre. Med andre ord, funksjonen gjør mer skade enn nytte!

Tvert imot, jo mer negativ denne verdien er, desto mer fordelaktig er funksjonen for spådommene siden dens tilstedeværelse fører til mindre feil.

La oss prøve å bruke disse konseptene på et ekte datasett.

Deretter vil jeg bruke et datasett hentet fra Pycaret (et Python-bibliotek under MIT-lisens). Datasettet kalles «Gull» og inneholder tidsserier med økonomiske data.

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Datasetteksempel. Funksjonene er alle uttrykt i prosent, så -4.07 betyr en avkastning på -4.07%. [Bilde av forfatter]

 

Funksjonene består i avkastningen av finansielle eiendeler henholdsvis 22, 14, 7 og 1 dager før observasjonsøyeblikket ("T-22", "T-14", "T-7", "T-1"). Her er den uttømmende listen over alle finansielle eiendeler som brukes som prediktive funksjoner:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Liste over tilgjengelige eiendeler. Hvert aktiva observeres til tiden -22, -14, -7 og -1. [Bilde av forfatter]

 

Totalt har vi 120 funksjoner.

Målet er å forutsi gullprisen (avkastning) 22 dager frem i tid ("Gold_T+22"). La oss ta en titt på målvariabelen.

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Histogram av variabelen. [Bilde av forfatter]

 

Når jeg lastet inn datasettet, er disse trinnene jeg utførte:

  1. Del opp hele datasettet tilfeldig: 33 % av radene i treningsdatasettet, ytterligere 33 % i valideringsdatasettet og de resterende 33 % i testdatasettet.
  2. Tren en LightGBM-regressor på treningsdatasettet.
  3. Lag spådommer om trening, validering og testdatasett ved å bruke modellen som ble trent i forrige trinn.
  4. Beregn SHAP-verdier for trenings-, validerings- og testdatasett ved å bruke Python-biblioteket "shap".
  5. Beregn prediksjonsbidraget og feilbidraget for hver funksjon på hvert datasett (trening, validering og test), ved å bruke koden vi har sett i forrige avsnitt.

La oss sammenligne feilbidraget og prediksjonsbidraget i treningsdatasettet. Vi vil bruke et spredningsplott, slik at prikkene identifiserer de 120 funksjonene til modellen.

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Prediksjonsbidrag vs. feilbidrag (på opplæringsdatasettet). [Bilde av forfatter]

 

Det er en svært negativ korrelasjon mellom Prediction Contribution og Error Contribution i treningssettet.

Og dette gir mening: siden modellen lærer på opplæringsdatasettet, har den en tendens til å tillegge høy betydning (dvs. høyt prediksjonsbidrag) til de funksjonene som fører til en stor reduksjon i prediksjonsfeilen (dvs. svært negativt feilbidrag).

Men dette tilfører ikke mye til vår kunnskap, ikke sant?

Det som virkelig betyr noe for oss er valideringsdatasettet. Valideringsdatasettet er faktisk den beste proxy vi kan ha om hvordan funksjonene våre vil oppføre seg på nye data. Så la oss gjøre den samme sammenligningen på valideringssettet.

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Prediksjonsbidrag vs. feilbidrag (på valideringsdatasettet). [Bilde av forfatter]

 

Fra dette plottet kan vi trekke ut mye mer interessant informasjon.

Funksjonene i nedre høyre del av plottet er de som modellen vår riktig tildeler stor betydning siden de faktisk gir en reduksjon i prediksjonsfeilen.

Vær også oppmerksom på at "Gold_T-22" (retur av gull 22 dager før observasjonsperioden) fungerer veldig bra sammenlignet med viktigheten som modellen tillegger det. Dette betyr at denne funksjonen er muligens undertilpasset. Og denne informasjonen er spesielt interessant siden gull er eiendelen vi prøver å forutsi ("Gold_T+22").

På den annen side, funksjonene som har et feilbidrag over 0, gjør spådommene våre verre. For eksempel endrer "US Bond ETF_T-1" i gjennomsnitt modellprediksjonen med 0.092 % (Prediction Contribution), men det fører til at modellen gjør en prediksjon gjennomsnittlig 0.013 % (Feilbidrag) dårligere enn den ville vært uten den funksjonen .

Det kan vi anta alle funksjonene med et høyt feilbidrag (sammenlignet med deres prediksjonsbidrag) er sannsynligvis overtilpassede eller generelt har de ulik oppførsel i treningssettet og i valideringssettet.

La oss se hvilke funksjoner som har størst feilbidrag.

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Funksjoner sortert etter å redusere feilbidrag. [Bilde av forfatter]

 

Og nå funksjonene med det laveste feilbidraget:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Funksjoner sortert etter økende feilbidrag. [Bilde av forfatter]

 

Interessant nok kan vi observere at alle funksjonene med høyere feilbidrag er relative til T-1 (1 dag før observasjonsøyeblikket), mens nesten alle funksjonene med mindre feilbidrag er relative til T-22 (22 dager før observasjonsøyeblikket) ).

Dette ser ut til å indikere det de nyeste funksjonene er tilbøyelige til overtilpasning, mens funksjonene som er lengre unna i tid har en tendens til å generalisere bedre.

Merk at uten feilbidrag ville vi aldri ha visst denne innsikten.

Tradisjonelle metoder for rekursiv funksjonseliminering (RFE) er basert på fjerning av uviktige funksjoner. Dette tilsvarer å fjerne funksjonene med et lite prediksjonsbidrag først.

Men basert på det vi sa i forrige avsnitt, ville det være mer fornuftig å fjerne funksjonene med høyest feilbidrag først.

For å sjekke om vår intuisjon er verifisert, la oss sammenligne de to tilnærmingene:

  • Tradisjonell RFE: fjerner ubrukelige funksjoner først (laveste prediksjonsbidrag).
  • Vår RFE: fjerning av skadelige funksjoner først (høyeste feilbidrag).

La oss se resultatene på valideringssettet:

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Gjennomsnittlig absolutt feil for de to strategiene på valideringssettet. [Bilde av forfatter]

 

Den beste iterasjonen for hver metode er satt rundt: det er modellen med 19 funksjoner for den tradisjonelle RFE (blå linje) og modellen med 17 funksjoner for vår RFE (oransje linje).

Generelt ser det ut til at metoden vår fungerer bra: fjerning av funksjonen med høyest feilbidrag fører til en konsekvent mindre MAE sammenlignet med fjerning av funksjonen med høyest prediksjonsbidrag.

Du kan imidlertid tro at dette fungerer bra bare fordi vi overpasser valideringssettet. Vi er tross alt interessert i resultatet som vi får på testsettet.

Så la oss se den samme sammenligningen på testsettet.

 

Er funksjonene dine viktige? Det betyr ikke at de er gode
Gjennomsnittlig absolutt feil for de to strategiene på testsettet. [Bilde av forfatter]

 

Resultatet er likt det forrige. Selv om det er mindre avstand mellom de to linjene, er MAE oppnådd ved å fjerne den høyeste feilbidragsyteren klart bedre enn MAE ved å oppnå fjerning av laveste prediksjonsbidragsyter.

Siden vi valgte modellene som fører til den minste MAE på valideringssettet, la oss se resultatet på testsettet:

  • RFE-prediksjonsbidrag (19 funksjoner). MAE på testsett: 2.04.
  • RFE-feilbidrag (17 funksjoner). MAE på testsett: 1.94.

Så den beste MAE som bruker metoden vår er 5 % bedre sammenlignet med tradisjonell RFE!

Konseptet med funksjonsviktighet spiller en grunnleggende rolle i maskinlæring. Imidlertid blir forestillingen om "viktighet" ofte forvekslet med "godhet".

For å skille mellom disse to aspektene har vi introdusert to konsepter: Prediction Contribution og Error Contribution. Begge konseptene er basert på SHAP-verdiene til valideringsdatasettet, og i artikkelen har vi sett Python-koden for å beregne dem.

Vi har også prøvd dem på et ekte økonomisk datasett (der oppgaven er å forutsi prisen på gull) og bevist at rekursiv funksjonseliminering basert på feilbidrag fører til en 5 % bedre gjennomsnittlig absolutt feil sammenlignet med tradisjonell RFE basert på prediksjonsbidrag.

All koden som brukes for denne artikkelen finner du i denne notatboken.

Takk for at du leser!

 
 
Samuele Mazzanti er Lead Data Scientist ved Jakala og bor for tiden i Roma. Han ble uteksaminert i statistikk og hans viktigste forskningsinteresser gjelder maskinlæringsapplikasjoner for industrien. Han er også en freelance innholdsskaper.

 
original. Ompostet med tillatelse.
 

Tidstempel:

Mer fra KDnuggets