Jak obliczyć przedziały ufności dla metryk wydajności w uczeniu maszynowym przy użyciu metody automatycznego ładowania początkowego

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

Jak obliczyć przedziały ufności dla metryk wydajności w uczeniu maszynowym przy użyciu metody automatycznego ładowania początkowego

Czy pomiary wydajności twojego modelu są bardzo dokładne ze względu na „duży” zestaw testowy lub bardzo niepewne ze względu na „mały” lub niezrównoważony zestaw testowy?


By David B. Rosen (doktorat), główny specjalista ds. danych ds. automatycznego zatwierdzania kredytów w IBM Global Financing



Linia pomarańczowa pokazuje 89.7% jako dolną granicę przedziału ufności Zrównoważonej Dokładności, zieloną dla pierwotnie zaobserwowanej Zrównoważonej Dokładności = 92.4% (oszacowanie punktowe), a czerwoną dla górnej granicy 94.7%. (To i wszystkie obrazy są autorstwa autora, chyba że zaznaczono inaczej.)

Wprowadzenie

 
 
Jeśli podasz wydajność klasyfikatora jako Dokładność = 94.8% i F1 = 92.3% na zbiorze testowym, nie ma to większego znaczenia bez znajomości rozmiaru i składu zestawu testowego. Margines błędu tych pomiarów wydajności będzie się znacznie różnić w zależności od wielkości zestawu testowego lub, w przypadku niezrównoważonego zbioru danych, przede wszystkim w zależności od tego, ile niezależnych instancji mniejszość class, którą zawiera (więcej kopii tych samych instancji z nadpróbkowania nie pomaga w tym celu).

Jeśli udałoby Ci się zebrać inny, niezależny zestaw testów o podobnym pochodzeniu, Dokładność i F1 Twojego modelu na tym zbiorze danych raczej nie będą takie same, ale jak bardzo mogą się różnić? Na pytanie podobne do tego odpowiada statystyka jako przedział ufności pomiaru.

Gdybyśmy mieli narysować wiele niezależnych próbnych zestawów danych z populacji bazowej, to dla 95% tych zestawów danych prawdziwa wartość metryki populacji bazowej mieściłaby się w 95% przedziale ufności, który obliczylibyśmy dla tego konkretnego zestawu danych próbki.

W tym artykule pokażemy, jak obliczyć przedziały ufności dla dowolnej liczby metryk wydajności uczenia maszynowego jednocześnie, za pomocą metody ładowania początkowego, która automatycznie określa, ile zestawów danych przykładowych rozruchów ma być generowanych domyślnie.

Jeśli chcesz tylko zobaczyć, jak wywołać ten kod w celu obliczenia przedziałów ufności, przejdź do sekcji „Oblicz wyniki!" poniżej.

Metodologia bootstrap

 
 
Gdybyśmy byli w stanie narysować dodatkowe zestawy danych testowych z prawdziwego rozkładu leżącego u podstaw danych, bylibyśmy w stanie zobaczyć rozkład interesujących metryk wydajności w tych zestawach danych. (Podczas rysowania tych zestawów danych nie zrobilibyśmy nic, aby zapobiec wielokrotnemu rysowaniu identycznej lub podobnej instancji, chociaż może się to zdarzyć rzadko).

Ponieważ nie możemy tego zrobić, następną najlepszą rzeczą jest narysowanie dodatkowych zestawów danych z rozkład empiryczny tego zestawu danych testowych, co oznacza pobieranie próbek z zastępowaniem z jego instancji w celu wygenerowania nowych zestawów danych próbek ładowania początkowego. Próbkowanie z zamianą oznacza, że ​​po narysowaniu określonej instancji umieszczamy ją z powrotem, abyśmy mogli narysować ją ponownie dla tego samego przykładowego zestawu danych. W związku z tym każdy taki zestaw danych ma zazwyczaj wiele kopii niektórych wystąpień i nie obejmuje wszystkich wystąpień znajdujących się w podstawowym zbiorze testowym.

Gdybyśmy pobierali próbki bez zastąpienie, to po prostu otrzymalibyśmy za każdym razem identyczną kopię oryginalnego zbioru danych, tasowaną w innej przypadkowej kolejności, co nie miałoby żadnego sensu.

Połączenia percentyl Metodologia bootstrap do szacowania przedziału ufności jest następująca:

  1. Generuj swój nboots zestawy danych „próbki startowej”, każdy o takim samym rozmiarze jak oryginalny zestaw testowy. Każdy przykładowy zestaw danych jest uzyskiwany przez losowanie instancji ze zbioru testowego z zamianą.
  2. W każdym z przykładowych zestawów danych oblicz metrykę i zapisz ją.
  3. 95% przedział ufności wynosi 2.5th do 97.5th percentyla wśród nboots obliczone wartości metryki. Jeśli nboots=1001 i posortowałeś wartości w serii/tablicy/liście X o długości 1001, 0th percentyl to X[0] i 100th percentyl to X[1000], więc przedział ufności byłby dany przez X[25] do X[975].

Oczywiście w kroku 2 możesz obliczyć dowolną liczbę metryk dla każdego przykładowego zestawu danych, ale w kroku 3 znajdziesz percentyle dla każdej metryki osobno.

Przykładowe wyniki zbioru danych i przedziału ufności

 
 
Jako przykład wykorzystamy wyniki z tego wcześniejszego artykułu: Jak radzić sobie z niezrównoważoną klasyfikacją bez ponownego równoważenia danych?Zanim rozważysz nadpróbkowanie przekrzywionych danych, spróbuj dostosować próg decyzyjny klasyfikacji.

W tym artykule użyliśmy wysoko- niezrównoważony dwuklasowy Kaggle zestaw danych identyfikujących oszustwa związane z kartami kredytowymi. Zdecydowaliśmy się na użycie progu klasyfikacji zupełnie innego niż domyślny próg 0.5, który jest niejawny w użyciu metody predykcji(), dzięki czemu równoważenie danych nie jest konieczne. To podejście jest czasami nazywane przesuwanie progu, w którym nasz klasyfikator przypisuje klasę, stosując wybrany próg do przewidywanego prawdopodobieństwa klasy dostarczonego przez predykcję_prawdopodobnie() metoda.

Ograniczymy zakres tego artykułu (i kodu) do klasyfikacji binarnej: klasy 0 i 1, przy czym klasa 1 zgodnie z konwencją jest klasą „dodatnią”, a konkretnie klasą mniejszościową dla danych niezrównoważonych, chociaż kod powinien działać dla regresji (pojedynczy ciągły cel).

Generowanie jednego przykładowego zestawu danych rozruchowych

 
 
Chociaż nasz kod przedziału ufności może obsłużyć różne liczby argumentów danych przekazywanych do funkcji metrycznych, skupimy się na metrykach w stylu sklearn, które zawsze akceptują dwa argumenty danych, y_true i y_pred, gdzie y_pred będzie albo binarnymi przewidywaniami klas (0 lub 1), lub ciągłe prognozy prawdopodobieństwa klasy lub funkcji decyzyjnej, a nawet ciągłe prognozy regresji, jeśli y_true jest również ciągłe. Poniższa funkcja generuje pojedynczy przykładowy zestaw danych rozruchowych. Akceptuje dowolne data_args, ale w naszym przypadku będą to argumenty ytest(nasze rzeczywiste/prawdziwe wartości docelowe zestawu testowego w pliku poprzedni artykuł) i hardpredtst_tuned_thresh (przewidywana klasa). Oba zawierają zera i jedynki, aby wskazać prawdziwą lub przewidywaną klasę dla każdej instancji.

Niestandardowe metryki specificity_score() i funkcje użytkowe

 
 
Zdefiniujemy niestandardową funkcję metryki dla Specyficzności, która jest po prostu inną nazwą Recall of the ujemny klasa (klasa 0). Również funkcja calc_metrics, która stosuje sekwencję interesujących nas metryk do naszych danych oraz kilka funkcji użytkowych:

Tutaj tworzymy naszą listę metryk i stosujemy je do danych. Nie uznaliśmy Dokładności za odpowiedni wskaźnik, ponieważ fałszywy wynik negatywny (błędne zaklasyfikowanie prawdziwego oszustwa jako legalnego) jest znacznie bardziej kosztowny dla firmy niż fałszywy alarm (błędne zaklasyfikowanie prawdziwego oszustwa jako oszustwa), podczas gdy Dokładność traktuje oba rodzaje błędnej klasyfikacji są równie złe i dlatego sprzyjają poprawnemu klasyfikowaniu tych, których prawdziwą klasą jest klasa większościowa, ponieważ występują one znacznie częściej i w ten sposób przyczyniają się znacznie bardziej do ogólnej Dokładności.

met=[ metrics.recall_score, specificity_score, metrics.balanced_accuracy_score ]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)



Tworzenie każdego przykładowego zestawu danych rozruchowych i obliczanie dla niego metryk

 
 
W raw_metric_samples() faktycznie wygenerujemy wiele przykładowych zestawów danych jeden po drugim i zapiszemy metryki każdego z nich:

Dajesz raw_metric_samples() listę interesujących metryk (lub tylko jedną metrykę), a także prawdziwe i przewidywane dane klasy, a ona uzyskuje przykładowe zestawy danych nboots i zwraca ramkę danych zawierającą tylko wartości metryk obliczone z każdego zestawu danych. Poprzez _boot_generator() wywołuje one_boot() pojedynczo w wyrażeniu generatora, zamiast zapisywać wszystkie zestawy danych jednocześnie jako potencjalnie-olbrzymi lista.

Spójrz na metryki w 7 przykładowych zestawach danych rozruchu

 
 
Tworzymy naszą listę funkcji metrycznych i wywołujemy raw_metric_samples(), aby uzyskać wyniki tylko dla 7 przykładowych zestawów danych. Wywołujemy tutaj raw_metric_samples() dla zrozumienia — nie jest to konieczne, aby uzyskać przedziały ufności za pomocą ci_auto() poniżej, chociaż określamy listę metryk (lub tylko jedną metrykę) dla ci_auto() is niezbędny.

np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh, nboots=7).style.format('{:.2%}') #optional #style



Każda kolumna powyżej zawiera metryki obliczone na podstawie jednego zestawu danych przykładowego rozruchu (ponumerowane od 0 do 6), więc obliczone wartości metryk różnią się ze względu na losowe próbkowanie.

Liczba rozruchowych zestawów danych z obliczoną wartością domyślną

 
 
W naszej implementacji domyślnie liczba zestawów danych rozruchowych nboots zostanie wyliczona automatycznie z żądanego poziomu ufności (np. 95%) tak, aby do godz Północ, Curtis i Sham mieć minimalną liczbę wyników rozruchowych w każdym ogonie dystrybucji. (Właściwie to zalecenie dotyczy p-wartości, a tym samym test hipotezy regiony akceptacji, ale przedziały ufności są wystarczająco podobne do tych, aby użyć tego jako ogólnej zasady.) Chociaż autorzy ci zalecają co najmniej 10 wyników rozruchu w ogonie, Davidsona i MacKinnona zalecamy co najmniej 399 butów, aby uzyskać 95% pewności, co wymaga 11 butów w ogonie, więc korzystamy z tej bardziej konserwatywnej rekomendacji.

Podajemy alfa, która wynosi 1 – poziom ufności. Np. 95% pewności wynosi 0.95, a alfa=0.05. Jeśli podasz wyraźną liczbę butów (być może mniejszą nboots ponieważ chcesz uzyskać szybsze wyniki), ale to nie wystarczy dla wymaganej alfy, automatycznie zostanie wybrana wyższa alfa, aby uzyskać dokładny przedział ufności dla tej liczby butów. Zostanie użytych co najmniej 51 butów, ponieważ każdy mniejszy może dokładnie obliczyć tylko dziwnie małe poziomy ufności (takie jak 40% ufności, który daje przedział od 30th percentyla do 70th percentyl, który ma 40% wewnątrz przedziału, ale 60% poza nim) i nie jest jasne, czy zalecenie dotyczące minimalnych butów w ogóle brało pod uwagę taki przypadek.

Funkcja get_alpha_nboots() ustawia domyślne nboots lub modyfikuje żądane alfa i nboots zgodnie z powyższym:

Pokażmy domyślne nboots dla różnych wartości alfa:

g = get_alpha_nboots pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02), g(alpha=0.01, nboots=None), g(0.005, nboots=None) ], columns=['alpha', 'default nboots'] ).set_index('alpha')



Oto co się stanie, jeśli zażądamy jawnego nboots:

req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))



Małe wartości nboots wzrosły alfa do 0.05 i 0.40, a nboots=2 zostaje zmienione na minimum 51.

Histogram przykładowych zestawów danych bootstrap pokazujący przedział ufności tylko dla zrównoważonej dokładności

 
 
Ponownie nie musimy tego robić, aby uzyskać poniższe przedziały ufności, wywołując ci_auto().

np.random.seed(13)
metric_boot_histogram (metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)



Linia pomarańczowa pokazuje 89.7% jako dolną granicę przedziału ufności Zrównoważonej Dokładności, zieloną dla pierwotnie zaobserwowanej Zrównoważonej Dokładności = 92.4% (oszacowanie punktowe), a czerwoną dla górnej granicy 94.7%. (Ten sam obraz pojawia się u góry tego artykułu).

Jak obliczyć wszystkie przedziały ufności dla listy metryk

 
 
Oto główna funkcja, która wywołuje powyższe i oblicza przedziały ufności na podstawie percentyli wyników metryki i wstawia oszacowania punktowe jako pierwszą kolumnę wyjściowej ramki danych wyników.

Oblicz wyniki!

 
 
To wszystko, co naprawdę musieliśmy zrobić: wywołać ci_auto() w następujący sposób z listą metryk (met przypisane powyżej), aby uzyskać ich przedziały ufności. Formatowanie procentowe jest opcjonalne:

np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh ).style.format('{:.2%}')



Omówienie wynikowych przedziałów ufności

 
 
Oto macierz nieporozumień z oryginalny artykuł. Klasa 0 to negatywy (klasa większościowa), a klasa 1 to pozytywy (klasa bardzo rzadka)



Recall (True Positive Rate) 134/(134+14) ma najszerszy przedział ufności, ponieważ jest to proporcja dwumianowa obejmująca małe zliczenia.

Swoistość (Rzeczywiście ujemny współczynnik) wynosi 80,388 80,388/(4,907 XNUMX + XNUMX XNUMX), co obejmuje dużo większe zliczenia, więc ma bardzo wąski przedział ufności wynoszący zaledwie [94.11% do 94.40%].

Ponieważ Zrównoważona Dokładność jest obliczana po prostu jako średnia Recall i Specyficzności, szerokość jej przedziału ufności jest pośrednia między ich przedziałami ufności.

Niedokładność pomiaru metrycznego spowodowana różnicami w danych testowych w porównaniu z różnicami w danych pociągu

 
 
Tutaj nie braliśmy pod uwagę zmienności w model w oparciu o losowość naszego trening danych (chociaż może to być również interesujące do niektórych celów, np. jeśli zautomatyzowałeś powtarzające się ponowne szkolenie i chcesz wiedzieć, jak bardzo może się różnić wydajność przyszłych modeli), ale raczej tylko zmienność pomiaru wydajności tego szczególny model (utworzony z pewnych konkretnych danych treningowych) ze względu na losowość naszego test danych.

Gdybyśmy mieli wystarczająco dużo niezależnych danych testowych, moglibyśmy bardzo dokładnie zmierzyć wydajność tego konkretnego modelu w badanej populacji i wiedzielibyśmy, jak będzie się zachowywał, jeśli ten model zostanie wdrożony, niezależnie od tego, jak zbudowaliśmy model i czy możemy uzyskać lepszy lub gorszy model z innym zestawem danych próby szkoleniowej.

Niezależność poszczególnych instancji

 
 
Metoda ładowania początkowego zakłada, że ​​każda z twoich instancji (przypadków, obserwacji) jest losowana niezależnie od podstawowej populacji. Jeśli twój zestaw testowy zawiera grupy wierszy, które nie są od siebie niezależne, na przykład powtarzające się obserwacje tej samej jednostki, które prawdopodobnie są ze sobą skorelowane, lub instancje, które są nadpróbkowane/replikowane/generowane — z innych instancji w twoim teście ustawiona, wyniki mogą być nieprawidłowe. Być może będziesz musiał użyć zgrupowane próbkowanie, w którym losowo rysujesz całe grupy zamiast pojedynczych rzędów, unikając przy tym rozdzielania jakiejkolwiek grupy lub po prostu wykorzystując jej część.

Chcesz również upewnić się, że nie masz grup podzielonych na zestaw treningowy i testowy, ponieważ wtedy zestaw testowy niekoniecznie jest niezależny i możesz uzyskać niewykryte nadmierne dopasowanie. Na przykład, jeśli używasz oversamplingu, powinieneś generalnie robić tylko only po został oddzielony od zestawu testowego, a nie wcześniej. I zwykle nadpróbkowałbyś zestaw treningowy, ale nie zestaw testowy, ponieważ zestaw testowy musi pozostać reprezentatywny dla instancji, które model zobaczy po przyszłym wdrożeniu. A do walidacji krzyżowej chciałbyś użyć scikit-learn model_selection.GroupKFold().

Wnioski

 
 
Zawsze możesz obliczyć przedziały ufności dla metryki oceny, aby zobaczyć, jak dokładnie dane testowe pozwalają mierzyć wydajność modelu. Planuję kolejny artykuł, aby zademonstrować przedziały ufności dla metryk, które oceniają przewidywania prawdopodobieństwa (lub wyniki ufności — brak związku z ufnością statystyczną), tj. miękkie klasyfikacje, takie jak Log Loss lub ROC AUC, zamiast metryk, których użyliśmy tutaj, które oceniają dyskretny wybór klasy przez model (klasyfikacja twarda). Ten sam kod działa zarówno w przypadku regresji (przewidywania ciągłej zmiennej docelowej) — wystarczy przekazać inny rodzaj przewidywania (i inny rodzaj prawdziwych celów w przypadku regresji).

Ten notatnik jupyter jest dostępny w github: bootConfIntAutoV1o_standalone.ipynb

Czy ten artykuł zawierał informacje i/lub był przydatny? Zamieść komentarz poniżej, jeśli masz jakieś komentarze lub pytania dotyczące tego artykułu lub przedziałów ufności, metody ładowania początkowego, liczby rozruchów, tej implementacji, zbioru danych, modelu, przesuwania progu lub wyników.

Oprócz ww poprzedni artykuł, możesz być również zainteresowany moim Jak automatycznie wykrywać kolumny daty/daty i ustawiać ich typ danych podczas czytania pliku CSV w Pandas, chociaż nie jest to bezpośrednio związane z niniejszym artykułem.

Niektóre prawa zastrzeżone

 
Bio: David B. Rosen (doktorat) jest głównym analitykiem danych ds. automatycznego zatwierdzania kredytów w IBM Global Financing. Znajdź więcej artykułów Davida na dabruro.medium.com.

Oryginalny. Przesłane za zgodą.

Związane z:

Źródło: https://www.kdnuggets.com/2021/10/calculate-confidence-intervals-performance-metrics-machine-learning.html

Znak czasu:

Więcej z Knuggety