Sådan beregnes konfidensintervaller for ydeevnemålinger i Machine Learning ved hjælp af en automatisk bootstrap-metode

Kildeknude: 1178501

Sådan beregnes konfidensintervaller for ydeevnemålinger i Machine Learning ved hjælp af en automatisk bootstrap-metode

Er dine modelydelsesmålinger meget præcise på grund af et "stort" testsæt, eller meget usikkert på grund af et "lille" eller ubalanceret testsæt?


By David B Rosen (PhD), Lead Data Scientist for Automated Credit Approval hos IBM Global Financing



Den orange linje viser 89.7 % som den nedre grænse for Balanced Accuracy-konfidensintervallet, grøn for den oprindelige observerede Balanced Accuracy=92.4 % (punktestimat) og rød for øvre grænse på 94.7 %. (Dette og alle billeder er af forfatteren, medmindre andet er angivet.)

Introduktion

 
 
Hvis du rapporterer din klassificerers præstation som havende Nøjagtighed=94.8% og F1=92.3% på et testsæt, betyder det ikke meget uden at vide noget om størrelsen og sammensætningen af ​​testsættet. Fejlmarginen for disse præstationsmålinger vil variere meget afhængigt af størrelsen af ​​testsættet eller, for et ubalanceret datasæt, primært afhængigt af hvor mange uafhængige forekomster af mindretal klasse den indeholder (flere kopier af de samme forekomster fra oversampling hjælper ikke til dette formål).

Hvis du var i stand til at indsamle et andet, uafhængigt testsæt af lignende oprindelse, er det usandsynligt, at nøjagtigheden og F1 af din model på dette datasæt er de samme, men hvor meget forskellige kan de sandsynligt være? Et spørgsmål svarende til dette besvares i statistikken som konfidensinterval af målingen.

Hvis vi skulle trække mange uafhængige prøvedatasæt fra den underliggende population, ville den sande underliggende populationsværdi af metrikken for 95 % af disse datasæt ligge inden for det 95 % konfidensinterval, som vi ville beregne for det pågældende prøvedatasæt.

I denne artikel vil vi vise dig, hvordan du beregner konfidensintervaller for et hvilket som helst antal maskinlærings-ydeevnemålinger på én gang med en bootstrap-metode, der automatisk bestemmer, hvor mange opstartseksempeldatasæt, der skal genereres som standard.

Hvis du bare vil se, hvordan du aktiverer denne kode for at beregne konfidensintervaller, skal du springe til afsnittet "Beregn resultaterne!" nedenunder.

Bootstrap-metoden

 
 
Hvis vi var i stand til at trække yderligere testdatasæt fra den sande fordeling, der ligger til grund for dataene, ville vi være i stand til at se fordelingen af ​​de(n) præstationsmetrik(er) af interesse på tværs af disse datasæt. (Når vi tegnede disse datasæt, ville vi ikke gøre noget for at forhindre, at vi tegnede en identisk eller lignende instans flere gange, selvom dette måske kun sker sjældent.)

Da vi ikke kan gøre det, er den næstbedste ting at tegne yderligere datasæt fra empirisk fordeling af dette testdatasæt, hvilket betyder sampling, med erstatning, fra dets instanser for at generere nye bootstrap-eksempeldatasæt. Sampling med erstatning betyder, at når vi tegner en bestemt instans, sætter vi den ind igen, så vi kan trække den igen for det samme prøvedatasæt. Derfor har hvert sådant datasæt generelt flere kopier af nogle af forekomsterne og inkluderer ikke alle de forekomster, der er i basistestsættet.

Hvis vi prøvede uden udskiftning, så ville vi simpelthen få en identisk kopi af det originale datasæt hver gang, blandet i en anden tilfældig rækkefølge, hvilket ikke ville være til nogen nytte.

 percentil bootstrap-metoden til at estimere konfidensintervallet er som følger:

  1. Generer nboots "bootstrap sample"-datasæt, hver af samme størrelse som det originale testsæt. Hvert prøvedatasæt opnås ved at trække instanser tilfældigt fra testsættet med erstatning.
  2. På hvert af prøvedatasættene skal du beregne metrikken og gemme den.
  3. 95 % konfidensintervallet er givet af 2.5th til 97.5th percentil blandt nboots beregnede værdier af metrikken. Hvis nboots=1001 og du sorterede værdierne i en serie/array/liste X af længde 1001, 0th percentil er X[0] og de 100th percentil er X[1000], så konfidensintervallet ville være givet af X[25] til X[975].

Selvfølgelig kan du beregne så mange metrics, som du vil, for hvert eksempeldatasæt i trin 2, men i trin 3 finder du percentilerne for hver metrik separat.

Eksempel på datasæt og konfidensintervalresultater

 
 
Vi vil bruge resultater fra denne tidligere artikel som et eksempel: Hvordan man håndterer ubalanceret klassificering uden at genbalancere dataeneFør du overvejer at oversample dine skæve data, kan du prøve at justere din klassificeringsbeslutningstærskel.

I den artikel brugte vi stærkt-ubalanceret to-klasse Kaggle kreditkortsvindel identifikationsdatasæt. Vi valgte at bruge en klassificeringstærskel, der er ret forskellig fra standardtærsklen på 0.5, der er implicit i brugen af ​​predict()-metoden, hvilket gør det unødvendigt at balancere dataene. Denne tilgang kaldes nogle gange tærskel bevæger sig, hvor vores klassifikator tildeler klassen ved at anvende den valgte tærskel på den forudsagte klassesandsynlighed, som forudsigelsen giver_proba() metode.

Vi vil begrænse omfanget af denne artikel (og kode) til binær klassifikation: klasse 0 og 1, hvor klasse 1 efter konvention er den "positive" klasse og specifikt minoritetsklassen for ubalancerede data, selvom koden bør fungere til regression (enkelt) løbende mål).

Genererer ét opstartseksempeldatasæt

 
 
Selvom vores konfidensintervalkode kan håndtere forskellige antal dataargumenter, der skal videregives til metriske funktioner, vil vi fokusere på metrics i sklearn-stil, som altid accepterer to dataargumenter, y_true og y_pred, hvor y_pred enten vil være binære klasse forudsigelser (0 eller 1), eller kontinuerlige forudsigelser af klassesandsynlighed eller beslutningsfunktioner, eller endda forudsigelser af kontinuerlig regression, hvis y_true også er kontinuert. Følgende funktion genererer et enkelt opstartseksempeldatasæt. Den accepterer alle data_args, men i vores tilfælde vil disse argumenter være det ytest(vores faktiske/sande test indstillede målværdier i forudgående artikel) og hardpredtst_tuned_thresh (den forudsagte klasse). Begge indeholder nuller og ettaller for at angive den sande eller forudsagte klasse for hver forekomst.

Tilpasset metrisk specificity_score() og hjælpefunktioner

 
 
Vi vil definere en brugerdefineret metrisk funktion for Specificitet, som blot er et andet navn for Recall of the negativ klasse (klasse 0). Også en calc_metrics-funktion, som anvender en række målinger af interesse på vores data, og et par hjælpefunktioner til det:

Her laver vi vores liste over metrics og anvender dem på dataene. Vi anså ikke nøjagtighed for at være en relevant målestok, fordi en falsk negativ (fejlklassificering af en sand svig som lovlig) er meget dyrere for virksomheden end en falsk positiv (fejlklassificering af en ægte legitim som en svig), hvorimod nøjagtighed behandler begge typer fejlklassificering er lige så dårlige og foretrækker derfor korrekt klassificering af dem, hvis sande klasse er majoritetsklassen, fordi disse forekommer meget oftere og dermed bidrager meget mere til den samlede nøjagtighed.

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



Fremstilling af hvert opstartseksempeldatasæt og beregning af metrics for det

 
 
I raw_metric_samples() vil vi faktisk generere flere eksempeldatasæt én efter én og gemme metrics for hver:

Du giver raw_metric_samples() en liste over metrics (eller kun én metric) af interesse såvel som de sande og forudsagte klassedata, og den opnår nboots-eksempeldatasæt og returnerer en dataramme med kun metrikkens værdier beregnet ud fra hvert datasæt. Gennem _boot_generator() kalder den one_boot() én ad gangen i et generatorudtryk i stedet for at gemme alle datasættene på én gang som et potentielt-kæmpe liste.

Se på metrikker på 7 opstartseksempeldatasæt

 
 
Vi laver vores liste over metriske funktioner og kalder raw_metric_samples() for at få resultaterne for kun 7 eksempeldatasæt. Vi påberåber os raw_metric_samples() her for at forstå - det er ikke nødvendigt for at få konfidensintervaller ved at bruge ci_auto() nedenfor, selvom vi angiver en liste over metrics (eller kun én metric) for ci_auto() is nødvendig.

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



Hver kolonne ovenfor indeholder metrikker, der er beregnet ud fra et opstartseksempeldatasæt (nummereret 0 til 6), så de beregnede metriske værdier varierer på grund af den tilfældige stikprøve.

Antal opstartsdatasæt med beregnet standard

 
 
I vores implementering er antallet af opstartsdatasæt som standard nboots vil blive beregnet automatisk ud fra det ønskede konfidensniveau (f.eks. 95%) for at opfylde anbefalingen pr. North, Curtis og Sham at have et minimum antal startresultater i hver hale af distributionen. (Faktisk gælder denne anbefaling for p-værdier og dermed hypotesetest accept regioner, men konfidensintervaller ligner dem nok til at bruge dette som en tommelfingerregel.) Selvom disse forfattere anbefaler minimum 10 støvleresultater i halen, Davidson og MacKinnon anbefaler mindst 399 støvler for 95% selvtillid, hvilket kræver 11 støvler i halen, så vi bruger denne mere konservative anbefaling.

Vi angiver alfa, som er 1 – konfidensniveau. F.eks. bliver 95 % konfidens 0.95 og alfa=0.05. Hvis du angiver et eksplicit antal støvler (måske et mindre nboots fordi du ønsker hurtigere resultater), men det er ikke nok til din ønskede alfa, en højere alfa vil automatisk blive valgt for at få et præcist konfidensinterval for det antal støvler. Der vil blive brugt mindst 51 støvler, fordi mindste kun nøjagtigt kan beregne bizarre små konfidensniveauer (såsom 40 % konfidens, hvilket giver et interval fra de 30th percentil til 70th percentil, som har 40 % inde i intervallet, men 60 % udenfor), og det er ikke klart, at minimumsstøvleranbefalingen overhovedet overvejede et sådant tilfælde.

Funktionen get_alpha_nboots() indstiller standard nboots eller ændrer de anmodede alpha og nboots som ovenfor:

Lad os vise standard nboots for forskellige værdier af 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')



Her er, hvad der sker, hvis vi anmoder om en eksplicit 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'))



Små nboots-værdier øges alfa til 0.05 og 0.40, og nboots=2 ændres til minimum 51.

Histogram af bootstrap-eksempeldatasæt, der viser konfidensinterval kun for Balanced Accuracy

 
 
Igen behøver vi ikke at gøre dette for at få konfidensintervallerne nedenfor ved at påberåbe ci_auto().

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



Den orange linje viser 89.7 % som den nedre grænse for Balanced Accuracy-konfidensintervallet, grøn for den oprindelige observerede Balanced Accuracy=92.4 % (punktestimat) og rød for øvre grænse på 94.7 %. (Samme billede vises øverst i denne artikel.)

Sådan beregnes alle konfidensintervaller for en liste over målinger

 
 
Her er hovedfunktionen, der påberåber sig ovenstående og beregner konfidensintervallerne ud fra percentilerne af de metriske resultater, og indsætter punktestimaterne som den første kolonne i dens outputdataramme med resultater.

Beregn resultaterne!

 
 
Dette er alt, hvad vi virkelig behøvede at gøre: påkald ci_auto() som følger med en liste over metrics (met tildelt ovenfor) for at få deres konfidensintervaller. Den procentvise formatering er valgfri:

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



Diskussion af resulterende konfidensintervaller

 
 
Her er forvirringsmatricen fra oprindelige artikel. Klasse 0 er de negative (flertalsklasse) og klasse 1 er de positive (meget sjælden klasse)



Genkaldelsen (True Positive Rate) på 134/(134+14) har det bredeste konfidensinterval, fordi dette er en binomial andel, der involverer små tællinger.

Specificiteten (True Negative Rate) er 80,388/(80,388+4,907), hvilket involverer meget større antal, så den har et ekstremt smalt konfidensinterval på kun [94.11 % til 94.40 %].

Da den afbalancerede nøjagtighed er beregnet som et gennemsnit af genkaldelsen og specificiteten, er bredden af ​​dets konfidensinterval mellem deres.

Metrisk måling unøjagtighed på grund af variationer i testdata vs. variationer i togdata

 
 
Her har vi ikke overvejet variabiliteten i model baseret på tilfældigheden af ​​vores uddannelse data (selvom det også kan være af interesse til nogle formål, f.eks. hvis du har automatiseret gentagen genoptræning og ønsker at vide, hvor meget ydeevnen af ​​fremtidige modeller kan variere), men snarere kun variabiliteten i måling af dennes ydeevne. særlig model (skabt ud fra nogle bestemte træningsdata) på grund af tilfældigheden af ​​vores prøve data.

Hvis vi havde nok uafhængige testdata, kunne vi måle ydeevnen af ​​denne særlige model på den underliggende population meget præcist, og vi ville vide, hvordan den vil fungere, hvis denne model bliver implementeret, uanset hvordan vi har bygget modellen og om vi evt. få en bedre eller dårligere model med et andet træningseksempeldatasæt.

Uafhængighed af individuelle instanser

 
 
Bootstrap-metoden antager, at hver af dine forekomster (cases, observationer) er tegnet uafhængigt af en underliggende population. Hvis dit testsæt har grupper af rækker, der ikke er uafhængige af hinanden, f.eks. gentagne observationer af den samme enhed, der sandsynligvis er korreleret med hinanden, eller forekomster, der er oversamplet/replikeret/genereret - fra andre forekomster i din test indstillet, er resultaterne muligvis ikke gyldige. Du skal muligvis bruge grupperet stikprøve, hvor du trækker hele grupper sammen tilfældigt frem for individuelle rækker, mens du undgår at opdele en gruppe eller blot bruge en del af den.

Du vil også gerne sikre dig, at du ikke har grupper, der er opdelt på tværs af trænings- og testsættet, for så er testsættet ikke nødvendigvis uafhængigt, og du kan få uopdaget overfitting. For eksempel, hvis du bruger oversampling, bør du generelt kun gøre det efter det er blevet splittet fra testsættet, ikke før. Og normalt ville du oversample træningssættet, men ikke testsættet, da testsættet skal forblive repræsentativt for tilfælde, som modellen vil se ved fremtidig implementering. Og til krydsvalidering vil du gerne bruge scikit-learn's model_selection.GroupKFold().

Konklusion

 
 
Du kan altid beregne konfidensintervaller for dine evalueringsmetrikker for at se, hvor præcist dine testdata gør dig i stand til at måle din models ydeevne. Jeg planlægger en anden artikel for at demonstrere konfidensintervaller for metrics, der evaluerer sandsynlighedsforudsigelser (eller konfidensscore - ingen relation til statistisk konfidens), dvs. blød klassifikation, såsom Log Loss eller ROC AUC, snarere end de metrics, vi brugte her, som evaluerer diskret valg af klasse efter modellen (hård klassificering). Den samme kode virker for begge, såvel som for regression (forudsige en kontinuerlig målvariabel) - du skal bare give den en anden slags forudsigelse (og forskellige slags sande mål i tilfælde af regression).

Denne jupyter notesbog er tilgængelig i github: bootConfIntAutoV1o_standalone.ipynb

Var denne artikel informativ og/eller nyttig? Skriv venligst en kommentar nedenfor, hvis du har kommentarer eller spørgsmål til denne artikel eller om konfidensintervaller, bootstrap, antal støvler, denne implementering, datasæt, model, tærskelbevægelse eller resultater.

Ud over det førnævnte forudgående artikel, kan du også være interesseret i min Sådan registrerer du automatisk dato/dato-tidspunkt-kolonnerne og indstiller deres datatype, når du læser en CSV-fil i Pandas, selvom det ikke er direkte relateret til denne artikel.

Nogle rettigheder forbeholdes

 
Bio: David B Rosen (PhD) er Lead Data Scientist for Automated Credit Approval hos IBM Global Financing. Find mere af Davids forfatterskab på dabruro.medium.com.

Original. Genopslået med tilladelse.

Relateret:

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

Tidsstempel:

Mere fra KDnuggets