Är dina funktioner viktiga? Det betyder inte att de är bra - KDnuggets

Är dina funktioner viktiga? Det betyder inte att de är bra – KDnuggets

Källnod: 2893531

Är dina funktioner viktiga? Det betyder inte att de är bra
[Bild av författare]

 

Begreppet "funktionsviktighet" används i stor utsträckning inom maskininlärning som den mest grundläggande typen av modellförklarbarhet. Till exempel används den i Rekursiv Feature Elimination (RFE), för att iterativt ta bort den minst viktiga egenskapen i modellen.

Det finns dock en missuppfattning om det.

Att en funktion är viktig betyder inte att den är fördelaktig för modellen!

Faktum är att när vi säger att en funktion är viktig, betyder det helt enkelt att funktionen ger ett högt bidrag till de förutsägelser som modellen gör. Men det bör vi överväga ett sådant bidrag kan vara fel.

Ta ett enkelt exempel: en dataforskare glömmer av misstag kund-ID mellan modellens funktioner. Modellen använder kund-ID som en mycket prediktiv funktion. Som en konsekvens kommer denna funktion att ha en hög funktionsviktighet även om den faktiskt försämrar modellen, eftersom den inte kan fungera bra på osynliga data.

För att göra saker tydligare kommer vi att behöva göra en skillnad mellan två begrepp:

  • Förutsägelsebidrag: vilken del av förutsägelserna beror på funktionen; detta motsvarar egenskapens betydelse.
  • Fel Bidrag: vilken del av prediktionsfelen beror på förekomsten av funktionen i modellen.

I den här artikeln kommer vi att se hur man beräknar dessa kvantiteter och hur man använder dem för att få värdefulla insikter om en prediktiv modell (och för att förbättra den).

Obs: den här artikeln fokuserar på regressionsfallet. Om du är mer intresserad av klassificeringsfallet kan du läsa "Vilka funktioner är skadliga för din klassificeringsmodell?"

Anta att vi byggde en modell för att förutsäga människors inkomst baserat på deras jobb, ålder och nationalitet. Nu använder vi modellen för att göra förutsägelser på tre personer.

Således har vi grundsanningen, modellförutsägelsen och det resulterande felet:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Grundsanning, modellförutsägelse och absolut fel (i tusentals $). [Bild av författare]

 

När vi har en prediktiv modell kan vi alltid dekomponera modellförutsägelserna i bidragen från de enskilda funktionerna. Detta kan göras genom SHAP-värden (om du inte vet hur SHAP-värden fungerar kan du läsa min artikel: SHAP-värden förklarade exakt hur du önskade att någon förklarade för dig).

Så låt oss säga att dessa är SHAP-värdena i förhållande till vår modell för de tre individerna.

 

Är dina funktioner viktiga? Det betyder inte att de är bra
SHAP-värden för vår modells förutsägelser (i tusentals $). [Bild av författare]

 

Den huvudsakliga egenskapen hos SHAP-värden är att de är additiva. Det betyder att – genom att ta summan av varje rad – kommer vi att få vår modells förutsägelse för den individen. Om vi ​​till exempel tar den andra raden: 72k $ +3k $ -22k $ = 53k $, vilket är exakt modellens förutsägelse för den andra individen.

Nu är SHAP-värden en bra indikator på hur viktig en funktion är för våra förutsägelser. Faktum är att ju högre (absolut) SHAP-värdet är, desto mer inflytelserik blir funktionen för förutsägelsen om den specifika individen. Observera att jag pratar om absoluta SHAP-värden eftersom tecknet här inte spelar någon roll: en funktion är lika viktig om den trycker förutsägelsen uppåt eller nedåt.

Därför, Förutsägelsebidraget för en egenskap är lika med medelvärdet av de absoluta SHAP-värdena för den egenskapen. Om du har SHAP-värdena lagrade i en Pandas dataram är detta så enkelt som:

prediction_contribution = shap_values.abs().mean()

I vårt exempel är detta resultatet:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Förutsägelsebidrag. [Bild av författare]

 

Som du kan se är jobbet klart den viktigaste funktionen eftersom det i genomsnitt står för 71.67k $ av den slutliga förutsägelsen. Nationalitet och ålder är den andra respektive den tredje mest relevanta egenskapen.

Det faktum att en given funktion står för en relevant del av den slutliga förutsägelsen säger dock ingenting om funktionens prestanda. För att även beakta denna aspekt måste vi beräkna "Felbidraget".

Låt oss säga att vi vill svara på följande fråga: "Vilka förutsägelser skulle modellen göra om den inte hade funktionen jobb?” SHAP-värden gör att vi kan svara på denna fråga. Faktum är att eftersom de är additiva räcker det att subtrahera SHAP-värdena i förhållande till funktionen jobb från de förutsägelser som modellen gjort.

Naturligtvis kan vi upprepa denna procedur för varje funktion. I Pandas:

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

Detta är resultatet:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Förutsägelser som vi skulle få om vi tog bort respektive funktion. [Bild av författare]

 

Detta betyder att om vi inte hade funktionen jobb, då skulle modellen förutsäga 20k $ för den första individen, -19k $ för den andra och -8k $ för den tredje. Istället om vi inte hade funktionen ålder, skulle modellen förutsäga 73k $ för den första individen, 50k $ för den andra, och så vidare.

Som du kan se varierar förutsägelserna för varje individ mycket om vi tog bort olika funktioner. Som en konsekvens skulle även prediktionsfelen vara mycket olika. Vi kan enkelt beräkna dem:

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

Resultatet är följande:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Absoluta fel som vi skulle få om vi tog bort respektive funktion. [Bild av författare]

 

Det här är de fel som vi skulle få om vi tog bort respektive funktion. Intuitivt, om felet är litet, är det inte ett problem att ta bort funktionen - eller det är till och med fördelaktigt - för modellen. Om felet är högt är det ingen bra idé att ta bort funktionen.

Men vi kan göra mer än så här. Vi kan faktiskt beräkna skillnaden mellan felen i den fullständiga modellen och de fel vi skulle få utan funktionen:

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

Vilket är:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Skillnad mellan felen i modellen och de fel vi skulle ha utan funktionen. [Bild av författare]

 

Om detta nummer är:

  • negativ, då leder närvaron av funktionen till en minskning av prediktionsfelet, så funktionen fungerar bra för den observationen!
  • positiv, då leder närvaron av funktionen till en ökning av prediktionsfelet, så funktionen är dålig för den observationen.

Vi kan beräkna "Felbidrag" som medelvärdet av dessa värden, för varje funktion. I Pandas:

error_contribution = error_diff.mean()

Detta är resultatet:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Fel Bidrag. [Bild av författare]

 

Om detta värde är positivt betyder det att förekomsten av funktionen i modellen i genomsnitt leder till ett högre fel. Utan den funktionen hade alltså förutsägelsen generellt sett varit bättre. Med andra ord, funktionen gör mer skada än nytta!

Tvärtom, ju mer negativt detta värde är, desto mer fördelaktigt är funktionen för förutsägelserna eftersom dess närvaro leder till mindre fel.

Låt oss försöka använda dessa begrepp på en riktig datauppsättning.

Härefter kommer jag att använda en datauppsättning hämtad från Pycaret (ett Python-bibliotek under MIT-licens). Datauppsättningen kallas "Gold" och den innehåller tidsserier av finansiell data.

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Datauppsättning exempel. Funktionerna är alla uttryckta i procent, så -4.07 betyder en avkastning på -4.07%. [Bild av författare]

 

Funktionerna består av avkastningen av finansiella tillgångar 22, 14, 7 respektive 1 dagar före observationsögonblicket ("T-22", "T-14", "T-7", "T-1"). Här är den uttömmande listan över alla finansiella tillgångar som används som prediktiva funktioner:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Lista över tillgängliga tillgångar. Varje tillgång observeras vid tidpunkten -22, -14, -7 och -1. [Bild av författare]

 

Totalt har vi 120 funktioner.

Målet är att förutsäga guldpriset (avkastning) 22 dagar framåt i tiden ("Gold_T+22"). Låt oss ta en titt på målvariabeln.

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Histogram för variabeln. [Bild av författare]

 

När jag väl har laddat upp datamängden är dessa steg jag utförde:

  1. Dela upp hela datauppsättningen slumpmässigt: 33 % av raderna i träningsdatauppsättningen, ytterligare 33 % i valideringsdatauppsättningen och de återstående 33 % i testdatauppsättningen.
  2. Träna en LightGBM-regressor på träningsdatauppsättningen.
  3. Gör förutsägelser om träning, validering och testdatauppsättningar med hjälp av modellen som tränades i föregående steg.
  4. Beräkna SHAP-värden för tränings-, validerings- och testdatauppsättningar med hjälp av Python-biblioteket "shap".
  5. Beräkna prediktionsbidraget och felbidraget för varje funktion i varje datauppsättning (träning, validering och test), med hjälp av koden vi har sett i föregående stycke.

Låt oss jämföra felbidraget och prediktionsbidraget i träningsdatauppsättningen. Vi kommer att använda ett spridningsdiagram, så att prickarna identifierar modellens 120 funktioner.

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Förutsägelsebidrag vs. felbidrag (på träningsdatauppsättningen). [Bild av författare]

 

Det finns en mycket negativ korrelation mellan Prediction Contribution och Error Contribution i träningsuppsättningen.

Och detta är vettigt: eftersom modellen lär sig på träningsdatauppsättningen, tenderar den att tillskriva hög vikt (dvs högt bidrag till prediktionen) till de funktioner som leder till en stor minskning av prediktionsfelet (dvs. mycket negativt felbidrag).

Men detta tillför inte mycket till vår kunskap, eller hur?

Det som verkligen betyder något för oss är valideringsdataset. Valideringsdataset är faktiskt den bästa proxy vi kan ha om hur våra funktioner kommer att bete sig på ny data. Så låt oss göra samma jämförelse på valideringsuppsättningen.

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Förutsägelsebidrag vs. felbidrag (på valideringsdatauppsättningen). [Bild av författare]

 

Från denna handling kan vi extrahera mycket mer intressant information.

Funktionerna i den nedre högra delen av plotten är de som vår modell korrekt tilldelar hög vikt eftersom de faktiskt ger en minskning av prediktionsfelet.

Observera också att "Gold_T-22" (återlämnande av guld 22 dagar före observationsperioden) fungerar riktigt bra jämfört med den betydelse som modellen tillskriver det. Detta innebär att denna funktion är möjligen underpassad. Och denna information är särskilt intressant eftersom guld är den tillgång vi försöker förutsäga ("Gold_T+22").

Å andra sidan, funktionerna som har ett felbidrag över 0 gör våra förutsägelser värre. Till exempel ändrar "US Bond ETF_T-1" i genomsnitt modellprognosen med 0.092 % (Prediction Contribution), men det leder till att modellen gör en förutsägelse i genomsnitt 0.013 % (Error Contribution) sämre än den skulle ha varit utan den funktionen .

Det kan vi anta alla funktioner med ett högt felbidrag (jämfört med deras prediktionsbidrag) är förmodligen överanpassade eller i allmänhet har de olika beteende i träningssetet och i valideringssetet.

Låt oss se vilka funktioner som har störst felbidrag.

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Funktioner sorterade genom att minska felbidrag. [Bild av författare]

 

Och nu funktionerna med det lägsta felbidraget:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Funktioner sorterade efter att öka felbidrag. [Bild av författare]

 

Intressant nog kan vi observera att alla funktioner med högre felbidrag är relativa till T-1 (1 dag före observationsögonblicket), medan nästan alla funktioner med mindre felbidrag är relativa till T-22 (22 dagar före observationsögonblicket) ).

Detta verkar tyda på det de senaste funktionerna är benägna att överanpassa, medan funktioner som är längre bort i tiden tenderar att generaliseras bättre.

Observera att utan felbidrag skulle vi aldrig ha känt till denna insikt.

Traditionella metoder för eliminering av rekursiva egenskaper (RFE) är baserade på att oviktiga egenskaper tas bort. Detta motsvarar att ta bort funktionerna med ett litet förslagsbidrag först.

Men baserat på vad vi sa i föregående stycke skulle det vara mer meningsfullt att ta bort funktionerna med det högsta felbidraget först.

För att kontrollera om vår intuition är verifierad, låt oss jämföra de två tillvägagångssätten:

  • Traditionell RFE: ta bort onödiga funktioner först (lägsta prediktionsbidraget).
  • Vår RFE: tar bort skadliga egenskaper först (högsta felbidraget).

Låt oss se resultaten på valideringsuppsättningen:

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Genomsnittligt absolut fel för de två strategierna i valideringsuppsättningen. [Bild av författare]

 

Den bästa iterationen för varje metod har ringats in: det är modellen med 19 funktioner för den traditionella RFE (blå linje) och modellen med 17 funktioner för vår RFE (orange linje).

Generellt sett verkar det som om vår metod fungerar bra: att ta bort funktionen med det högsta felbidraget leder till en konsekvent mindre MAE jämfört med att ta bort funktionen med det högsta prediktionsbidraget.

Men du kanske tycker att detta fungerar bra bara för att vi överanpassar valideringssetet. Vi är trots allt intresserade av resultatet som vi kommer att få på testsetet.

Så låt oss se samma jämförelse på testsetet.

 

Är dina funktioner viktiga? Det betyder inte att de är bra
Genomsnittligt absolut fel för de två strategierna på testsetet. [Bild av författare]

 

Resultatet liknar det föregående. Även om det är mindre avstånd mellan de två linjerna, är MAE som erhålls genom att ta bort den högsta felbidragsgivaren klart bättre än MAE genom att ta bort den lägsta prediktionsbidragsgivaren.

Eftersom vi valde de modeller som leder till den minsta MAE i valideringssetet, låt oss se deras resultat på testsetet:

  • RFE-förutsägelsebidrag (19 funktioner). MAE på testset: 2.04.
  • RFE-felbidrag (17 funktioner). MAE på testset: 1.94.

Så den bästa MAE som använder vår metod är 5% bättre jämfört med traditionell RFE!

Begreppet funktionsviktighet spelar en grundläggande roll i maskininlärning. Men begreppet "viktighet" förväxlas ofta med "godhet".

För att skilja mellan dessa två aspekter har vi introducerat två begrepp: Prediction Contribution och Error Contribution. Båda koncepten är baserade på SHAP-värdena för valideringsdatasetet, och i artikeln har vi sett Python-koden för att beräkna dem.

Vi har också provat dem på en verklig finansiell datauppsättning (där uppgiften är att förutsäga priset på guld) och bevisat att rekursiv funktionseliminering baserad på felbidrag leder till ett 5% bättre genomsnittligt absolut fel jämfört med traditionell RFE baserad på prediktionsbidrag.

All kod som används för den här artikeln finns i den här anteckningsboken.

Tack för att du läste!

 
 
Samuele Mazzanti är Lead Data Scientist på Jakala och bor för närvarande i Rom. Han tog examen i statistik och hans huvudsakliga forskningsintressen rör maskininlärningsapplikationer för industrin. Han är också frilansande innehållsskapare.

 
Ursprungliga. Skickas om med tillstånd.
 

Tidsstämpel:

Mer från KDnuggets