Koneoppimisen suorituskykymittareiden luottamusvälien laskeminen automaattisella käynnistysmenetelmällä

Lähdesolmu: 1178501

Koneoppimisen suorituskykymittareiden luottamusvälien laskeminen automaattisella käynnistysmenetelmällä

Ovatko mallisi suorituskykymittaukset erittäin tarkkoja "suuren" testisarjan vuoksi tai erittäin epävarmoja "pienen" tai epätasapainoisen testisarjan vuoksi?


By David B Rosen (PhD), IBM Global Financingin automaattisen luoton hyväksynnän johtava tietotutkija



Oranssi viiva näyttää 89.7 % tasapainoisen tarkkuuden luottamusvälin alarajana, vihreä alkuperäiselle tasapainoiselle tarkkuudelle = 92.4 % (pistearvio) ja punainen 94.7 %:n ylärajalle. (Tämä ja kaikki kuvat ovat tekijän omia, ellei toisin mainita.)

esittely

 
 
Jos ilmoitat luokittelijasi suorituskyvyn siten, että Tarkkuus = 94.8 % ja F1 = 92.3 % testisarjassa, tämä ei merkitse paljoa, jos tiedät jotain testijoukon koosta ja koostumuksesta. Näiden suorituskykymittausten virhemarginaali vaihtelee paljon riippuen testijoukon koosta tai epätasapainoisen tietojoukon tapauksessa ensisijaisesti riippuen siitä, kuinka monta riippumatonta esiintymää vähemmistö luokka, jonka se sisältää (enemmät kopiot samoista ilmentymistä ylinäytteenotosta ei auta tähän tarkoitukseen).

Jos pystyit keräämään toisen, samankaltaisen alkuperän olevan riippumattoman testisarjan, mallisi tarkkuus ja F1 eivät todennäköisesti ole samat tässä tietojoukossa, mutta kuinka paljon erilaisia ​​ne todennäköisesti ovat? Samankaltaiseen kysymykseen vastataan tilastoissa nimellä luottamusväli mittauksesta.

Jos ottaisimme taustalla olevasta perusjoukosta monia riippumattomia otostietojoukkoja, 95 %:lla näistä tietojoukoista metriikan todellinen taustalla oleva perusjoukon arvo olisi 95 %:n luottamusvälillä, jonka laskemme kyseiselle otostietojoukolle.

Tässä artikkelissa näytämme, kuinka voit laskea luottamusvälit mille tahansa määrälle koneoppimisen suorituskykymittareita kerralla bootstrap-menetelmällä, joka automaattisesti määrittää, kuinka monta käynnistysnäytetietojoukkoa luodaan oletuksena.

Jos haluat vain nähdä, kuinka tämä koodi voidaan kutsua luottamusvälien laskemiseksi, siirry osioon "Laske tulokset!" alhaalla.

Bootstrap-metodologia

 
 
Jos pystyisimme luomaan lisää testitietojoukkoja tietojen todellisesta jakaumasta, voisimme nähdä kiinnostavan tehokkuusmittarin (mittareiden) jakautumisen kyseisten tietojoukkojen kesken. (Kun piirretään näitä tietojoukkoja, emme tekisi mitään estääksemme piirtämästä identtistä tai samankaltaista esiintymää useita kertoja, vaikka tämä saattaa tapahtua vain harvoin.)

Koska emme voi tehdä sitä, seuraavaksi paras tapa on ottaa lisää tietojoukkoja tiedostosta empiirinen jakauma tämän testidatajoukon, mikä tarkoittaa näytteenottoa ja korvaamista sen esiintymistä uusien bootstrap-näytetietojoukkojen luomiseksi. Otanta korvaamalla tarkoittaa, että kun piirrämme tietyn esiintymän, asetamme sen takaisin, jotta voimme piirtää sen uudelleen samalle näytetietojoukolle. Siksi jokaisessa tällaisessa tietojoukossa on yleensä useita kopioita joistakin esiintymistä, eikä se sisällä kaikkia perustestijoukossa olevia ilmentymiä.

Jos otimme näytteitä ilman korvaus, niin saisimme joka kerta identtisen kopion alkuperäisestä tietojoukosta eri satunnaisessa järjestyksessä sekoitettuna, mistä ei olisi mitään hyötyä.

prosenttipiste bootstrap-metodologia luottamusvälin arvioimiseksi on seuraava:

  1. Tuottaa nboots "bootstrap sample" -tietojoukot, joista jokainen on samankokoinen kuin alkuperäinen testijoukko. Jokainen näytetietojoukko saadaan piirtämällä esiintymiä satunnaisesti testijoukosta korvaamalla.
  2. Laske kunkin näytetietojoukon mittari ja tallenna se.
  3. 95 %:n luottamusväli on 2.5th 97.5: äänth prosenttipiste joukossa nboots metriikan lasketut arvot. Jos nboots=1001 ja olet lajitellut arvot sarjaan/taulukkoon/luetteloon X pituus 1001, 0th prosenttipiste on X[0] ja 100th prosenttipiste on X[1000], joten luottamusväli annettaisiin kaavalla X[25] X[975].

Voit tietysti laskea niin monta mittaria kuin haluat kullekin näytetietojoukolle vaiheessa 2, mutta vaiheessa 3 löydät kunkin mittarin prosenttipisteet erikseen.

Esimerkkitietojoukon ja luottamusvälin tulokset

 
 
Käytämme tämän edellisen artikkelin tuloksia esimerkkinä: Kuinka käsitellä epätasapainoista luokittelua ilman, että tietoja tasapainotetaan uudelleenEnnen kuin harkitset vääristyneiden tietojen yliotostamista, yritä muuttaa luokittelupäätöskynnystäsi.

Tässä artikkelissa käytimme erittäin-epätasapainoinen kahden luokan Kaggle luottokorttipetosten tunnistetiedot. Valitsimme käyttää luokittelukynnystä, joka poikkeaa oletusarvoisesta 0.5-kynnysarvosta, joka on implisiittinen ennustaa()-menetelmän käytössä, mikä tekee tietojen tasapainottamisen tarpeettomaksi. Tätä lähestymistapaa kutsutaan joskus nimellä kynnys liikkuu, jossa luokittelijamme määrittää luokan soveltamalla valittua kynnystä ennusteen tarjoamaan ennustettuun luokan todennäköisyyteen._proba() menetelmä.

Rajoitamme tämän artikkelin (ja koodin) soveltamisalan binääriluokitukseen: luokat 0 ja 1, jolloin luokka 1 on sopimuksen mukaan "positiivinen" luokka ja erityisesti vähemmistöluokka epätasapainoisille tiedoille, vaikka koodin pitäisi toimia regressiossa (yksittäinen jatkuva tavoite).

Luodaan yhtä käynnistysnäytetietojoukkoa

 
 
Vaikka luottamusvälikoodimme pystyy käsittelemään useita metriikkafunktioille välitettäviä dataargumentteja, keskitymme sklearn-tyylisiin mittareihin, jotka hyväksyvät aina kaksi dataargumenttia, y_true ja y_pred, missä y_pred on joko binääriluokkaennusteita (0 tai 1), tai jatkuvat luokkatodennäköisyys- tai päätösfunktioennusteet tai jopa jatkuvat regressioennusteet, jos y_true on myös jatkuva. Seuraava funktio luo yhden käynnistysmallitietojoukon. Se hyväksyy kaikki data_args, mutta meidän tapauksessamme nämä argumentit ovat ytest(todelliset/todelliset testimme asettivat tavoitearvot edellinen artikkeli) Ja hardpredtst_tuned_thresh (ennustettu luokka). Molemmat sisältävät nollia ja ykkösiä osoittamaan kunkin esiintymän todellisen tai ennustetun luokan.

Mukautettu metriikka specificity_score() ja apufunktiot

 
 
Määritämme mukautetun mittausfunktion spesifisyydelle, joka on vain toinen nimi Recall of the negatiivinen luokka (luokka 0). Myös calc_metrics-funktio, joka soveltaa tietoihimme kiinnostavia mittareita, ja pari sen apufunktiota:

Tässä teemme luettelon mittareista ja käytämme niitä tietoihin. Emme pitäneet tarkkuutta merkityksellisenä mittarina, koska väärä negatiivinen (todellisen petoksen luokittelu väärin lailliseksi) on yritykselle paljon kalliimpaa kuin väärä positiivinen tulos (todellisen laillisen väärän luokittelu petokseksi), kun taas tarkkuus käsittelee molempia väärin luokittelutyyppejä. ovat yhtä huonoja ja suosivat siksi niiden oikeaa luokittelua, joiden todellinen luokka on enemmistöluokka, koska näitä esiintyy paljon useammin ja siten ne vaikuttavat paljon enemmän yleiseen tarkkuuteen.

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



Jokaisen käynnistysnäytetietojoukon tekeminen ja sen mittareiden laskeminen

 
 
Raaka_metric_samples():ssa luomme useita näytetietojoukkoja yksitellen ja tallennamme kunkin tiedot:

Annat raw_metric_samples() -parametrille luettelon kiinnostavista mittareista (tai vain yhdestä mittarista) sekä todelliset ja ennustetut luokkatiedot, ja se hakee nboots-näytetietojoukot ja palauttaa tietokehyksen, jossa on vain metriikan arvot, jotka on laskettu kustakin tietojoukosta. _boot_generator():n kautta se kutsuu one_boot():n yksi kerrallaan generaattorilausekkeessa sen sijaan, että tallentaisi kaikki tietojoukot kerralla mahdollisenavaltava lista.

Katso 7 käynnistysnäytteen tietojoukon mittareita

 
 
Teemme luettelon metrifunktioista ja kutsumme raw_metric_samples():n saadaksemme tulokset vain 7 näytetietojoukolle. Käytämme raw_metric_samples():tä tässä ymmärtämisen vuoksi – se ei ole välttämätöntä luottamusvälien saamiseksi käyttämällä alla olevaa ci_auto()-komentoa, vaikka ci_auto() määrittääkin listan mittareista (tai vain yhden mittarin). is välttämätön.

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



Jokainen yllä oleva sarake sisältää mittarit, jotka on laskettu yhdestä käynnistysnäytetietojoukosta (numeroitu 0–6), joten lasketut mittariarvot vaihtelevat satunnaisotannan vuoksi.

Käynnistystietojoukkojen lukumäärä lasketulla oletusarvolla

 
 
Toteutuksessamme oletusarvoisesti käynnistystietojoukkojen määrä nboots lasketaan automaattisesti halutusta luottamustasosta (esim. 95 %), jotta se täyttää suosituksen mennessä North, Curtis ja Sham jotta jakelun kussakin päässä olisi vähimmäismäärä käynnistystuloksia. (Itse asiassa tämä suositus koskee p-arvot ja siten hypoteesitesti hyväksymisalueet, Vaan luottamusvälit ovat tarpeeksi samanlaisia ​​kuin ne, jotta tätä voidaan käyttää peukalosääntönä.) Vaikka kyseiset kirjoittajat suosittelevat vähintään 10 käynnistystulosta häntässä, Davidson ja MacKinnon suosittelemme vähintään 399 saappaita 95 %:n varmuudella, mikä vaatii 11 saappaa pyrstössä, joten käytämme tätä konservatiivisempaa suositusta.

Määritämme alfan, joka on 1 – luottamustaso. Esim. 95 %:n luotettavuudesta tulee 0.95 ja alfa=0.05. Jos määrität nimenomaisen määrän käynnistyksiä (ehkä pienempi nboots koska haluat nopeampia tuloksia), mutta se ei riitä pyytämällesi alfalle, korkeampi alfa valitaan automaattisesti, jotta saadaan tarkka luottamusväli tälle käynnistysmäärälle. Vähintään 51 saappaa käytetään, koska vähempi voi laskea tarkasti vain oudon pienet luottamustasot (kuten 40 %:n luotettavuus, joka antaa välin 30:stäth prosenttipiste 70:eenth prosenttipiste, jolla on 40 % intervallin sisällä, mutta 60 % sen ulkopuolella), ja ei ole selvää, onko saappaiden vähimmäissuosituksessa edes harkittu tällaista tapausta.

Funktio get_alpha_nboots() asettaa oletusarvoiset nboots tai muuttaa pyydetyt alfa- ja nboots-arvot yllä olevan mukaisesti:

Näytetään oletusarvoiset nboots eri alpha-arvoille:

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



Näin tapahtuu, jos pyydämme nimenomaista nboots-koodia:

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



Pienet nboots-arvot nostettiin alfa-arvoon 0.05 ja 0.40, ja nboots=2 muutetaan vähimmäisarvoon 51.

Bootstrap-näytetietojoukon histogrammi, joka näyttää luottamusvälin vain tasapainotetussa tarkkuudessa

 
 
Jälleen meidän ei tarvitse tehdä tätä saadaksemme alla olevat luottamusvälit kutsumalla ci_auto().

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



Oranssi viiva näyttää 89.7 % tasapainoisen tarkkuuden luottamusvälin alarajana, vihreä alkuperäiselle tasapainoiselle tarkkuudelle = 92.4 % (pistearvio) ja punainen 94.7 %:n ylärajalle. (Sama kuva näkyy tämän artikkelin yläosassa.)

Kuinka laskea kaikki mittariluettelon luottamusvälit

 
 
Tässä on päätoiminto, joka käynnistää edellä mainitun ja laskee luottamusvälit metriikan tulosten prosenttipisteistä ja lisää pistearviot tulosten datakehyksen ensimmäiseksi sarakkeeksi.

Laske tulokset!

 
 
Tämä on kaikki mitä meidän todella tarvitsee tehdä: kutsu ci_auto() seuraavasti luettelolla mittareista (met edellä) saadakseen niiden luottamusvälit. Prosenttimuotoilu on valinnainen:

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



Keskustelu tuloksena olevista luottamusvälistä

 
 
Tässä on sekaannusmatriisi alkuperäinen artikkeli. Luokka 0 on negatiiviset (enemmistöluokka) ja luokka 1 on positiiviset (erittäin harvinainen luokka)



Recallilla (tosi positiivinen määrä) 134/(134+14) on laajin luottamusväli, koska tämä on binomiaalinen osuus, johon liittyy pieniä lukuja.

Spesifisyys (tosi negatiivinen korko) on 80,388 80,388/(4,907 XNUMX+XNUMX XNUMX), joka sisältää paljon suurempia lukuja, joten sillä on erittäin kapea luottamusväli, joka on vain [94.11 % - 94.40 %].

Koska tasapainotettu tarkkuus lasketaan yksinkertaisesti palautuksen ja spesifisyyden keskiarvona, sen luottamusvälin leveys on niiden välissä.

Metrinen mittauksen epätarkkuus, joka johtuu testitietojen vaihteluista vs. junatietojen vaihteluista

 
 
Tässä emme ole huomioineet vaihtelua malli perustuu meidän satunnaisuuteen koulutus tiedot (vaikka se voi myös olla kiinnostavaa joihinkin tarkoituksiin, esim. jos olet automatisoinut toistuvan uudelleenkoulutuksen ja haluat tietää kuinka paljon tulevien mallien suorituskyky saattaa vaihdella), vaan pikemminkin vain tämän suorituskyvyn mittaamisen vaihtelu. erityinen malli (joka on luotu tietystä harjoitustiedosta) johtuen meidän satunnaisuudestamme testi tietoja.

Jos meillä olisi tarpeeksi riippumatonta testidataa, voisimme mitata tämän mallin suorituskykyä taustalla olevalla populaatiolla erittäin tarkasti, ja tietäisimme kuinka se toimii, jos tämä malli otetaan käyttöön, riippumatta siitä, miten mallin rakensimme ja voisimmeko saada parempi tai huonompi malli eri harjoitusnäyteaineistolla.

Yksittäisten tapausten riippumattomuus

 
 
Bootstrap-menetelmä olettaa, että jokainen esiintymäsi (tapaukset, havainnot) piirretään riippumattomasti taustalla olevasta populaatiosta. Jos testijoukossasi on riviryhmiä, jotka eivät ole toisistaan ​​riippumattomia, esimerkiksi toistuvia havaintoja samasta entiteetistä, jotka todennäköisesti korreloivat keskenään, tai esiintymiä, jotka ovat ylinäytteistetty/toistettu/luoteltu testin muista ilmentymistä asetettu, tulokset eivät ehkä ole kelvollisia. Sinun on ehkä käytettävä ryhmitelty otanta, jossa piirrät kokonaisia ​​ryhmiä yhteen satunnaisesti yksittäisten rivien sijaan välttäen ryhmien hajottamista tai vain osan käyttämistä.

Haluat myös varmistaa, että sinulla ei ole ryhmiä, jotka on jaettu harjoitus- ja testisarjaan, koska silloin testisarja ei välttämättä ole itsenäinen ja saatat saada havaitsematonta ylisovitusta. Jos esimerkiksi käytät ylinäytteenottoa, sinun tulee yleensä tehdä vain vain jälkeen se on jaettu testisarjasta, ei aiemmin. Ja normaalisti otat ylinäytteen koulutussarjasta, mutta et testisarjasta, koska testijoukon on pysyttävä edustavana tapauksia, joita malli näkee tulevan käyttöönoton yhteydessä. Ja ristiinvalidointiin kannattaa käyttää scikit-learn's model_selection.GroupKFold().

Yhteenveto

 
 
Voit aina laskea luottamusvälit arviointimittareillesi nähdäksesi, kuinka tarkasti testitietosi mahdollistavat mallisi suorituskyvyn mittaamisen. Suunnittelen toista artikkelia esitelläkseni todennäköisyysennusteita (tai luottamuspisteitä – ei yhteyttä tilastolliseen luotettavuuteen) arvioivien mittareiden luottamusväliä, eli pehmeää luokittelua, kuten Log Loss tai ROC AUC, sen sijaan, että tässä käytimme mittareita, jotka arvioivat diskreetti luokan valinta mallin mukaan (kova luokitus). Sama koodi toimii molemmille, samoin kuin regressiolle (ennustaa jatkuvaa kohdemuuttujaa) - sinun on vain välitettävä sille erilainen ennuste (ja erilaiset todelliset tavoitteet regression tapauksessa).

Tämä jupyter-muistikirja on saatavilla githubissa: bootConfIntAutoV1o_standalone.ipynb

Oliko tämä artikkeli informatiivinen ja/tai hyödyllinen? Lähetä kommentti alle, jos sinulla on kommentteja tai kysymyksiä tästä artikkelista tai luottamusvälistä, käynnistysvälistä, käynnistysten määrästä, tästä toteutuksesta, tietojoukosta, mallista, kynnyksen siirrosta tai tuloksista.

Edellä mainittujen lisäksi edellinen artikkeli, saatat olla kiinnostunut myös minusta Päivämäärän/päivämäärän sarakkeiden automaattinen havaitseminen ja niiden tietotyypin asettaminen luettaessa CSV-tiedostoa pandoina, vaikka se ei liity suoraan tähän artikkeliin.

Jotkut oikeudet pidätetään

 
Bio: David B Rosen (PhD) on IBM Global Financingin automaattisen luoton hyväksynnän johtava tietotutkija. Löydät lisää Davidin kirjoituksista osoitteesta dabruro.medium.com.

Alkuperäinen. Postitettu luvalla.

Related:

Lähde: https://www.kdnuggets.com/2021/10/calculate- luottamus-intervals-performance-metrics-machine-learning.html

Aikaleima:

Lisää aiheesta KDnuggets