Slumpmässig över- och underprovtagning för obalanserad klassificering

Tweet Share Share Share

Sist uppdaterad den 5 januari 2021

Ombalanserade datamängder är sådana där det finns en allvarlig snedfördelning i klassfördelningen, t.ex. 1:100 eller 1:1000 exempel i minoritetsklassen jämfört med majoritetsklassen.

Denna snedvridning i träningsdatamängden kan påverka många algoritmer för maskininlärning, vilket leder till att vissa ignorerar minoritetsklassen helt och hållet. Detta är ett problem eftersom det vanligtvis är minoritetsklassen för vilken förutsägelserna är viktigast.

En metod för att lösa problemet med obalans mellan klasser är att slumpmässigt ta ett nytt urval av träningsdatasetetet. De två huvudsakliga tillvägagångssätten för att slumpmässigt återskapa en obalanserad datamängd är att ta bort exempel från majoritetsklassen, så kallad undersampling, och att duplicera exempel från minoritetsklassen, så kallad oversampling.

I den här handledningen kommer du att upptäcka slumpmässig oversampling och undersampling för obalanserad klassificering

När du har slutfört den här handledningen kommer du att veta:

  • Slumpmässig resampling ger en naiv teknik för att återbalansera klassfördelningen för ett obalanserat dataset.
  • Random oversampling duplicerar exempel från minoritetsklassen i träningsdatasetet och kan resultera i överanpassning för vissa modeller.
  • Random undersampling raderar exempel från majoritetsklassen och kan resultera i att man förlorar information som är ovärderlig för en modell.

Kicka igång ditt projekt med min nya bok Imbalanced Classification with Python, inklusive steg-för-steg-handledning och Python-källkodfiler för alla exempel.

Låt oss komma igång.

  • Uppdaterad jan/2021:
Random Oversampling and Undersampling for Imbalanced Classification

Random Oversampling and Undersampling for Imbalanced Classification
Foto av RichardBH, vissa rättigheter förbehållna.

Tutorial Overview

Denna tutorial är uppdelad i fem delar; de är:

  1. Random Resampling Imbalanced Datasets
  2. Imbalanced-Learn Library
  3. Random Oversampling Imbalanced Datasets
  4. Random Undersampling Imbalanced Datasets
  5. Combining Random Oversampling and Undersampling

Random Resampling Imbalanced Datasets

Resampling innebär att man skapar en ny transformerad version av träningsdatasetetet där de valda exemplen har en annan klassfördelning.

Detta är en enkel och effektiv strategi för obalanserade klassificeringsproblem.

Användning av återprovtagningsstrategier för att få en mer balanserad datafördelning är en effektiv lösning på obalansproblemet

– A Survey of Predictive Modelling under Imbalanced Distributions, 2015.

Den enklaste strategin är att välja exempel för den transformerade datamängden slumpmässigt, så kallad random resampling.

Det finns två huvudsakliga tillvägagångssätt för random resampling för obalanserad klassificering; de är oversampling och undersampling.

  • Random Oversampling: Random Oversampling: Slumpmässigt duplicera exempel i minoritetsklassen.
  • Random Undersampling: Random Oversampling: Slumpmässigt duplicera exempel i minoritetsklassen: Random oversampling innebär att man slumpmässigt väljer ut exempel från minoritetsklassen, med ersättning, och lägger till dem i träningsdatasetetet. Slumpmässig underprovtagning innebär att man slumpmässigt väljer ut exempel från majoritetsklassen och tar bort dem från träningsdatasetetet.

    I den slumpmässiga underprovtagningen slängs instanserna i majoritetsklassen slumpmässigt tills en mer balanserad fördelning uppnås.

    – Sidan 45, Obalanserad inlärning: Foundations, Algorithms, and Applications, 2013

    Båda tillvägagångssätten kan upprepas tills den önskade klassfördelningen har uppnåtts i träningsdatamängden, t.ex. en jämn fördelning mellan klasserna.

    De kallas ”naiva resampling”-metoder eftersom de inte utgår från något om data och ingen heuristik används. Detta gör dem enkla att implementera och snabba att utföra, vilket är önskvärt för mycket stora och komplexa datamängder.

    Båda teknikerna kan användas för tvåklassiga (binära) klassificeringsproblem och flerklassiga klassificeringsproblem med en eller flera majoritets- eller minoritetsklasser.

    Väsentligt är att ändringen av klassfördelningen endast tillämpas på utbildningsdatamängden. Avsikten är att påverka modellernas anpassning. Omprovningen tillämpas inte på test- eller holdout-dataset som används för att utvärdera en modells prestanda.

    Generellt sett kan dessa naiva metoder vara effektiva, även om det beror på detaljerna i datasetetet och modellerna i fråga.

    Låt oss ta en närmare titt på varje metod och hur man använder dem i praktiken.

    Imbalanced-Learn-biblioteket

    I de här exemplen kommer vi att använda de implementationer som tillhandahålls av Pythonbiblioteket imbalanced-learn, som kan installeras via pip på följande sätt:

    1
    sudo pip install imbalanced-learn

    Du kan bekräfta att installationen lyckades genom att skriva ut versionen av det installerade biblioteket:

    1
    2
    3

    # check version number
    import imblearn
    print(imblearn.__version__)

    Att köra exemplet kommer att skriva ut versionsnumret för det installerade biblioteket; t.ex:

    1
    0.5.0

    Vill du komma igång med klassificering av obalanser?

    Ta min kostnadsfria 7-dagars snabbkurs via e-post nu (med exempelkod).

    Klicka för att registrera dig och få en gratis PDF Ebook-version av kursen.

    Ladda ner din gratis minikurs

    Random Oversampling Imbalanced Datasets

    Random Oversampling innebär att man slumpmässigt dubblar exemplen från minoritetsklassen och lägger till dem i träningsdatasetetet.

    Exemplen från träningsdatasetet väljs ut slumpmässigt med ersättning. Detta innebär att exempel från minoritetsklassen kan väljas ut och läggas till det nya ”mer balanserade” träningsdatasetet flera gånger; de väljs ut från det ursprungliga träningsdatasetet, läggs till det nya träningsdatasetetet och returneras eller ”byts ut” i det ursprungliga datasetetet, vilket gör att de kan väljas ut igen.

    Denna teknik kan vara effektiv för de maskininlärningsalgoritmer som påverkas av en snedfördelning och där flera dubbletter av exempel för en viss klass kan påverka modellens anpassning. Detta kan omfatta algoritmer som iterativt lär sig koefficienter, t.ex. artificiella neurala nätverk som använder sig av stokastisk gradientavstigning. Det kan också påverka modeller som söker bra uppdelningar av data, t.ex. stödvektormaskiner och beslutsträd.

    Det kan vara användbart att justera målklassfördelningen. I vissa fall kan sökandet efter en balanserad fördelning för ett allvarligt obalanserat dataset leda till att berörda algoritmer överanpassar minoritetsklassen, vilket leder till ökade generaliseringsfel. Effekten kan bli bättre prestanda på träningsdatasetet, men sämre prestanda på holdout- eller testdataset.

    … den slumpmässiga översamplingen kan öka sannolikheten för att överanpassning inträffar, eftersom den gör exakta kopior av exemplen från minoritetsklassen. På så sätt kan till exempel en symbolisk klassificerare konstruera regler som till synes är korrekta, men som i själva verket täcker ett replikerat exempel.

    – Sida 83, Learning from Imbalanced Data Sets, 2018.

    För att få en inblick i metodens påverkan är det därför en bra idé att övervaka prestandan på både tåg- och testdatamängder efter överutnyttjandet och jämföra resultaten med samma algoritm på den ursprungliga datamängden.

    Ökningen av antalet exempel för minoritetsklassen, särskilt om klassens snedfördelning var allvarlig, kan också resultera i en markant ökning av beräkningskostnaden när modellen anpassas, särskilt med tanke på att modellen ser samma exempel i träningsdatasetetet om och om igen.

    … vid slumpmässig överprovtagning läggs en slumpmässig uppsättning kopior av exempel från minoritetsklassen till datamaterialet. Detta kan öka sannolikheten för överanpassning, särskilt för högre överprovtagningsfrekvenser. Dessutom kan det minska klassificerarens prestanda och öka beräkningsarbetet.

    – A Survey of Predictive Modelling under Imbalanced Distributions, 2015.

    Random oversampling kan genomföras med hjälp av klassen RandomOverSampler.

    Klassen kan definieras och tar ett sampling_strategy-argument som kan sättas till ”minority” för att automatiskt balansera minoritetsklassen med majoritetsklassen eller -klasserna.

    Till exempel:

    1
    2
    3

    # definiera överprovtagningsstrategi
    oversample = RandomOverSampler(sampling_strategy=’minority’)

    Detta innebär att om majoritetsklassen hade 1 000 exempel och minoritetsklassen hade 100, så skulle den här strategin överprovta minoritetsklassen så att den fick 1 000 exempel.

    Ett värde med flytande punkter kan anges för att ange förhållandet mellan minoritetsklassens majoritetsexempel i den transformerade datamängden. Till exempel:

    1
    2
    3

    # definiera överprovtagningsstrategi
    oversample = RandomOverSampler(sampling_strategy=0.5)

    Detta skulle se till att minoritetsklassen överprovtagits så att den har hälften så många exempel som majoritetsklassen, för binära klassificeringsproblem. Detta innebär att om majoritetsklassen hade 1 000 exempel och minoritetsklassen 100, skulle det transformerade datasetet ha 500 exempel av minoritetsklassen.

    Klassen är som ett scikit-learn transformationsobjekt på så sätt att den passar på ett dataset och sedan används för att generera ett nytt eller transformerat dataset. Till skillnad från scikit-learn-transformerna ändrar den antalet exempel i datasetet, inte bara värdena (som en skalare) eller antalet funktioner (som en projektion).

    Den kan till exempel anpassas och tillämpas i ett steg genom att anropa funktionen fit_sample():

    1
    2
    3

    # anpassa och tillämpa transformationen
    X_over, y_over = oversample.fit_resample(X, y)

    Vi kan demonstrera detta på ett enkelt syntetiskt binärt klassificeringsproblem med en obalans mellan klasserna på 1:100.

    1
    2
    3

    # definiera dataset
    X, y = make_classification(n_samples=10000, weights=, flip_y=0)

    Det kompletta exemplet på att definiera datasetet och utföra slumpmässigt översampling för att balansera klassfördelningen finns nedan.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    # exempel på slumpmässigt översampling för att balansera klassfördelningen
    from collections import Counter
    from sklearn.datasets import make_classification
    from imblearn.over_sampling import RandomOverSampler
    # definiera dataset
    X, y = make_classification(n_samples=10000, weights=, flip_y=0)
    # sammanfatta klassfördelningen
    print(Counter(y))
    # definiera överprovtagningsstrategi
    oversample = RandomOverSampler(sampling_strategy=’minority’)
    # anpassa och tillämpa transformationen
    X_over, y_over = oversample.fit_resample(X, y)
    # summera klassfördelningen
    print(Counter(y_over))

    Att köra exemplet skapar först datasetet och sammanfattar sedan klassfördelningen. Vi kan se att det finns nästan 10 000 exempel i majoritetsklassen och 100 exempel i minoritetsklassen.

    Därefter definieras den slumpmässiga översamplingstransformationen för att balansera minoritetsklassen, därefter anpassas den och tillämpas på datasetet. Klassfördelningen för det transformerade datasetet rapporteras och visar att minoritetsklassen nu har samma antal exempel som majoritetsklassen.

    1
    2

    Counter({0: 9900, 1: 100})
    Counter({0: 9900, 1: 9900})

    Denna transformation kan användas som en del av en pipeline för att se till att den endast tillämpas på träningsdatasetetet som en del av varje delning i en k-fold korsvalidering.

    En traditionell scikit-learn Pipeline kan inte användas; istället kan en Pipeline från biblioteket imbalanced-learn användas. Till exempel:

    1
    2
    3
    4

    # pipeline
    steps =
    pipeline = Pipeline(steps=steps)

    Exemplet nedan är ett komplett exempel på utvärdering av ett beslutsträd på ett obalanserat datamaterial med en klassfördelning 1:100.

    Modellen utvärderas med hjälp av upprepad 10-faldig korsvalidering med tre upprepningar, och översamplingen utförs på träningsdatamängden inom varje upprepning separat, vilket säkerställer att det inte finns något dataläckage som skulle kunna inträffa om översamplingen utfördes före korsvalideringen.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    # exempel på utvärdering av ett beslutsträd med slumpmässigt överutnyttjande
    from numpy import mean
    from sklearn.datasets import make_classification
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import RepeatedStratifiedKFold
    from sklearn.tree import DecisionTreeClassifier
    from imblearn.pipeline import Pipeline
    from imblearn.over_sampling import RandomOverSampler
    # define dataset
    X, y = make_classification(n_samples=10000, weights=, flip_y=0)
    # definiera pipeline
    steg =
    pipeline = Pipeline(steg=steg)
    # utvärdera pipeline
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
    scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
    score = mean(scores)
    print(’F1 Score: %.3f’ % score)

    Då exemplet körs utvärderas beslutsträdsmodellen på det obalanserade datasetet med översampling.

    Den valda modellen och konfigurationen för återprovtagning är godtyckliga och utformade för att tillhandahålla en mall som du kan använda för att testa underprovtagning med ditt dataset och din inlärningsalgoritm, snarare än att lösa det syntetiska datasetet på ett optimalt sätt.

    Anmärkningar: Dina resultat kan variera på grund av algoritmens eller utvärderingsförfarandets stokastiska natur, eller skillnader i numerisk precision. Överväg att köra exemplet några gånger och jämför det genomsnittliga resultatet.

    Den förvalda översamplingsstrategin används, vilket balanserar minoritetsklasserna med majoritetsklassen. F1-poängen i genomsnitt för varje vikning och varje upprepning rapporteras.

    1
    F1 Poäng: 0.990

    Nu när vi är bekanta med överprovtagning ska vi ta en titt på underprovtagning.

    Random underprovtagning obalanserade datamängder

    Random underprovtagning innebär att man slumpmässigt väljer ut exempel från majoritetsklassen för att ta bort dem från träningsdatamängden.

    Detta har som effekt att antalet exempel i majoritetsklassen minskar i den transformerade versionen av träningsdatamängden. Denna process kan upprepas tills den önskade klassfördelningen är uppnådd, t.ex. ett lika stort antal exempel för varje klass.

    Detta tillvägagångssätt kan vara mer lämpligt för de datamängder där det råder obalans mellan klasserna även om det finns ett tillräckligt antal exempel i minoritetsklassen, så att en användbar modell kan passas in.

    En begränsning av undersampling är att exempel från majoritetsklassen tas bort som kan vara användbara, viktiga, eller kanske kritiska för att passa in i en robust beslutsgräns. Med tanke på att exemplen tas bort slumpmässigt finns det inget sätt att upptäcka eller bevara ”bra” eller mer informationsrika exempel från majoritetsklassen.

    … vid slumpmässig underprovtagning (potentiellt) slumpas stora mängder data bort. Detta kan vara mycket problematiskt, eftersom förlusten av sådana data kan göra det svårare att lära sig beslutsgränsen mellan minoritets- och majoritetsinstanser, vilket resulterar i en förlust av klassificeringsprestanda.

    – Sidan 45, Imbalanced Learning (obalanserad inlärning): Foundations, Algorithms, and Applications, 2013

    Den slumpmässiga underprovtagningstekniken kan implementeras med hjälp av klassen RandomUnderSampler imbalanced-learn.

    Klassen kan användas precis som klassen RandomOverSampler i det föregående avsnittet, förutom att strategierna påverkar majoritetsklassen istället för minoritetsklassen. Om man till exempel ställer in sampling_strategy-argumentet till ”majority” kommer man att underprovta majoritetsklassen som bestäms av klassen med det största antalet exempel.

    1
    2
    3

    # definiera undersamplingstrategi
    undersample = RandomUnderSampler(sampling_strategy=’majority’)

    Till exempel kommer en datauppsättning med 1000 exempel i majoritetsklassen och 100 exempel i minoritetsklassen att undersamplas på ett sådant sätt att båda klasserna skulle ha 100 exempel i den transformerade utbildningsdatauppsättningen.

    Vi kan också ställa in argumentet sampling_strategy till ett flyttalvärde som blir en procentsats i förhållande till minoritetsklassen, närmare bestämt antalet exempel i minoritetsklassen dividerat med antalet exempel i majoritetsklassen. Om vi till exempel ställer in sampling_strategy till 0,5 i ett obalanserat dataset med 1 000 exempel i majoritetsklassen och 100 exempel i minoritetsklassen, skulle det finnas 200 exempel för majoritetsklassen i det transformerade datasetet (eller 100/200 = 0.5).

    1
    2
    3

    # definiera undersamplingstrategi
    undersample = RandomUnderSampler(sampling_strategy=0.5)

    Detta kan vara att föredra för att säkerställa att den resulterande datamängden både är tillräckligt stor för att passa in i en rimlig modell och för att inte alltför mycket användbar information från majoritetsklassen ska förkastas.

    I slumpmässig underprovtagning kan man försöka skapa en balanserad klassfördelning genom att slumpmässigt välja ut 90 exempel från majoritetsklassen som ska tas bort. Det resulterande datasetet kommer då att bestå av 20 instanser: 10 (slumpmässigt kvarvarande) instanser i majoritetsklassen och (de ursprungliga) 10 instanser i minoritetsklassen.

    – Sida 45, obalanserad inlärning: Foundations, Algorithms, and Applications, 2013

    Transformationen kan sedan anpassas och tillämpas på en datamängd i ett steg genom att anropa funktionen fit_resample() och överlämna den otransformerade datamängden som argument.

    1
    2
    3

    # anpassa och tillämpa transformationen
    X_over, y_over = undersample.fit_resample(X, y)

    Vi kan demonstrera detta på en datauppsättning med en obalans mellan klasser på 1:100.

    Det kompletta exemplet finns nedan.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    # exempel på slumpmässigt underuttag för att balansera klassfördelningen
    from collections import Counter
    from sklearn.datasets import make_classification
    from imblearn.under_sampling import RandomUnderSampler
    # definiera dataset
    X, y = make_classification(n_samples=10000, weights=, flip_y=0)
    # sammanfatta klassfördelningen
    print(Counter(y))
    # definiera en strategi för undersampling
    undersample = RandomUnderSampler(sampling_strategy=’majority’)
    # anpassa och tillämpa transformationen
    X_over, y_over = undersample.fit_resample(X, y)
    # sammanfatta klassfördelningen
    print(Counter(y_over))

    Den som kör exemplet skapar först datasetet och rapporterar den obalanserade klassfördelningen.

    Transformationen anpassas och tillämpas på datasetetet och den nya klassfördelningen rapporteras. Vi kan se att majoritetsklassen är underutnyttjad så att den har samma antal exempel som minoritetsklassen.

    Det kommer att krävas en bedömning och empiriska resultat för att avgöra om ett träningsdataset med endast 200 exempel skulle vara tillräckligt för att träna en modell.

    1
    2

    Counter({0: 9900, 1: 100})
    Counter({0: 100, 1: 100})

    Denna underavsnittstransform kan också användas i en pipeline, precis som överavsnittstransform från föregående avsnitt.

    Detta gör det möjligt att tillämpa transformationen på träningsdatamängden endast med hjälp av utvärderingsscheman som k-fold korsvalidering, vilket gör att man undviker dataläckage vid utvärderingen av en modell.

    1
    2
    3
    4

    # define pipeline
    steps =
    pipeline = Pipeline(steps=steps)

    Vi kan definiera ett exempel på anpassning av ett beslutsträd på ett obalanserat klassificeringsdataset med underprovtagningstransformationen som appliceras på träningsdatasetetet vid varje delning av en upprepad 10-faldig korsvalidering.

    Det fullständiga exemplet finns nedan.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    # exempel på utvärdering av ett beslutsträd med slumpmässigt underutnyttjande
    from numpy import mean
    from sklearn.datasets import make_classification
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import RepeatedStratifiedKFold
    from sklearn.tree import DecisionTreeClassifier
    from imblearn.pipeline import Pipeline
    from imblearn.under_sampling import RandomUnderSampler
    # define dataset
    X, y = make_classification(n_samples=10000, weights=, flip_y=0)
    # definiera pipeline
    steg =
    pipeline = Pipeline(steg=steg)
    # utvärdera pipeline
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
    scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
    score = mean(scores)
    print(’F1 Score: %.3f’ % score)

    Då exemplet körs utvärderas beslutsträdsmodellen på det obalanserade datasetet med undersampling.

    Den valda modellen och konfigurationen för återuttag är godtyckliga och utformade för att tillhandahålla en mall som du kan använda för att testa underuttag med ditt dataset och din inlärningsalgoritm i stället för att lösa det syntetiska datasetet på ett optimalt sätt.

    Anmärkningar: Dina resultat kan variera på grund av algoritmens eller utvärderingsförfarandets stokastiska natur, eller skillnader i numerisk precision. Överväg att köra exemplet några gånger och jämför det genomsnittliga resultatet.

    Den förvalda underprovtagningsstrategin används, vilket balanserar majoritetsklasserna med minoritetsklasserna. F1-poängen i genomsnitt för varje vikning och varje upprepning rapporteras.

    1
    F1 Poäng: 0.889

    Kombination av slumpmässig över- och underprovtagning

    Interessanta resultat kan uppnås genom att kombinera både slumpmässig över- och underprovtagning.

    Till exempel kan en blygsam överprovtagning tillämpas på minoritetsklassen för att förbättra bias mot dessa exempel, samtidigt som en blygsam underprovtagning tillämpas på majoritetsklassen för att minska bias mot den klassen.

    Detta kan resultera i förbättrad total prestanda jämfört med att utföra den ena eller den andra tekniken isolerat.

    Till exempel, om vi hade ett dataset med en klassfördelning på 1:100, skulle vi först kunna tillämpa oversampling för att öka förhållandet till 1:10 genom att dubblera exempel från minoritetsklassen, och sedan tillämpa undersampling för att ytterligare förbättra förhållandet till 1:2 genom att ta bort exempel från majoritetsklassen.

    Detta skulle kunna genomföras med hjälp av imbalanced-learn genom att använda en RandomOverSampler med sampling_strategy inställd på 0,1 (10 %) och sedan en RandomUnderSampler med sampling_strategy inställd på 0,5 (50 %). Till exempel:

    1
    2
    3
    4
    5
    6
    7
    8
    9

    # definiera överprovtagningsstrategi
    over = RandomOverSampler(sampling_strategy=0.1)
    # anpassa och tillämpa transformationen
    X, y = over.fit_resample(X, y)
    # definiera underprovtagningsstrategi
    under = RandomUnderSampler(sampling_strategy=0.5)
    # anpassa och tillämpa transformationen
    X, y = under.fit_resample(X, y)

    Vi kan demonstrera detta på ett syntetiskt dataset med en 1:100 klassfördelning. Det fullständiga exemplet finns nedan:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    # exempel på att kombinera slumpmässigt över- och underprov för obalanserade data
    from collections import Counter
    from sklearn.datasets import make_classification
    from imblearn.over_sampling import RandomOverSampler
    from imblearn.under_sampling import RandomUnderSampler
    # definiera dataset
    X, y = make_classification(n_samples=10000, weights=, flip_y=0)
    # sammanfatta klassfördelningen
    print(Counter(y))
    # definiera överprovtagningsstrategi
    over = RandomOverSampler(sampling_strategy=0.1)
    # anpassa och tillämpa transformationen
    X, y = over.fit_resample(X, y)
    # Sammanfattning av klassfördelningen
    print(Counter(y))
    # definiera underprovtagningsstrategi
    under = RandomUnderSampler(sampling_strategy=0.5)
    # anpassa och tillämpa transformationen
    X, y = under.fit_resample(X, y)
    # sammanfatta klassfördelningen
    print(Counter(y))

    Den som kör exemplet skapar först det syntetiska datasetet och sammanfattar klassfördelningen, vilket visar en ungefärlig klassfördelning på 1:100.

    Därefter tillämpas översampling, vilket ökar fördelningen från ungefär 1:100 till ungefär 1:10. Slutligen tillämpas undersampling, vilket ytterligare förbättrar klassfördelningen från 1:10 till ungefär 1:2

    1
    2
    3

    Counter({0: 9900, 1: 100})
    Counter({0: 9900, 1: 990})
    Counter({0: 1980, 1: 990})

    Vi kanske också vill tillämpa samma hybridmetod när vi utvärderar en modell med hjälp av k-fold korsvalidering.

    Detta kan uppnås genom att använda en pipeline med en sekvens av transformationer som slutar med den modell som utvärderas, t.ex:

    1
    2
    3
    4
    5
    6

    # definiera pipeline
    over = RandomOverSampler(sampling_strategy=0.1)
    under = RandomUnderSampler(sampling_strategy=0.5)
    steps =
    pipeline = Pipeline(steps=steps)

    Vi kan demonstrera detta med en modell av ett beslutsträd på samma syntetiska datamängd.

    Det fullständiga exemplet finns nedan.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    # exempel på utvärdering av en modell med slumpmässigt över- och underuttag

    från numpy importera mean

    från sklearn.datasets import make_classification
    from sklearn.model_selection import cross_val_score
    from sklearn.model_selection import RepeatedStratifiedKFold
    from sklearn.tree import DecisionTreeClassifier
    from imblearn.pipeline import Pipeline
    from imblearn.over_sampling import RandomOverSampler
    from imblearn.under_sampling import RandomUnderSampler
    # definiera dataset
    X, y = make_classification(n_samples=10000, weights=, flip_y=0)
    # definiera pipeline
    over = RandomOverSampler(sampling_strategy=0.1)
    under = RandomUnderSampler(sampling_strategy=0.5)
    steg =
    pipeline = Pipeline(steg=steg)
    # utvärdera pipeline
    cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
    scores = cross_val_score(pipeline, X, y, scoring=’f1_micro’, cv=cv, n_jobs=-1)
    score = mean(scores)
    print(’F1 Score: %.3f’ % score)

    Den som kör exemplet utvärderar en beslutsträdsmodell med hjälp av upprepad k-fold korsvalidering där träningsdatasetetet omvandlas, först med hjälp av oversampling, sedan undersampling, för varje delning och upprepning som utförs. F1-poängen i genomsnitt för varje delning och varje upprepning rapporteras.

    Anmärkning: Dina resultat kan variera på grund av algoritmens eller utvärderingsförfarandets stokastiska natur eller skillnader i numerisk precision. Överväg att köra exemplet några gånger och jämför det genomsnittliga resultatet.

    Den valda modellen och återprovningskonfigurationen är godtyckliga och utformade för att tillhandahålla en mall som du kan använda för att testa underprovtagning med ditt dataset och din inlärningsalgoritm i stället för att lösa det syntetiska datasetet på ett optimalt sätt.

    1
    F1 Resultat: 0.985

    Fördjupad läsning

    Det här avsnittet innehåller fler resurser om ämnet om du vill fördjupa dig.

    Böcker

    • Kapitel 5 Förbehandlingsmetoder för datanivåer, Lärande från obalanserade datamängder, 2018.
    • Kapitel 3 Obalanserade datamängder: From Sampling to Classifiers, Imbalanced Learning: Imbalanced Datas: From Sampling to Classifiers, Imbalanced Learning: Foundations, Algorithms, and Applications, 2013.

    Papers

    • A Study Of The Behavior Of Several Methods For Balancing Machine Learning Training Data, 2004.
    • A Survey of Predictive Modelling under Imbalanced Distributions, 2015.

    API

    • Imbalanced-Learn Documentation.
    • imbalanced-learn, GitHub.
    • imblearn.over_sampling.RandomOverSampler API.
    • imblearn.pipeline.Pipeline API.
    • imblearn.under_sampling.RandomUnderSampler API.

    Artiklar

    • Oversampling och undersampling i dataanalys, Wikipedia.

    Sammanfattning

    I den här handledningen upptäckte du slumpmässig översampling och undersampling för obalanserad klassificering

    Specifikt lärde du dig:

    • Slumpmässig översampling ger en naiv teknik för att återbalansera klassfördelningen för ett obalanserat dataset.
    • Random oversampling duplicerar exempel från minoritetsklassen i träningsdatasetet och kan resultera i överanpassning för vissa modeller.
    • Random undersampling raderar exempel från majoritetsklassen och kan resultera i att man förlorar information som är ovärderlig för en modell.

    Har du några frågor?
    Sätt dina frågor i kommentarerna nedan så ska jag göra mitt bästa för att svara.

    Hantera obalanserad klassificering!

    Imbalanserad klassificering med Python

    Utveckla obalanserade inlärningsmodeller på några minuter

    …med bara några rader pythonkod

    Upptäck hur i min nya Ebook:
    Imbalanced Classification with Python

    Den innehåller självstudier och slutprojekt om:
    Prestationsmått, underprovtagningsmetoder, SMOTE, tröskelförflyttning, sannolikhetskalkylering, kostnadskänsliga algoritmer
    och mycket mer…

    Bring obalanserade klassificeringsmetoder till dina maskininlärningsprojekt

    Se vad som finns inuti

    Tweet Share Share Share

Lämna ett svar

Din e-postadress kommer inte publiceras.