Jak używać smote do niezrównoważonych danych w r (z przykładem)


Często podczas pracy z algorytmami klasyfikacji uczenia maszynowego klasy w zbiorze danych będą niezrównoważone.

Na przykład:

  • Zbiór danych zawierający informacje o tym, czy gracze z college’u zostali powołani do NBA, może wskazywać, że 98% graczy nie zostało wybranych, a 2% zostało powołanych.
  • Zbiór danych zawierający informacje na temat tego, czy pacjenci mają raka, może zawierać 99% pacjentów bez raka i tylko 1% z rakiem.
  • Zbiór danych zawierający informacje o oszustwach bankowych może zawierać 96% transakcji legalnych i 4% transakcji fałszywych.

Z powodu tych niezrównoważonych klas zbudowany model predykcyjny może nie działać dobrze w klasie mniejszości.

Co gorsza, często najbardziej chcemy przewidzieć klasę mniejszości.

Jednym ze sposobów rozwiązania tego problemu braku równowagi jest zastosowanie techniki syntetycznego nadpróbkowania mniejszości , często w skrócie SMOTE .

Technika ta polega na utworzeniu nowego zbioru danych poprzez nadpróbkowanie obserwacji z klasy mniejszości, co daje zbiór danych z bardziej zrównoważonymi klasami.

Najłatwiejszym sposobem użycia SMOTE w R jest użycie funkcji SMOTE() z pakietu DMwR .

Ta funkcja wykorzystuje następującą podstawową składnię:

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

Złoto:

  • formularz : Formuła opisująca model, który chcesz dostosować
  • dane : Nazwa ramki danych
  • perc.over : Liczba określająca, ile dodatkowych przypadków klasy mniejszości jest generowanych
  • perc.under : Liczba określająca, ile dodatkowych przypadków klasy większości jest generowanych

Poniższy przykład pokazuje, jak w praktyce wykorzystać tę funkcję.

Przykład: Jak używać SMOTE w R

Załóżmy, że mamy następujący zbiór danych zawierający 100 obserwacji w R, z których 90 ma klasę „Tak”, a 10 ma klasę „Nie” dla zmiennej odpowiedzi:

 #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

Jest to klasyczny przykład niezrównoważonego zbioru danych, ponieważ przewidywana przez nas zmienna odpowiedzi ma 90 obserwacji z klasą „Tak” i tylko 10 obserwacji z klasą „Nie”.

Aby stworzyć bardziej zrównoważony zbiór danych, możemy skorzystać z funkcji SMOTE() z pakietu DMwR :

 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

Powstały zbiór danych zawiera 210 obserwacji z klasą „Nie” i 800 obserwacji z klasą „Tak”.

Oto dokładnie, w jaki sposób funkcja SMOTE utworzyła ten nowy zestaw danych:

  • Argument perc.over określał, że chcemy dodać 2000/100 (lub 20) razy liczbę istniejących obserwacji mniejszościowych do zbioru danych. Ponieważ w oryginalnym zbiorze danych istniało 10 obserwacji, dodaliśmy 20*10 = 200 dodatkowych obserwacji mniejszościowych .
  • Argument perc.under określał, że chcemy, aby liczba obserwacji większości była równa 400/100 (lub 4) razy liczba obserwacji mniejszości dodanych do istniejących obserwacji mniejszości. Ponieważ dodano 200 dodatkowych obserwacji mniejszości, liczba obserwacji większości była równa 200 * 4 = 800 obserwacji większości .

Efektem końcowym jest zbiór danych, który nadal zawiera więcej klas większościowych, ale nadal jest bardziej zrównoważony niż oryginalny zbiór danych.

Możesz teraz dostosować wybrany algorytm klasyfikacji do tego nowego zbioru danych, który powinien działać lepiej w przypadku klasy mniejszości, ponieważ w tym nowym zbiorze danych znajduje się więcej obserwacji z klasy mniejszości.

Uwaga : możesz pobawić się argumentami perc.over i perc.under w funkcji SMOTE, aby uzyskać zbiór danych odpowiadający Twoim potrzebom.

Dodatkowe zasoby

Poniższe samouczki wyjaśniają, jak wykonywać inne typowe zadania w języku R:

Jak utworzyć tabele podsumowujące w R
Jak normalizować dane w R
Jak usunąć wartości odstające w R

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *