Twoje funkcje są ważne? To nie znaczy, że są dobre - KDnuggets

Twoje funkcje są ważne? To nie znaczy, że są dobre – KDnuggets

Węzeł źródłowy: 2893531

Twoje funkcje są ważne? To nie znaczy, że są dobre
[Obraz autora]

 

Pojęcie „ważności funkcji” jest szeroko stosowane w uczeniu maszynowym jako najbardziej podstawowy rodzaj wyjaśnialności modelu. Na przykład jest używany w rekursywnej eliminacji cech (RFE), aby iteracyjnie usuwać najmniej ważną cechę modelu.

Istnieje jednak błędne przekonanie na ten temat.

To, że cecha jest ważna, nie oznacza, że ​​jest korzystna dla modelu!

Rzeczywiście, gdy mówimy, że cecha jest ważna, oznacza to po prostu, że wnosi ona duży wkład w przewidywania dokonywane przez model. Ale powinniśmy to rozważyć taki wkład może być błędny.

Weźmy prosty przykład: analityk danych przypadkowo zapomina identyfikator klienta pomiędzy funkcjami swojego modelu. Model wykorzystuje identyfikator klienta jako funkcję wysoce predykcyjną. W rezultacie cecha ta będzie miała duże znaczenie, nawet jeśli w rzeczywistości pogarsza model, ponieważ nie może dobrze działać na niewidocznych danych.

Aby wszystko było jaśniejsze, będziemy musieli dokonać rozróżnienia między dwoma pojęciami:

  • Wkład prognozy: jaka część przewidywań wynika z cechy; jest to równoważne znaczeniu cechy.
  • Wkład błędu: jaka część błędów przewidywania wynika z obecności cechy w modelu.

W tym artykule zobaczymy, jak obliczyć te wielkości i jak je wykorzystać, aby uzyskać cenne informacje na temat modelu predykcyjnego (i go ulepszyć).

Uwaga: ten artykuł skupia się na przypadku regresji. Jeśli bardziej interesuje Cię przypadek klasyfikacji, możesz przeczytać „Które cechy są szkodliwe dla Twojego modelu klasyfikacji?”

Załóżmy, że zbudowaliśmy model przewidywania dochodów ludzi na podstawie ich pracy, wieku i narodowości. Teraz używamy modelu do przewidywania trzech osób.

Mamy zatem podstawową prawdę, przewidywanie modelu i wynikający z niego błąd:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Prawda podstawowa, przewidywanie modelu i błąd bezwzględny (w tysiącach dolarów). [Obraz autora]

 

Kiedy mamy model predykcyjny, zawsze możemy rozłożyć przewidywania modelu na wkłady wniesione przez pojedyncze cechy. Można to zrobić za pomocą wartości SHAP (jeśli nie wiesz, jak działają wartości SHAP, możesz przeczytać mój artykuł: Wartości SHAP wyjaśnione dokładnie tak, jak chciałeś, żeby ktoś ci wyjaśnił).

Powiedzmy, że są to wartości SHAP w odniesieniu do naszego modelu dla trzech osób.

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Wartości SHAP dla przewidywań naszego modelu (w tysiącach dolarów). [Obraz autora]

 

Główną właściwością wartości SHAP jest to, że są one addytywne. Oznacza to, że — biorąc sumę każdego wiersza — otrzymamy przewidywania naszego modelu dla tej osoby. Na przykład, jeśli weźmiemy drugi rząd: 72 tys. $ + 3 tys. $ -22 tys. $ = 53 tys. $, co jest dokładnie przewidywaniem modelu dla drugiej osoby.

Teraz wartości SHAP są dobrym wskaźnikiem tego, jak ważna jest dana funkcja dla naszych przewidywań. Rzeczywiście, im wyższa (bezwzględna) wartość SHAP, tym bardziej wpływowa cecha na przewidywanie dotyczące tej konkretnej osoby. Zauważ, że mówię o bezwzględnych wartościach SHAP, ponieważ znak tutaj nie ma znaczenia: cecha jest równie ważna, jeśli przesuwa prognozę w górę lub w dół.

Dlatego Udział prognozy cechy jest równy średniej wartości bezwzględnych SHAP tej cechy. Jeśli masz wartości SHAP zapisane w ramce danych Pandy, jest to tak proste, jak:

prediction_contribution = shap_values.abs().mean()

W naszym przykładzie jest to wynik:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Wkład prognozy. [Obraz autora]

 

Jak widać, praca jest zdecydowanie najważniejszą cechą, ponieważ średnio odpowiada za 71.67 tys. $ ostatecznej prognozy. Narodowość i wiek to odpowiednio druga i trzecia najważniejsza cecha.

Jednak fakt, że dana cecha stanowi istotną część ostatecznej prognozy, nie mówi nic o jej wydajności. Aby wziąć pod uwagę również ten aspekt, będziemy musieli obliczyć „udział błędu”.

Załóżmy, że chcemy odpowiedzieć na pytanie: „Jakich przewidywań dokonałby model, gdyby nie posiadał tej funkcji praca?” Wartości SHAP pozwalają nam odpowiedzieć na to pytanie. W rzeczywistości, ponieważ są one addytywne, wystarczy odjąć wartości SHAP w stosunku do cechy praca z przewidywań modelu.

Oczywiście możemy powtórzyć tę procedurę dla każdej cechy. W Pandach:

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

Oto wynik:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Prognozy, które uzyskalibyśmy, gdybyśmy usunęli odpowiednią funkcję. [Obraz autora]

 

Oznacza to, że gdybyśmy nie mieli tej funkcji praca, wówczas model przewidywałby 20 tys. dolarów dla pierwszej osoby, -19 tys. dolarów dla drugiej osoby i -8 tys. dolarów dla trzeciej. Zamiast tego, gdybyśmy nie mieli tej funkcji wiekmodel przewidywałby 73 tys. dolarów dla pierwszej osoby, 50 tys. dolarów dla drugiej i tak dalej.

Jak widać, prognozy dla każdej osoby znacznie się różnią, jeśli usuniemy różne funkcje. W konsekwencji również błędy przewidywań byłyby bardzo różne. Możemy je łatwo obliczyć:

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

Wynik jest następujący:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Błędy bezwzględne, które otrzymalibyśmy, gdybyśmy usunęli odpowiednią funkcję. [Obraz autora]

 

Są to błędy, które otrzymalibyśmy, gdybyśmy usunęli odpowiednią funkcję. Intuicyjnie, jeśli błąd jest niewielki, usunięcie tej funkcji nie stanowi problemu — a nawet jest korzystne — dla modelu. Jeśli błąd jest wysoki, usunięcie tej funkcji nie jest dobrym pomysłem.

Ale możemy zrobić więcej. Rzeczywiście, możemy obliczyć różnicę między błędami pełnego modelu a błędami, które otrzymalibyśmy bez cechy:

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

Który jest:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Różnica między błędami modelu a błędami, które mielibyśmy bez tej cechy. [Obraz autora]

 

Jeśli ta liczba to:

  • ujemna, wówczas obecność cechy prowadzi do zmniejszenia błędu predykcji, więc cecha sprawdza się dobrze w przypadku tej obserwacji!
  • dodatnia, wówczas obecność cechy prowadzi do wzrostu błędu predykcji, zatem cecha jest niekorzystna dla danej obserwacji.

Możemy obliczyć „udział błędu” jako średnią tych wartości dla każdej cechy. W Pandach:

error_contribution = error_diff.mean()

Oto wynik:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Wkład błędu. [Obraz autora]

 

Jeśli wartość ta jest dodatnia, oznacza to, że średnio obecność cechy w modelu prowadzi do większego błędu. Zatem bez tej funkcji przewidywanie byłoby ogólnie lepsze. Innymi słowy, ta funkcja powoduje więcej szkody niż pożytku!

I odwrotnie, im bardziej ujemna jest ta wartość, tym bardziej korzystna jest dana cecha dla prognoz, ponieważ jej obecność prowadzi do mniejszych błędów.

Spróbujmy zastosować te koncepcje w prawdziwym zbiorze danych.

W dalszej części będę korzystał ze zbioru danych zaczerpniętego z Picaret (biblioteka Pythona w pliku Licencja MIT). Zbiór danych nosi nazwę „Gold” i zawiera szeregi czasowe danych finansowych.

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Próbka zbioru danych. Wszystkie cechy wyrażone są procentowo, więc -4.07 oznacza zwrot -4.07%. [Obraz autora]

 

Cechami są zwroty aktywów finansowych odpowiednio na 22, 14, 7 i 1 dzień przed momentem obserwacji („T-22”, „T-14”, „T-7”, „T-1”). Oto wyczerpująca lista wszystkich aktywów finansowych wykorzystywanych jako funkcje predykcyjne:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Lista dostępnych aktywów. Każdy składnik aktywów jest obserwowany w czasie -22, -14, -7 i -1. [Obraz autora]

 

W sumie mamy 120 funkcji.

Celem jest przewidzenie ceny złota (zwrotu) z 22-dniowym wyprzedzeniem („Gold_T+22”). Przyjrzyjmy się zmiennej docelowej.

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Histogram zmiennej. [Obraz autora]

 

Po załadowaniu zestawu danych wykonałem następujące kroki:

  1. Podziel losowo cały zbiór danych: 33% wierszy w zbiorze danych szkoleniowych, kolejne 33% w zbiorze danych walidacyjnych i pozostałe 33% w zbiorze testowym.
  2. Wytrenuj regresor LightGBM na zbiorze danych szkoleniowych.
  3. Twórz prognozy dotyczące uczenia, walidacji i testowania zestawów danych, korzystając z modelu przeszkolonego w poprzednim kroku.
  4. Oblicz wartości SHAP zbiorów danych szkoleniowych, walidacyjnych i testowych, korzystając z biblioteki Pythona „shap”.
  5. Oblicz udział przewidywań i udział błędów każdej funkcji w każdym zbiorze danych (trening, walidacja i test), korzystając z kodu, który widzieliśmy w poprzednim akapicie.

Porównajmy udział błędów i udział przewidywań w zbiorze danych szkoleniowych. Użyjemy wykresu punktowego, tak aby kropki identyfikowały 120 cech modelu.

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Udział prognozy a udział błędu (w zbiorze danych szkoleniowych). [Obraz autora]

 

Istnieje wysoce ujemna korelacja między wkładem prognozy a udziałem błędu w zbiorze treningowym.

I to ma sens: ponieważ model uczy się na zbiorze danych szkoleniowych, ma tendencję do przypisywania dużej wagi (tj. wysokiego wkładu przewidywania) tym cechom, które prowadzą do znacznej redukcji błędu przewidywania (tj. wysoce ujemnego udziału błędu)..

Ale to niewiele wnosi do naszej wiedzy, prawda?

Rzeczywiście, to, co naprawdę jest dla nas ważne, to zbiór danych walidacyjnych. Zbiór danych weryfikacyjnych jest w rzeczywistości najlepszym wskaźnikiem proxy, jaki możemy mieć, jeśli chodzi o zachowanie naszych funkcji na nowych danych. Dokonajmy więc tego samego porównania na zestawie walidacyjnym.

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Udział przewidywań a udział błędów (w zestawie danych walidacji). [Obraz autora]

 

Z tej fabuły możemy wydobyć znacznie więcej interesujących informacji.

Cechy w prawej dolnej części wykresu to te, którym nasz model prawidłowo przypisuje duże znaczenie, gdyż faktycznie przynoszą zmniejszenie błędu predykcji.

Należy także pamiętać, że „Złoto_T-22” (zwrot złota 22 dni przed okresem obserwacji) sprawdza się naprawdę dobrze w porównaniu ze znaczeniem, jakie nadaje mu model. To znaczy że ta funkcja jest prawdopodobnie niedopasowana. A ta informacja jest szczególnie interesująca, ponieważ złoto jest aktywem, które staramy się przewidzieć („Złoto_T+22”).

Z drugiej strony, funkcje, które mają udział w błędach powyżej 0, pogarszają nasze przewidywania. Na przykład „US Bond ETF_T-1” zmienia przewidywanie modelu średnio o 0.092% (wkład predykcji), ale prowadzi do tego, że model formułuje przewidywania średnio o 0.013% (wkład w błąd) gorzej niż byłoby to bez tej funkcji .

Możemy tak przypuszczać wszystkie funkcje z wysokim udziałem błędów (w porównaniu z ich udziałem w prognozach) są prawdopodobnie nadmiernie dopasowane lub, ogólnie rzecz biorąc, zachowują się inaczej w zestawie treningowym i w zestawie walidacyjnym.

Zobaczmy, które funkcje mają największy udział w błędach.

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Funkcje posortowane według malejącego udziału błędów. [Obraz autora]

 

A teraz funkcje z najniższym udziałem błędów:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Funkcje posortowane według rosnącego udziału błędów. [Obraz autora]

 

Co ciekawe, możemy zaobserwować, że wszystkie cechy o większym udziale błędu odnoszą się do T-1 (1 dzień przed momentem obserwacji), podczas gdy prawie wszystkie cechy o mniejszym udziale błędu odnoszą się do T-22 (22 dni przed momentem obserwacji) ).

To zdaje się na to wskazywać najnowsze cechy są podatne na nadmierne dopasowanie, podczas gdy cechy bardziej odległe w czasie mają tendencję do lepszego uogólniania.

Należy pamiętać, że bez wkładu błędów nigdy nie poznalibyśmy tych spostrzeżeń.

Tradycyjne metody rekurencyjnej eliminacji cech (RFE) opierają się na usuwaniu nieistotnych cech. Jest to równoznaczne z usunięciem najpierw obiektów z niewielkim wkładem prognozy.

Jednak w oparciu o to, co powiedzieliśmy w poprzednim akapicie, rozsądniej byłoby najpierw usunąć funkcje z najwyższym udziałem błędów.

Aby sprawdzić, czy nasza intuicja się sprawdza, porównajmy oba podejścia:

  • Tradycyjny RFE: najpierw usuń niepotrzebne funkcje (najniższy wkład prognozy).
  • Nasze RFE: usuwanie szkodliwych funkcji  drugim (najwyższy udział błędów).

Zobaczmy wyniki na zestawie walidacyjnym:

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Średni błąd bezwzględny dwóch strategii w zestawie walidacyjnym. [Obraz autora]

 

Zakreślono najlepszą iterację dla każdej metody: jest to model z 19 cechami dla tradycyjnego RFE (niebieska linia) i model z 17 cechami dla naszego RFE (pomarańczowa linia).

Ogólnie rzecz biorąc, wydaje się, że nasza metoda działa dobrze: usunięcie cechy o najwyższym udziale błędu prowadzi do konsekwentnie mniejszego MAE w porównaniu z usunięciem cechy o najwyższym udziale prognozy.

Możesz jednak pomyśleć, że działa to dobrze tylko dlatego, że nadmiernie dopasowujemy zestaw walidacyjny. Interesuje nas przecież wynik, jaki uzyskamy na zestawie testowym.

Zobaczmy więc to samo porównanie na zestawie testowym.

 

Twoje funkcje są ważne? To nie znaczy, że są dobre
Średni błąd bezwzględny dwóch strategii na zestawie testowym. [Obraz autora]

 

Wynik jest podobny do poprzedniego. Nawet jeśli odległość między dwiema liniami jest mniejsza, MAE uzyskana poprzez usunięcie najwyższego składnika przewidywanego jest wyraźnie lepsza niż MAE uzyskana po usunięciu najniższego składnika przewidywanego.

Ponieważ wybraliśmy modele prowadzące do najmniejszego MAE na zestawie walidacyjnym, zobaczmy ich wynik na zestawie testowym:

  • Wkład RFE-Prediction (19 funkcji). MAE na zestawie testowym: 2.04.
  • Udział w błędach RFE (17 funkcji). MAE na zestawie testowym: 1.94.

Zatem najlepszy MAE wykorzystujący naszą metodę jest o 5% lepszy w porównaniu do tradycyjnego RFE!

Koncepcja ważności cech odgrywa fundamentalną rolę w uczeniu maszynowym. Jednakże pojęcie „ważności” jest często mylone z „dobrocią”.

Aby rozróżnić te dwa aspekty, wprowadziliśmy dwa pojęcia: udział przewidywań i udział błędów. Obie koncepcje opierają się na wartościach SHAP ze zbioru danych walidacyjnych, a w artykule widzieliśmy kod Pythona do ich obliczania.

Wypróbowaliśmy je również na rzeczywistym zbiorze danych finansowych (w którym zadaniem jest przewidywanie ceny złota) i udowodniliśmy, że eliminacja cech rekursywnych w oparciu o udział błędu prowadzi do o 5% lepszego średniego błędu bezwzględnego w porównaniu z tradycyjnym RFE opartym na udziale predykcji.

Cały kod użyty w tym artykule można znaleźć w ten notatnik.

Dziękuję za przeczytanie!

 
 
Samuela Mazzantiego jest głównym analitykiem danych w Jakala, a obecnie mieszka w Rzymie. Jest absolwentem statystyki, a jego główne zainteresowania badawcze dotyczą zastosowań uczenia maszynowego dla przemysłu. Jest także niezależnym twórcą treści.

 
Oryginalny. Przesłane za zgodą.
 

Znak czasu:

Więcej z Knuggety