Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn - KDnuggets

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn – KDnuggets

Bronknooppunt: 2893531

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
[Afbeelding door auteur]

 

Het concept van ‘functiebelang’ wordt veel gebruikt in machinaal leren als het meest basale type modelverklaarbaarheid. Het wordt bijvoorbeeld gebruikt bij Recursive Feature Elimination (RFE), om iteratief het minst belangrijke kenmerk van het model te laten vallen.

Er bestaat echter een misvatting over.

Het feit dat een kenmerk belangrijk is, betekent niet dat het gunstig is voor het model!

Als we zeggen dat een kenmerk belangrijk is, betekent dit eenvoudigweg dat het kenmerk een hoge bijdrage levert aan de voorspellingen van het model. Maar dat moeten we overwegen een dergelijke bijdrage kan verkeerd zijn.

Neem een ​​eenvoudig voorbeeld: een datawetenschapper vergeet per ongeluk de klant-ID tussen de functies van zijn model. Het model gebruikt klant-ID als een zeer voorspellende functie. Als gevolg hiervan zal dit kenmerk van groot belang zijn, zelfs als het het model feitelijk verslechtert, omdat het niet goed kan werken op onzichtbare gegevens.

Om de zaken duidelijker te maken, zullen we een onderscheid moeten maken tussen twee concepten:

  • Voorspellingsbijdrage: welk deel van de voorspellingen te wijten is aan de functie; dit komt overeen met het belang van het kenmerk.
  • Foutbijdrage: welk deel van de voorspellingsfouten te wijten is aan de aanwezigheid van het kenmerk in het model.

In dit artikel zullen we zien hoe we deze grootheden kunnen berekenen en hoe we ze kunnen gebruiken om waardevolle inzichten over een voorspellend model te krijgen (en om dit te verbeteren).

Let op: dit artikel is gericht op het regressiegeval. Als u meer geïnteresseerd bent in de classificatiecasus, kunt u lezen “Welke kenmerken zijn schadelijk voor uw classificatiemodel?”

Stel dat we een model hebben gebouwd om het inkomen van mensen te voorspellen op basis van hun baan, leeftijd en nationaliteit. Nu gebruiken we het model om voorspellingen te doen over drie personen.

We hebben dus de grondwaarheid, de modelvoorspelling en de resulterende fout:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Grondwaarheid, modelvoorspelling en absolute fout (in duizenden $). [Afbeelding door auteur]

 

Als we een voorspellend model hebben, kunnen we de modelvoorspellingen altijd ontleden in de bijdragen van de afzonderlijke kenmerken. Dit kan gedaan worden via SHAP-waarden (als je niet weet hoe SHAP-waarden werken, kun je mijn artikel lezen: SHAP-waarden precies uitgelegd zoals u wenst dat iemand u uitlegt).

Laten we dus zeggen dat dit de SHAP-waarden zijn ten opzichte van ons model voor de drie individuen.

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
SHAP-waarden voor de voorspellingen van ons model (in duizenden $). [Afbeelding door auteur]

 

De belangrijkste eigenschap van SHAP-waarden is dat ze additief zijn. Dit betekent dat we – door de som van elke rij te nemen – de voorspelling van ons model voor die persoon zullen verkrijgen. Als we bijvoorbeeld de tweede rij nemen: 72k $ +3k $ -22k $ = 53k $, wat precies de voorspelling van het model is voor het tweede individu.

Nu zijn SHAP-waarden een goede indicator van hoe belangrijk een functie is voor onze voorspellingen. Hoe hoger de (absolute) SHAP-waarde, hoe invloedrijker het kenmerk voor de voorspelling over dat specifieke individu. Merk op dat ik het heb over absolute SHAP-waarden, omdat het teken er hier niet toe doet: een kenmerk is even belangrijk als het de voorspelling omhoog of omlaag duwt.

daarom de voorspellingsbijdrage van een kenmerk is gelijk aan het gemiddelde van de absolute SHAP-waarden van dat kenmerk. Als u de SHAP-waarden in een Pandas-dataframe hebt opgeslagen, is dit zo eenvoudig als:

prediction_contribution = shap_values.abs().mean()

In ons voorbeeld is dit het resultaat:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Voorspellingsbijdrage. [Afbeelding door auteur]

 

Zoals u kunt zien, is de baan duidelijk het belangrijkste kenmerk, aangezien deze gemiddeld 71.67 dollar van de uiteindelijke voorspelling uitmaakt. Nationaliteit en leeftijd zijn respectievelijk het tweede en derde meest relevante kenmerk.

Het feit dat een bepaald kenmerk een relevant deel van de uiteindelijke voorspelling voor zijn rekening neemt, zegt echter niets over de prestaties van het kenmerk. Om ook dit aspect te overwegen, zullen we de “Foutbijdrage” moeten berekenen.

Laten we zeggen dat we de volgende vraag willen beantwoorden: “Welke voorspellingen zou het model doen als het niet over de functie beschikt baan?” Met SHAP-waarden kunnen we deze vraag beantwoorden. Omdat ze additief zijn, is het in feite voldoende om de SHAP-waarden af ​​te trekken ten opzichte van het object baan gebaseerd op de voorspellingen van het model.

Uiteraard kunnen we deze procedure voor elk kenmerk herhalen. Bij Panda's:

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

Dit is de uitkomst:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Voorspellingen die we zouden krijgen als we de betreffende functie zouden verwijderen. [Afbeelding door auteur]

 

Dit betekent dat, als we de functie niet hadden baandan zou het model 20 dollar voor het eerste individu voorspellen, -19 dollar voor de tweede, en -8 dollar voor de derde. In plaats daarvan, als we de functie niet hadden leeftijd, zou het model 73 dollar voor het eerste individu voorspellen, 50 dollar voor de tweede, enzovoort.

Zoals u kunt zien, variëren de voorspellingen voor elk individu sterk als we verschillende functies verwijderen. Als gevolg hiervan zouden ook de voorspellingsfouten heel verschillend zijn. We kunnen ze eenvoudig berekenen:

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

Het resultaat is het volgende:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Absolute fouten die we zouden krijgen als we de betreffende functie zouden verwijderen. [Afbeelding door auteur]

 

Dit zijn de fouten die we zouden krijgen als we de betreffende functie zouden verwijderen. Als de fout klein is, is het verwijderen van de functie intuïtief geen probleem (of zelfs gunstig) voor het model. Als de fout groot is, is het verwijderen van de functie geen goed idee.

Maar we kunnen meer doen dan dit. We kunnen inderdaad het verschil berekenen tussen de fouten van het volledige model en de fouten die we zouden krijgen zonder de functie:

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

Dat is:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Verschil tussen de fouten van het model en de fouten die we zouden hebben zonder de functie. [Afbeelding door auteur]

 

Als dit nummer is:

  • negatief is, dan leidt de aanwezigheid van het kenmerk tot een vermindering van de voorspellingsfout, dus het kenmerk werkt goed voor die waarneming!
  • positief is, dan leidt de aanwezigheid van het kenmerk tot een toename van de voorspellingsfout, dus het kenmerk is slecht voor die waarneming.

We kunnen “Foutbijdrage” berekenen als het gemiddelde van deze waarden, voor elk kenmerk. Bij Panda's:

error_contribution = error_diff.mean()

Dit is de uitkomst:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Foutbijdrage. [Afbeelding door auteur]

 

Als deze waarde positief is, betekent dit dat de aanwezigheid van het kenmerk in het model gemiddeld tot een hogere fout leidt. Zonder dat kenmerk zou de voorspelling dus over het algemeen beter zijn geweest. Met andere woorden: de functie doet meer kwaad dan goed!

Integendeel, hoe negatiever deze waarde, hoe gunstiger het kenmerk is voor de voorspellingen, aangezien de aanwezigheid ervan tot kleinere fouten leidt.

Laten we proberen deze concepten te gebruiken op een echte dataset.

Hierna zal ik een dataset gebruiken uit pycaret (een Python-bibliotheek onder MIT-licentie). De dataset heet ‘Gold’ en bevat tijdreeksen van financiële gegevens.

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Voorbeeld van gegevensset. De kenmerken zijn allemaal uitgedrukt in procenten, dus -4.07 betekent een rendement van -4.07%. [Afbeelding door auteur]

 

De kenmerken bestaan ​​uit de rendementen van financiële activa respectievelijk 22, 14, 7 en 1 dagen vóór het observatiemoment (“T-22”, “T-14”, “T-7”, “T-1”). Hier is de volledige lijst van alle financiële activa die als voorspellende functies worden gebruikt:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Lijst met beschikbare activa. Elk actief wordt waargenomen op tijdstip -22, -14, -7 en -1. [Afbeelding door auteur]

 

In totaal hebben we 120 functies.

Het doel is om de goudprijs (rendement) 22 dagen vooruit te voorspellen (“Gold_T+22”). Laten we eens kijken naar de doelvariabele.

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Histogram van de variabele. [Afbeelding door auteur]

 

Nadat ik de dataset had geladen, zijn dit de stappen die ik heb uitgevoerd:

  1. Splits de volledige dataset willekeurig: 33% van de rijen in de trainingsdataset, nog eens 33% in de validatiedataset en de resterende 33% in de testdataset.
  2. Train een LightGBM Regressor op de trainingsgegevensset.
  3. Maak voorspellingen over trainings-, validatie- en testgegevenssets, met behulp van het model dat in de vorige stap is getraind.
  4. Bereken SHAP-waarden van trainings-, validatie- en testdatasets met behulp van de Python-bibliotheek “shap”.
  5. Bereken de voorspellingsbijdrage en de foutbijdrage van elke functie op elke dataset (training, validatie en test), met behulp van de code die we in de vorige paragraaf hebben gezien.

Laten we de foutbijdrage en de voorspellingsbijdrage in de trainingsgegevensset vergelijken. We zullen een spreidingsdiagram gebruiken, zodat de stippen de 120 kenmerken van het model identificeren.

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Voorspellingsbijdrage versus foutbijdrage (in de trainingsgegevensset). [Afbeelding door auteur]

 

Er is een zeer negatieve correlatie tussen de voorspellingsbijdrage en de foutbijdrage in de trainingsset.

En dit is logisch: Omdat het model leert op basis van de trainingsgegevensset, heeft het de neiging een groot belang (dat wil zeggen een hoge voorspellingsbijdrage) toe te kennen aan die kenmerken die leiden tot een grote vermindering van de voorspellingsfout (dat wil zeggen een zeer negatieve foutbijdrage)..

Maar dit voegt niet veel toe aan onze kennis, toch?

Wat voor ons echt belangrijk is, is de validatiedataset. De validatiedataset is in feite de beste proxy die we kunnen hebben over hoe onze functies zich zullen gedragen op nieuwe gegevens. Laten we dus dezelfde vergelijking maken met de validatieset.

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Voorspellingsbijdrage versus foutbijdrage (in de validatiegegevensset). [Afbeelding door auteur]

 

Uit dit plot kunnen we nog veel interessantere informatie halen.

De kenmerken rechtsonder in de grafiek zijn de kenmerken waaraan ons model terecht een groot belang toekent, aangezien ze feitelijk een vermindering van de voorspellingsfout met zich meebrengen.

Merk ook op dat “Gold_T-22” (de terugkeer van goud 22 dagen vóór de observatieperiode) heel goed werkt vergeleken met het belang dat het model eraan toekent. Dit betekent dat deze functie is mogelijk ondermaats. En dit stukje informatie is bijzonder interessant omdat goud het actief is dat we proberen te voorspellen (“Gold_T+22”).

Daarnaast is de functies met een foutbijdrage boven 0 maken onze voorspellingen slechter. Bijvoorbeeld: “US Bond ETF_T-1” verandert de modelvoorspelling gemiddeld met 0.092% (voorspellingsbijdrage), maar dit leidt ertoe dat het model een voorspelling doet die gemiddeld 0.013% (foutbijdrage) slechter is dan het geval zou zijn geweest zonder die functie .

Dat mogen wij veronderstellen alle functies met een hoge foutbijdrage (vergeleken met hun voorspellingsbijdrage) zijn waarschijnlijk overfitting of, in het algemeen, vertonen ze verschillend gedrag in de trainingsset en in de validatieset.

Laten we eens kijken welke functies de grootste foutbijdrage hebben.

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Functies gesorteerd op afnemende foutbijdrage. [Afbeelding door auteur]

 

En nu de functies met de laagste foutbijdrage:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Functies gesorteerd op toenemende foutbijdrage. [Afbeelding door auteur]

 

Interessant is dat we kunnen waarnemen dat alle kenmerken met een hogere foutbijdrage relatief zijn ten opzichte van T-1 (1 dag vóór het observatiemoment), terwijl bijna alle kenmerken met een kleinere foutbijdrage relatief zijn ten opzichte van T-22 (22 dagen vóór het observatiemoment). ).

Dit lijkt erop te wijzen de meest recente kenmerken zijn gevoelig voor overfitting, terwijl de kenmerken die verder weg in de tijd liggen de neiging hebben om beter te generaliseren.

Houd er rekening mee dat we dit inzicht zonder Error Contribution nooit zouden hebben geweten.

Traditionele Recursive Feature Elimination (RFE)-methoden zijn gebaseerd op het verwijderen van onbelangrijke kenmerken. Dit komt overeen met het verwijderen van de functies met eerst een kleine voorspellingsbijdrage.

Op basis van wat we in de vorige paragraaf hebben gezegd, zou het echter logischer zijn om eerst de functies met de hoogste foutbijdrage te verwijderen.

Om te controleren of onze intuïtie geverifieerd wordt, vergelijken we de twee benaderingen:

  • Traditionele RFE: eerst nutteloze functies verwijderen (laagste voorspellingsbijdrage).
  • Onze RFE: schadelijke functies verwijderen eerste (hoogste foutbijdrage).

Laten we de resultaten van de validatieset bekijken:

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Gemiddelde absolute fout van de twee strategieën op de validatieset. [Afbeelding door auteur]

 

De beste iteratie voor elke methode is omcirkeld: het is het model met 19 kenmerken voor de traditionele RFE (blauwe lijn) en het model met 17 kenmerken voor onze RFE (oranje lijn).

Over het algemeen lijkt het erop dat onze methode goed werkt: het verwijderen van het element met de hoogste foutbijdrage leidt tot een consistent kleinere MAE vergeleken met het verwijderen van het element met de hoogste voorspellingsbijdrage.

U denkt echter misschien dat dit goed werkt, alleen maar omdat we de validatieset overmatig aanpassen. Wij zijn immers geïnteresseerd in het resultaat dat we op de testset gaan behalen.

Laten we dus dezelfde vergelijking op de testset bekijken.

 

Jouw eigenschappen zijn belangrijk? Het betekent niet dat ze goed zijn
Gemiddelde absolute fout van de twee strategieën op de testset. [Afbeelding door auteur]

 

Het resultaat is vergelijkbaar met het vorige. Zelfs als er minder afstand is tussen de twee lijnen, is de MAE die wordt verkregen door de hoogste foutbijdrager te verwijderen duidelijk beter dan de MAE die wordt verkregen door de laagste voorspellingsbijdrager te verwijderen.

Omdat we de modellen hebben geselecteerd die tot de kleinste MAE op de validatieset leiden, laten we hun uitkomst op de testset bekijken:

  • RFE-voorspellingsbijdrage (19 functies). MAE op testset: 2.04.
  • RFE-foutbijdrage (17 functies). MAE op testset: 1.94.

De beste MAE die onze methode gebruikt, is dus 5% beter vergeleken met traditionele RFE!

Het concept van functiebelang speelt een fundamentele rol bij machinaal leren. Het begrip ‘belang’ wordt echter vaak verward met ‘goedheid’.

Om onderscheid te maken tussen deze twee aspecten hebben we twee concepten geïntroduceerd: voorspellingsbijdrage en foutbijdrage. Beide concepten zijn gebaseerd op de SHAP-waarden van de validatiedataset, en in het artikel hebben we de Python-code gezien om deze te berekenen.

We hebben ze ook uitgeprobeerd op een echte financiële dataset (waarin de taak het voorspellen van de prijs van goud is) en bewezen dat Recursive Feature Elimination op basis van Error Contribution leidt tot een 5% betere Mean Absolute Error vergeleken met traditionele RFE op basis van Prediction Contribution.

Alle code die voor dit artikel wordt gebruikt, is te vinden in dit notitieboekje.

Bedankt voor het lezen!

 
 
Samuel Mazzanti is Lead Data Scientist bij Jakala en woont momenteel in Rome. Hij is afgestudeerd in statistiek en zijn voornaamste onderzoeksinteresses betreffen machine learning-toepassingen voor de industrie. Hij is ook een freelance contentmaker.

 
ORIGINELE. Met toestemming opnieuw gepost.
 

Tijdstempel:

Meer van KDnuggets