Er dine funktioner vigtige? Det betyder ikke, at de er gode - KDnuggets

Er dine funktioner vigtige? Det betyder ikke, at de er gode – KDnuggets

Kildeknude: 2893531

Er dine funktioner vigtige? Det betyder ikke, at de er gode
[Billede efter forfatter]

 

Begrebet "funktionsvigtighed" er meget brugt i maskinlæring som den mest grundlæggende type modelforklarlighed. For eksempel bruges det i Recursive Feature Elimination (RFE), for iterativt at droppe den mindst vigtige funktion i modellen.

Der er dog en misforståelse om det.

Det faktum, at en funktion er vigtig, betyder ikke, at den er gavnlig for modellen!

Når vi siger, at en funktion er vigtig, betyder det ganske enkelt, at funktionen giver et højt bidrag til de forudsigelser, som modellen giver. Men det bør vi overveje et sådant bidrag kan være forkert.

Tag et simpelt eksempel: en dataforsker glemmer ved et uheld kunde-id'et mellem modellens funktioner. Modellen bruger Customer ID som en meget forudsigelig funktion. Som en konsekvens vil denne funktion have en høj funktionsvigtighed, selvom den faktisk forværrer modellen, fordi den ikke kan fungere godt på usete data.

For at gøre tingene klarere, bliver vi nødt til at skelne mellem to begreber:

  • Forudsigelsesbidrag: hvilken del af forudsigelserne skyldes funktionen; dette svarer til egenskabens betydning.
  • Fejlbidrag: hvilken del af forudsigelsesfejlene skyldes tilstedeværelsen af ​​funktionen i modellen.

I denne artikel vil vi se, hvordan man beregner disse mængder, og hvordan man bruger dem til at få værdifuld indsigt om en forudsigelsesmodel (og for at forbedre den).

Bemærk: denne artikel er fokuseret på regressionstilfældet. Er du mere interesseret i klassifikationssagen, kan du læse "Hvilke funktioner er skadelige for din klassificeringsmodel?"

Antag, at vi byggede en model til at forudsige folks indkomst baseret på deres job, alder og nationalitet. Nu bruger vi modellen til at lave forudsigelser på tre personer.

Således har vi grundsandheden, modelforudsigelsen og den resulterende fejl:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Grundsandhed, modelforudsigelse og absolut fejl (i tusindvis af $). [Billede efter forfatter]

 

Når vi har en prædiktiv model, kan vi altid dekomponere modelforudsigelserne i bidragene fra de enkelte funktioner. Dette kan gøres gennem SHAP-værdier (hvis du ikke ved, hvordan SHAP-værdier virker, kan du læse min artikel: SHAP-værdier forklarede nøjagtigt, hvordan du ønskede, at nogen forklarede dig).

Så lad os sige, at disse er SHAP-værdierne i forhold til vores model for de tre individer.

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
SHAP-værdier for vores models forudsigelser (i tusindvis af $). [Billede efter forfatter]

 

Den vigtigste egenskab ved SHAP-værdier er, at de er additive. Det betyder, at - ved at tage summen af ​​hver række - vil vi få vores models forudsigelse for det pågældende individ. For eksempel, hvis vi tager den anden række: 72k $ +3k $ -22k $ = 53k $, hvilket er præcis modellens forudsigelse for det andet individ.

Nu er SHAP-værdier en god indikator for, hvor vigtig en funktion er for vores forudsigelser. Jo højere (absolut) SHAP-værdien er, jo mere indflydelsesrig er funktionen for forudsigelsen om det specifikke individ. Bemærk, at jeg taler om absolutte SHAP-værdier, fordi tegnet her er ligegyldigt: en funktion er lige så vigtig, hvis den skubber forudsigelsen op eller ned.

Derfor, forudsigelsesbidraget for et element er lig med gennemsnittet af de absolutte SHAP-værdier for det pågældende element. Hvis du har SHAP-værdierne gemt i en Pandas-dataramme, er dette så simpelt som:

prediction_contribution = shap_values.abs().mean()

I vores eksempel er dette resultatet:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Forudsigelsesbidrag. [Billede efter forfatter]

 

Som du kan se, er job klart den vigtigste funktion, da det i gennemsnit tegner sig for 71.67k $ af den endelige forudsigelse. Nationalitet og alder er henholdsvis den anden og den tredje mest relevante funktion.

Det faktum, at en given feature står for en relevant del af den endelige forudsigelse, fortæller dog ikke noget om featurens ydeevne. For også at overveje dette aspekt, bliver vi nødt til at beregne "Fejlbidraget".

Lad os sige, at vi ønsker at besvare følgende spørgsmål: "Hvilke forudsigelser ville modellen lave, hvis den ikke havde funktionen arbejde?” SHAP-værdier giver os mulighed for at besvare dette spørgsmål. Faktisk, da de er additive, er det nok at trække SHAP-værdierne fra i forhold til funktionen arbejde fra modellens forudsigelser.

Selvfølgelig kan vi gentage denne procedure for hver funktion. I Pandas:

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

Dette er resultatet:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Forudsigelser, som vi ville opnå, hvis vi fjernede den respektive funktion. [Billede efter forfatter]

 

Det betyder, at hvis vi ikke havde funktionen arbejde, så ville modellen forudsige 20k $ for den første person, -19k $ for den anden og -8k $ for den tredje. I stedet, hvis vi ikke havde funktionen alder, ville modellen forudsige 73k $ for den første person, 50k $ for den anden, og så videre.

Som du kan se, varierer forudsigelserne for hver person meget, hvis vi fjernede forskellige funktioner. Som en konsekvens ville også forudsigelsesfejlene være meget forskellige. Vi kan nemt beregne dem:

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

Resultatet er følgende:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Absolutte fejl, som vi ville få, hvis vi fjernede den respektive funktion. [Billede efter forfatter]

 

Det er de fejl, vi ville få, hvis vi fjernede den respektive funktion. Intuitivt, hvis fejlen er lille, så er fjernelse af funktionen ikke et problem - eller det er endda gavnligt - for modellen. Hvis fejlen er høj, er det ikke en god idé at fjerne funktionen.

Men vi kan mere end dette. Faktisk kan vi beregne forskellen mellem fejlene i den fulde model og de fejl, vi ville opnå uden funktionen:

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

Som er:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Forskel mellem fejlene i modellen og de fejl, vi ville have uden funktionen. [Billede efter forfatter]

 

Hvis dette nummer er:

  • negativ, så fører tilstedeværelsen af ​​funktionen til en reduktion i forudsigelsesfejlen, så funktionen fungerer godt til den observation!
  • positiv, så fører tilstedeværelsen af ​​funktionen til en stigning i forudsigelsesfejlen, så funktionen er dårlig for den observation.

Vi kan beregne "Fejlbidrag" som gennemsnittet af disse værdier for hver funktion. I Pandas:

error_contribution = error_diff.mean()

Dette er resultatet:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Fejlbidrag. [Billede efter forfatter]

 

Hvis denne værdi er positiv, betyder det, at tilstedeværelsen af ​​funktionen i modellen i gennemsnit fører til en højere fejl. Uden den funktion ville forudsigelsen generelt have været bedre. Med andre ord gør funktionen mere skade end gavn!

Tværtimod, jo mere negativ denne værdi er, jo mere gavnlig er funktionen for forudsigelserne, da dens tilstedeværelse fører til mindre fejl.

Lad os prøve at bruge disse begreber på et rigtigt datasæt.

Herefter vil jeg bruge et datasæt taget fra Pycaret (et Python-bibliotek under MIT licens). Datasættet kaldes "Guld", og det indeholder tidsserier af økonomiske data.

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Eksempel på datasæt. Funktionerne er alle udtrykt i procent, så -4.07 betyder et afkast på -4.07%. [Billede efter forfatter]

 

Funktionerne består i afkast af finansielle aktiver henholdsvis 22, 14, 7 og 1 dage før observationsøjeblikket ("T-22", "T-14", "T-7", "T-1"). Her er den udtømmende liste over alle de finansielle aktiver, der bruges som forudsigelsesfunktioner:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Liste over tilgængelige aktiver. Hvert aktiv observeres på tidspunktet -22, -14, -7 og -1. [Billede efter forfatter]

 

I alt har vi 120 funktioner.

Målet er at forudsige guldprisen (afkast) 22 dage frem i tiden ("Guld_T+22"). Lad os tage et kig på målvariablen.

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Histogram af variablen. [Billede efter forfatter]

 

Når jeg har indlæst datasættet, er disse trin, jeg udførte:

  1. Opdel det fulde datasæt tilfældigt: 33 % af rækkerne i træningsdatasættet, yderligere 33 % i valideringsdatasættet og de resterende 33 % i testdatasættet.
  2. Træn en LightGBM-regressor på træningsdatasættet.
  3. Foretag forudsigelser om trænings-, validerings- og testdatasæt ved hjælp af modellen trænet i det foregående trin.
  4. Beregn SHAP-værdier for trænings-, validerings- og testdatasæt ved hjælp af Python-biblioteket "shap".
  5. Beregn forudsigelsesbidraget og fejlbidraget for hver funktion på hvert datasæt (træning, validering og test) ved hjælp af den kode, vi har set i det foregående afsnit.

Lad os sammenligne fejlbidraget og forudsigelsesbidraget i træningsdatasættet. Vi vil bruge et scatterplot, så prikkerne identificerer modellens 120 funktioner.

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Forudsigelsesbidrag vs. fejlbidrag (på træningsdatasættet). [Billede efter forfatter]

 

Der er en meget negativ sammenhæng mellem forudsigelsesbidrag og fejlbidrag i træningssættet.

Og dette giver mening: da modellen lærer på træningsdatasættet, har den en tendens til at tillægge høj betydning (dvs. høj forudsigelsesbidrag) til de funktioner, der fører til en stor reduktion i forudsigelsesfejlen (dvs. meget negativ fejlbidrag).

Men dette tilføjer ikke meget til vores viden, vel?

Det, der virkelig betyder noget for os, er valideringsdatasættet. Valideringsdatasættet er faktisk den bedste proxy, vi kan have om, hvordan vores funktioner vil opføre sig på nye data. Så lad os lave den samme sammenligning på valideringssættet.

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Forudsigelsesbidrag vs. fejlbidrag (på valideringsdatasættet). [Billede efter forfatter]

 

Fra dette plot kan vi udtrække nogle meget mere interessante oplysninger.

Funktionerne i den nederste højre del af plottet er dem, som vores model korrekt tildeler stor betydning, da de faktisk medfører en reduktion i forudsigelsesfejlen.

Bemærk også, at "Gold_T-22" (gengivelse af guld 22 dage før observationsperioden) fungerer rigtig godt sammenlignet med den betydning, som modellen tillægger det. Det betyder at denne funktion er muligvis undertilpasset. Og denne information er særlig interessant, da guld er det aktiv, vi forsøger at forudsige ("Gold_T+22").

På den anden side, funktionerne, der har et fejlbidrag over 0, gør vores forudsigelser værre. For eksempel ændrer "US Bond ETF_T-1" i gennemsnit modelforudsigelsen med 0.092 % (forudsigelsesbidrag), men det får modellen til at gøre en forudsigelse i gennemsnit 0.013 % (fejlbidrag) værre, end den ville have været uden denne funktion. .

Det kan vi formode alle funktioner med et højt fejlbidrag (sammenlignet med deres forudsigelsesbidrag) er sandsynligvis overfitting eller generelt har de forskellig adfærd i træningssættet og i valideringssættet.

Lad os se, hvilke funktioner der har det største fejlbidrag.

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Funktioner sorteret efter faldende fejlbidrag. [Billede efter forfatter]

 

Og nu funktionerne med det laveste fejlbidrag:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Funktioner sorteret efter stigende fejlbidrag. [Billede efter forfatter]

 

Interessant nok kan vi observere, at alle funktionerne med højere fejlbidrag er relative til T-1 (1 dag før observationsøjeblikket), hvorimod næsten alle funktionerne med mindre fejlbidrag er relative til T-22 (22 dage før observationsøjeblikket). ).

Det tyder på det de seneste træk er tilbøjelige til at passe over, hvorimod træk, der er længere væk i tid, har en tendens til at generalisere bedre.

Bemærk, at uden fejlbidrag ville vi aldrig have kendt denne indsigt.

Traditionelle Rekursive Feature Elimination (RFE) metoder er baseret på fjernelse af uvæsentlige funktioner. Dette svarer til at fjerne funktionerne med et lille forudsigelsesbidrag først.

Men baseret på det, vi sagde i det foregående afsnit, ville det give mere mening at fjerne funktionerne med det højeste fejlbidrag først.

For at kontrollere, om vores intuition er verificeret, lad os sammenligne de to tilgange:

  • Traditionel RFE: fjerner ubrugelige funktioner først (laveste forudsigelsesbidrag).
  • Vores RFE: fjernelse af skadelige funktioner første (højeste fejlbidrag).

Lad os se resultaterne på valideringssættet:

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Gennemsnitlig absolut fejl af de to strategier på valideringssættet. [Billede efter forfatter]

 

Den bedste iteration for hver metode er blevet cirklet rundt: det er modellen med 19 funktioner til den traditionelle RFE (blå linje) og modellen med 17 funktioner til vores RFE (orange linje).

Generelt ser det ud til, at vores metode fungerer godt: fjernelse af funktionen med det højeste fejlbidrag fører til en konsekvent mindre MAE sammenlignet med at fjerne funktionen med det højeste forudsigelsesbidrag.

Men du tror måske, at dette fungerer godt, bare fordi vi overfitter valideringssættet. Vi er trods alt interesserede i det resultat, vi får på testsættet.

Så lad os se den samme sammenligning på testsættet.

 

Er dine funktioner vigtige? Det betyder ikke, at de er gode
Gennemsnitlig absolut fejl af de to strategier på testsættet. [Billede efter forfatter]

 

Resultatet ligner det forrige. Selvom der er mindre afstand mellem de to linjer, er MAE opnået ved at fjerne den højeste fejlbidrager klart bedre end MAE ved opnået fjernelse af den laveste forudsigelsesbidrager.

Da vi valgte de modeller, der fører til den mindste MAE på valideringssættet, lad os se deres resultat på testsættet:

  • RFE-forudsigelsesbidrag (19 funktioner). MAE på testsæt: 2.04.
  • RFE-fejlbidrag (17 funktioner). MAE på testsæt: 1.94.

Så den bedste MAE ved hjælp af vores metode er 5% bedre sammenlignet med traditionel RFE!

Begrebet funktions betydning spiller en grundlæggende rolle i maskinlæring. Begrebet "vigtighed" forveksles dog ofte med "godhed".

For at skelne mellem disse to aspekter har vi introduceret to begreber: Prediction Contribution og Error Contribution. Begge koncepter er baseret på SHAP-værdierne for valideringsdatasættet, og i artiklen har vi set Python-koden til at beregne dem.

Vi har også prøvet dem på et rigtigt finansielt datasæt (hvor opgaven er at forudsige prisen på guld) og bevist, at rekursiv feature-eliminering baseret på fejlbidrag fører til en 5 % bedre gennemsnitlig absolut fejl sammenlignet med traditionel RFE baseret på forudsigelsesbidrag.

Al koden brugt til denne artikel kan findes i denne notesbog.

Tak for at læse!

 
 
Samuele Mazzanti er Lead Data Scientist hos Jakala og bor i øjeblikket i Rom. Han er uddannet i statistik, og hans vigtigste forskningsinteresser vedrører maskinlæringsapplikationer til industrien. Han er også freelance-indholdsskaber.

 
Original. Genopslået med tilladelse.
 

Tidsstempel:

Mere fra KDnuggets