Smote gebruiken voor onevenwichtige gegevens in r (met voorbeeld)


Bij het werken met machine learning- classificatiealgoritmen zullen de klassen in de dataset vaak uit balans zijn.

Bijvoorbeeld:

  • Een dataset met informatie over de vraag of universiteitsspelers wel of niet zijn opgeroepen voor de NBA zou ervoor kunnen zorgen dat 98% van de spelers niet wordt opgeroepen en dat 2% wordt opgeroepen.
  • Een dataset met informatie over de vraag of patiënten al dan niet kanker hebben, zou 99% van de patiënten zonder kanker kunnen bevatten en slechts 1% met kanker.
  • Een dataset met informatie over bankfraude kan 96% legitieme transacties en 4% frauduleuze transacties bevatten.

Vanwege deze onevenwichtige klassen werkt het voorspellende model dat u bouwt mogelijk niet goed voor de minderheidsklasse.

Erger nog: de minderheidsklasse is vaak degene die we het liefst willen voorspellen.

Eén manier om dit onevenwichtsprobleem op te lossen is het gebruik van de synthetische minderheidsoversamplingtechniek , vaak afgekort SMOTE .

Deze techniek omvat het creëren van een nieuwe dataset door observaties uit de minderheidsklasse te overbemonsteren, wat een dataset oplevert met meer gebalanceerde klassen.

De eenvoudigste manier om SMOTE in R te gebruiken is door de functie SMOTE() uit het DMwR- pakket te gebruiken.

Deze functie gebruikt de volgende basissyntaxis:

 SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)

Goud:

  • formulier : Een formule die het model beschrijft dat u wilt aanpassen
  • data : Naam van het dataframe
  • perc.over : getal dat bepaalt hoeveel extra gevallen van de minderheidsklasse worden gegenereerd
  • perc.under : getal dat bepaalt hoeveel extra gevallen van de meerderheidsklasse worden gegenereerd

Het volgende voorbeeld laat zien hoe u deze functie in de praktijk kunt gebruiken.

Voorbeeld: SMOTE gebruiken in R

Stel dat we de volgende dataset hebben met 100 waarnemingen in R, waarbij 90 een klasse „Ja“ hebben en 10 een klasse „Nee“ voor de responsvariabele:

 #make this example reproducible
set. seed ( 0 )

#create data frame with one response variable and two predictor variables
df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )),
                 x1=rnorm( 100 ),
                 x2=rnorm( 100 ))

#view first six rows of data frame
head(df)

    y x1 x2
1 Yes 1.2629543 0.7818592
2 Yes -0.3262334 -0.7767766
3 Yes 1.3297993 -0.6159899
4 Yes 1.2724293 0.0465803
5 Yes 0.4146414 -1.1303858
6 Yes -1.5399500 0.5767188
 
#view distribution of response variable
table(df$y)

 Drowned 
 10 90

Dit is een klassiek voorbeeld van een ongebalanceerde dataset, omdat de responsvariabele die we voorspellen 90 waarnemingen heeft met de klasse ‚Ja‘ en slechts 10 waarnemingen met de klasse ‚Nee‘.

Om een meer gebalanceerde dataset te creëren, kunnen we de SMOTE() functie uit het DMwR- pakket gebruiken:

 library ( DMwR)

#use SMOTE to create new dataset that is more balanced
new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 )

#view distribution of response variable in new dataset
table(new_df$y)

 Drowned 
210,800

De resulterende dataset bevat 210 waarnemingen met “Nee” als klasse en 800 waarnemingen met “Ja” als klasse.

Hier ziet u precies hoe de SMOTE-functie deze nieuwe dataset produceerde:

  • Het perc.over- argument specificeerde dat we 2000/100 (of 20) keer het aantal bestaande minderheidswaarnemingen aan de dataset wilden toevoegen. Omdat er 10 waarnemingen bestonden in de oorspronkelijke dataset, hebben we 20*10 = 200 extra minderheidswaarnemingen toegevoegd.
  • Het perc.under- argument specificeerde dat we het aantal meerderheidswaarnemingen gelijk wilden maken aan 400/100 (of 4) keer het aantal minderheidswaarnemingen toegevoegd aan de bestaande minderheidswaarnemingen. Omdat er 200 extra minderheidswaarnemingen werden toegevoegd, hebben we het aantal meerderheidswaarnemingen gelijk gemaakt aan 200 * 4 = 800 meerderheidswaarnemingen .

Het eindresultaat is een dataset die nog steeds meer meerderheidsklassen bevat, maar nog steeds evenwichtiger is dan de oorspronkelijke dataset.

U kunt nu het classificatiealgoritme van uw keuze aanpassen aan deze nieuwe dataset, die beter zou moeten presteren op de minderheidsklasse, omdat er meer observaties van de minderheidsklasse in deze nieuwe dataset zitten.

Opmerking : speel gerust met de perc.over- en perc.under- argumenten in de SMOTE-functie om een dataset te krijgen die aan uw behoeften voldoet.

Aanvullende bronnen

In de volgende tutorials wordt uitgelegd hoe u andere veelvoorkomende taken in R kunt uitvoeren:

Hoe u samenvattende tabellen maakt in R
Hoe gegevens in R te normaliseren
Hoe uitschieters in R te verwijderen

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert