Cum se calculează intervalele de încredere pentru valorile de performanță în Machine Learning folosind o metodă de bootstrap automată

Nodul sursă: 1178501

Cum se calculează intervalele de încredere pentru valorile de performanță în Machine Learning folosind o metodă de bootstrap automată

Măsurătorile performanței modelului dvs. sunt foarte precise din cauza unui set de testare „mare” sau foarte incerte din cauza unui set de testare „mic” sau dezechilibrat?


By David B Rosen (doctorat), Lead Data Scientist pentru aprobarea automată a creditelor la IBM Global Financing



Linia portocalie arată 89.7% ca limită inferioară a intervalului de încredere Balanced Accuracy, verde pentru Balanced Accuracy = 92.4% (estimare punctuală) și roșu pentru limita superioară de 94.7%. (Această și toate imaginile sunt ale autorului, dacă nu se specifică altfel.)

Introducere

 
 
Dacă raportați performanța clasificatorului dvs. ca având Precizie=94.8% și F1=92.3% pe un set de testare, acest lucru nu înseamnă mare lucru fără a ști ceva despre dimensiunea și compoziția setului de testare. Marja de eroare a acestor măsurători de performanță va varia foarte mult în funcție de dimensiunea setului de testare sau, pentru un set de date dezechilibrat, în principal în funcție de câte instanțe independente ale minoritate clasa pe care o conține (mai multe copii ale acelorași instanțe de la supraeșantionare nu ajută în acest scop).

Dacă ați reușit să colectați un alt set de testare independent de origine similară, este puțin probabil ca acuratețea și F1 ale modelului dvs. din acest set de date să fie aceleași, dar cât de diferite ar putea fi ele în mod plauzibil? La o întrebare similară cu aceasta se răspunde în statistici ca interval de încredere a măsurării.

Dacă ar fi să extragem multe seturi de date eșantioane independente din populația de bază, atunci pentru 95% dintre aceste seturi de date, valoarea adevărată a populației de bază a valorii ar fi în intervalul de încredere de 95% pe care l-am calcula pentru acel set de date eșantion anume.

În acest articol, vă vom arăta cum să calculați intervalele de încredere pentru orice număr de metrici de performanță Machine Learning simultan, cu o metodă bootstrap care în mod automat determină câte seturi de date eșantioane de pornire trebuie generate implicit.

Dacă doriți doar să vedeți cum să invocați acest cod pentru a calcula intervalele de încredere, treceți la secțiunea „Calculați rezultatele!" jos.

Metodologia bootstrap

 
 
Dacă am fi capabili să extragem seturi de date de testare suplimentare din distribuția reală care stă la baza datelor, am putea vedea distribuția valorilor de performanță de interes între acele seturi de date. (Când desenăm acele seturi de date nu am face nimic pentru a preveni desenarea unei instanțe identice sau similare de mai multe ori, deși acest lucru s-ar putea întâmpla doar rar.)

Deoarece nu putem face asta, următorul lucru cel mai bun este să extragem seturi de date suplimentare din distribuţie empirică a acestui set de date de testare, ceea ce înseamnă eșantionare, cu înlocuire, din instanțele sale pentru a genera noi seturi de date eșantioane bootstrap. Eșantionarea cu înlocuire înseamnă că, odată ce desenăm o anumită instanță, o punem înapoi astfel încât să o putem desena din nou pentru același set de date eșantion. Prin urmare, fiecare astfel de set de date are în general mai multe copii ale unora dintre instanțe și nu include toate instanțele care se află în setul de testare de bază.

Dacă am eșantionat fără înlocuire, atunci am obține pur și simplu o copie identică a setului de date original de fiecare dată, amestecată într-o ordine aleatorie diferită, care nu ar fi de nici un folos.

 percentilă Metodologia bootstrap pentru estimarea intervalului de încredere este următoarea:

  1. Genera nboots seturi de date „probă de bootstrap”, fiecare având aceeași dimensiune ca setul de testare original. Fiecare set de date eșantion este obținut prin extragerea aleatorie a instanțelor din setul de testare cu înlocuire.
  2. Pe fiecare dintre seturile de date eșantion, calculați valoarea și salvați-o.
  3. Intervalul de încredere de 95% este dat de 2.5th la 97.5th percentile dintre nboots valorile calculate ale metricii. Dacă nboots=1001 și ați sortat valorile într-o serie/matrice/listă X de lungime 1001, 0th percentila este X[0] și 100th percentila este X[1000], deci intervalul de încredere ar fi dat de X[25] la X[975].

Desigur, puteți calcula câte valori doriți pentru fiecare set de date eșantion la pasul 2, dar la pasul 3 veți găsi percentilele pentru fiecare măsură separat.

Exemplu de rezultate pentru set de date și interval de încredere

 
 
Vom folosi rezultatele din acest articol anterior ca exemplu: Cum să faceți față unei clasificări dezechilibrate, fără a reechilibra dateleÎnainte de a lua în considerare supraeșantionarea datelor dvs. distorsionate, încercați să ajustați pragul de decizie de clasificare.

În acel articol am folosit extrem de-Kaggle cu două clase dezechilibrat set de date de identificare a fraudei cu cardul de credit. Am ales să folosim un prag de clasificare destul de diferit de pragul implicit de 0.5 care este implicit în utilizarea metodei predict(), făcând inutilă echilibrarea datelor. Această abordare este uneori numită pragul în mișcare, în care clasificatorul nostru atribuie clasa aplicând pragul ales probabilității de clasă prezisă furnizată de predict_proba() metoda.

Vom limita domeniul de aplicare al acestui articol (și codului) la clasificarea binară: clasele 0 și 1, cu clasa 1 prin convenție fiind clasa „pozitivă” și în special clasa minoritară pentru date dezechilibrate, deși codul ar trebui să funcționeze pentru regresie (singur). ţintă continuă) de asemenea.

Generarea unui set de date eșantion de pornire

 
 
Deși codul nostru de interval de încredere poate gestiona un număr diferit de argumente de date care urmează să fie transmise funcțiilor metrice, ne vom concentra pe metrici în stil sklearn, care acceptă întotdeauna două argumente de date, y_true și y_pred, unde y_pred va fi fie predicții de clasă binară (0 sau 1), sau predicții continue de probabilitate de clasă sau funcție de decizie, sau chiar predicții de regresie continuă dacă y_true este și el continuu. Următoarea funcție generează un singur set de date eșantion de pornire. Acceptă orice data_args, dar în cazul nostru aceste argumente vor fi ytest(testul nostru real/adevărat a stabilit valorile țintă în articol anterior) Şi hardpredtst_tuned_thresh (clasa prezisă). Ambele conțin zerouri și unu pentru a indica clasa adevărată sau prezisă pentru fiecare instanță.

Valoare personalizată specificity_score() și funcții utilitare

 
 
Vom defini o funcție de metrică personalizată pentru Specificity, care este doar un alt nume pentru Rechemarea negativ clasa (clasa 0). De asemenea, o funcție calc_metrics care aplică o secvență de metrici de interes pentru datele noastre și câteva funcții utilitare pentru aceasta:

Aici facem lista noastră de valori și le aplicăm datelor. Nu am considerat acuratețea o măsură relevantă, deoarece un fals negativ (clasificarea greșită a unei fraude adevărate ca fiind legitimă) este mult mai costisitor pentru afacere decât un fals pozitiv (clasificarea greșită a unui adevărat legitim drept fraudă), în timp ce Accuracy tratează ambele tipuri de clasificare greșită. sunt la fel de rele și, prin urmare, favorizează clasificarea corectă a celor a căror clasă adevărată este clasa majoritară, deoarece acestea apar mult mai des și astfel contribuie mult mai mult la precizia generală.

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



Realizarea fiecărui set de date eșantion de pornire și calcularea valorilor pentru acesta

 
 
În raw_metric_samples() vom genera de fapt mai multe seturi de date eșantioane unul câte unul și vom salva valorile fiecăruia:

Dați raw_metric_samples() o listă de valori (sau doar o singură măsură) de interes, precum și datele reale și prezise ale clasei, iar acesta obține seturi de date eșantion nboots și returnează un cadru de date cu doar valorile indicilor calculate din fiecare set de date. Prin _boot_generator() se invocă one_boot() pe rând într-o expresie generator, mai degrabă decât să stocheze toate seturile de date simultan ca potențial-mare listă.

Uitați-vă la valorile pentru 7 seturi de date eșantion de pornire

 
 
Facem lista noastră de funcții metrice și invocăm raw_metric_samples() pentru a obține rezultatele pentru doar 7 seturi de date eșantion. Invocăm aici raw_metric_samples() pentru înțelegere - nu este necesar pentru a obține intervale de încredere folosind ci_auto() de mai jos, deși specificăm o listă de valori (sau doar o singură măsură) pentru ci_auto() is necesar.

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



Fiecare coloană de mai sus conține valorile calculate dintr-un set de date eșantion de pornire (numerotate de la 0 la 6), astfel încât valorile calculate ale valorii variază din cauza eșantionării aleatorii.

Numărul de seturi de date de pornire, cu valoarea implicită calculată

 
 
În implementarea noastră, implicit numărul de seturi de date de boot nboots va fi calculat automat de la nivelul de încredere dorit (ex. 95%) astfel încât să se îndeplinească recomandarea de North, Curtis și Sham pentru a avea un număr minim de rezultate de boot în fiecare coadă a distribuției. (De fapt, această recomandare se aplică p-valori si deci test de ipoteza regiuni de acceptare, Dar intervale de încredere sunt suficient de asemănătoare cu cele pentru a folosi acest lucru ca regulă generală.) Deși autorii respectivi recomandă un minim de 10 rezultate de boot în coadă, Davidson și MacKinnon recomandam cel putin 399 de cizme pentru o incredere de 95%, ceea ce necesita 11 cizme in coada, asa ca folosim aceasta recomandare mai conservatoare.

We specify alpha which is 1 – confidence level. E.g. 95% confidence becomes 0.95 and alpha=0.05. If you specify an explicit number of boots (perhaps a smaller nboots pentru că doriți rezultate mai rapide) dar nu este suficient pentru alfa solicitat, se va alege automat un alfa mai mare pentru a obține un interval de încredere precis pentru acel număr de cizme. Se vor folosi minim 51 de cizme, deoarece orice mai puțin poate calcula cu exactitate doar niveluri de încredere bizar de mici (cum ar fi încrederea de 40%, care oferă un interval de la 30th percentila la 70th percentilă, care are 40% în interiorul intervalului, dar 60% în afara acestuia) și nu este clar că recomandarea de minimum-boots a avut în vedere măcar un astfel de caz.

Funcția get_alpha_nboots() setează nboots implicite sau modifică alpha și nboots solicitate conform mai sus:

Să arătăm nbooturile implicite pentru diferite valori ale 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')



Iată ce se întâmplă dacă solicităm un nboots explicit:

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'))



Valorile mici nboots au crescut alfa la 0.05 și 0.40, iar nboots=2 se modifică la minim 51.

Histograma setului de date eșantion bootstrap care arată intervalul de încredere doar pentru Balanced Accuracy

 
 
Din nou, nu trebuie să facem acest lucru pentru a obține intervalele de încredere de mai jos, invocând ci_auto().

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



Linia portocalie arată 89.7% ca limită inferioară a intervalului de încredere Balanced Accuracy, verde pentru Balanced Accuracy = 92.4% (estimare punctuală) și roșu pentru limita superioară de 94.7%. (Aceeași imagine apare în partea de sus a acestui articol.)

Cum se calculează toate intervalele de încredere pentru lista de valori

 
 
Aici este funcția principală care invocă cele de mai sus și calculează intervalele de încredere din percentilele rezultatelor metricii și inserează estimările punctuale ca prima coloană a cadrului de date de ieșire al rezultatelor.

Calculați rezultatele!

 
 
Acesta este tot ce trebuia să facem: invocăm ci_auto() după cum urmează, cu o listă de valori (met atribuite mai sus) pentru a-și obține intervalele de încredere. Formatarea procentuală este opțională:

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



Discuție asupra intervalelor de încredere rezultate

 
 
Iată matricea de confuzie din Articol original. Clasa 0 este negativul (clasa majoritară) și clasa 1 este pozitiv (clasa foarte rară)



Rechemarea (rata pozitivă adevărată) de 134/(134+14) are cel mai larg interval de încredere, deoarece aceasta este o proporție binomială care implică numărări mici.

Specificitatea (Rata negativă adevărată) este 80,388/(80,388+4,907), ceea ce implică mult numără mai mare, deci are un interval de încredere extrem de îngust de doar [94.11% până la 94.40%].

Deoarece precizia echilibrată este calculată ca o simplă medie a retragerii și a specificității, lățimea intervalului său de încredere este intermediară între a lor.

Imprecizia măsurării metrice din cauza variațiilor datelor de testare, față de variațiile datelor trenului

 
 
Aici nu am luat în considerare variabilitatea în model pe baza aleatoriei noastre pregătire date (deși acestea pot fi, de asemenea, de interes pentru anumite scopuri, de exemplu dacă ați reinstruit automat și repetat și doriți să știți cât de mult ar putea varia performanța modelelor viitoare), ci mai degrabă doar variabilitatea în măsurarea performanței acestui special model (creat din anumite date de antrenament) datorită caracterului aleatoriu al nostru test de date.

Dacă am avea suficiente date de testare independente, am putea măsura foarte precis performanța acestui model particular pe populația de bază și am ști cum va funcționa dacă acest model este implementat, indiferent de modul în care am construit modelul și dacă am putea obțineți un model mai bun sau mai rău cu un set de date eșantion de antrenament diferit.

Independența instanțelor individuale

 
 
Metoda bootstrap presupune că fiecare dintre instanțe (cazuri, observații) este extrasă independent de o populație subiacentă. Dacă setul dvs. de testare are grupuri de rânduri care nu sunt independente unul de celălalt, de exemplu, observații repetate ale aceleiași entități care probabil să fie corelate între ele sau instanțe care sunt supraeșantionate/replicate/generate din alte instanțe din testul dvs. setat, este posibil ca rezultatele să nu fie valide. S-ar putea să fie nevoie să utilizați grupate eșantionare, în care trageți grupuri întregi împreună la întâmplare, mai degrabă decât rânduri individuale, evitând în același timp despărțirea oricărui grup sau doar folosirea unei părți a acestuia.

De asemenea, doriți să vă asigurați că nu aveți grupuri care au fost împărțite în setul de antrenament și de testare, pentru că atunci setul de testare nu este neapărat independent și s-ar putea să obțineți o supraadaptare nedetectată. De exemplu, dacă utilizați supraeșantionarea, în general, ar trebui să faceți numai numai după a fost împărțit din setul de testare, nu înainte. Și, în mod normal, ați supraeșantiona setul de antrenament, dar nu și setul de testare, deoarece setul de testare trebuie să rămână reprezentativ pentru cazurile pe care modelul le va vedea la implementarea viitoare. Și pentru validare încrucișată, ați dori să utilizați scikit-learn's model_selection.GroupKFold().

Concluzie

 
 
Puteți calcula oricând intervale de încredere pentru valorile dvs. de evaluare pentru a vedea cât de precis vă permit datele de testare să măsurați performanța modelului. Plănuiesc un alt articol pentru a demonstra intervalele de încredere pentru valorile care evaluează predicțiile de probabilitate (sau scorurile de încredere - fără legătură cu încrederea statistică), adică clasificarea soft, cum ar fi Log Loss sau ROC AUC, mai degrabă decât valorile pe care le-am folosit aici care evaluează alegerea discretă a clasei după model (clasificare dură). Același cod funcționează atât pentru ambele, cât și pentru regresie (predicarea unei variabile țintă continuă) - trebuie doar să îi transmiteți un alt tip de predicție (și diferite tipuri de ținte adevărate în cazul regresiei).

Acest caiet jupyter este disponibil în github: bootConfIntAutoV1o_standalone.ipynb

A fost acest articol informativ și/sau util? Postați un comentariu mai jos dacă aveți comentarii sau întrebări despre acest articol sau despre intervalele de încredere, bootstrap-ul, numărul de boot-uri, această implementare, set de date, model, mutarea pragului sau rezultate.

Pe lângă cele menționate mai sus articol anterior, s-ar putea să te intereseze și de mine Cum să detectați automat coloanele Data / Datetime și să le setați tipul de date când citiți un fișier CSV în panda, deși nu are legătură directă cu articolul de față.

Unele drepturi rezervate

 
Bio: David B Rosen (doctorat) este Lead Data Scientist pentru aprobarea automată a creditelor la IBM Global Financing. Găsiți mai multe din scrierile lui David la dabruro.medium.com.

Original. Repostat cu permisiunea.

Related:

Sursa: https://www.kdnuggets.com/2021/10/calculate-confidence-intervals-performance-metrics-machine-learning.html

Timestamp-ul:

Mai mult de la KDnuggets