Random Oversampling and Undersampling for Imbalanced Classification

Tweet Share Share

Last Updated on January 5, 2021

Imbalanced datasets are those where there is a severe skew in the class distribution, such as 1:100 or 1:1000 examples in the minority class to the majority class.

Ta stronniczość w zestawie danych szkoleniowych może wpływać na wiele algorytmów uczenia maszynowego, prowadząc niektóre z nich do całkowitego ignorowania klasy mniejszości. Jest to problem, ponieważ zazwyczaj to właśnie klasa mniejszościowa jest najważniejsza w przewidywaniach.

Jednym z podejść do rozwiązania problemu nierównowagi klas jest losowe ponowne próbkowanie zbioru danych treningowych. Dwa główne podejścia do losowego ponownego próbkowania niezrównoważonego zbioru danych polegają na usuwaniu przykładów z klasy większościowej, zwanym niedokładnym próbkowaniem, oraz na powielaniu przykładów z klasy mniejszościowej, zwanym nadpróbkowaniem.

W tym poradniku poznasz losowe nadpróbkowanie i niedostateczne próbkowanie dla niezrównoważonej klasyfikacji

Po zakończeniu tego poradnika, będziesz wiedział:

  • Losowe próbkowanie dostarcza naiwnej techniki do ponownego zrównoważenia rozkładu klas dla niezrównoważonego zbioru danych.
  • Nadpróbkowanie losowe powiela przykłady z klasy mniejszości w zbiorze danych treningowych i może prowadzić do przepasowania niektórych modeli.
  • Nadpróbkowanie losowe usuwa przykłady z klasy większości i może prowadzić do utraty informacji bezcennych dla modelu.

Zacznij swój projekt dzięki mojej nowej książce Imbalanced Classification with Python, zawierającej samouczki krok po kroku oraz pliki kodu źródłowego Pythona dla wszystkich przykładów.

Zacznijmy.

  • Zaktualizowano styczeń 2021: Zaktualizowane linki do dokumentacji API.
Random Oversampling and Undersampling for Imbalanced Classification

Random Oversampling and Undersampling for Imbalanced Classification
Zdjęcie autorstwa RichardBH, pewne prawa zastrzeżone.

Przegląd samouczka

Tutorial ten podzielony jest na pięć części; są to:

  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 polega na tworzeniu nowej przekształconej wersji zbioru danych treningowych, w której wybrane przykłady mają inny rozkład klas.

Jest to prosta i skuteczna strategia dla problemów klasyfikacji niezrównoważonej.

Stosowanie strategii ponownego próbkowania w celu uzyskania bardziej zrównoważonego rozkładu danych jest skutecznym rozwiązaniem problemu niezrównoważenia

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

Najprostszą strategią jest losowy wybór przykładów do przekształconego zbioru danych, zwany losowym resamplingiem.

Istnieją dwa główne podejścia do losowego resamplingu dla klasyfikacji niezrównoważonej; są to oversampling i undersampling.

  • Random Oversampling: Losowo powielaj przykłady w klasie mniejszości.
  • Random Undersampling: Randomly delete examples in the majority class.

Random oversampling involves randomly selecting examples from the minority class, with replacement, and adding them to the training dataset. Random undersampling polega na losowym wybieraniu przykładów z klasy większości i usuwaniu ich ze zbioru danych treningowych.

W random under-sampling, instancje klasy większości są odrzucane losowo, aż do osiągnięcia bardziej zrównoważonego rozkładu.

– Strona 45, Imbalanced Learning: Foundations, Algorithms, and Applications, 2013

Oba podejścia mogą być powtarzane aż do osiągnięcia pożądanego rozkładu klas w zbiorze danych treningowych, takiego jak równy podział na klasy.

Nazywa się je metodami „naiwnego próbkowania”, ponieważ nie zakładają nic o danych i nie są używane żadne heurystyki. Dzięki temu są proste w implementacji i szybkie w wykonaniu, co jest pożądane w przypadku bardzo dużych i złożonych zbiorów danych.

Obydwie techniki mogą być stosowane do problemów klasyfikacji dwuklasowej (binarnej) i wieloklasowej z jedną lub więcej klasami większościowymi lub mniejszościowymi.

Co ważne, zmiana rozkładu klas jest stosowana tylko do zbioru danych treningowych. Intencją jest wpłynięcie na dopasowanie modeli. Ponowne próbkowanie nie jest stosowane do zbioru danych testowych lub zbioru danych pozostałych, używanych do oceny wydajności modelu.

Ogólnie, te naiwne metody mogą być skuteczne, chociaż zależy to od specyfiki zbioru danych i modeli zaangażowanych.

Przyjrzyjrzyjmy się bliżej każdej z metod i sposobom ich wykorzystania w praktyce.

Biblioteka imbalanced-Learn

W tych przykładach użyjemy implementacji dostarczonych przez bibliotekę imbalanced-learn Pythona, którą można zainstalować za pomocą pip w następujący sposób:

1
sudo pip install imbalanced-.learn

Możesz potwierdzić, że instalacja zakończyła się powodzeniem, drukując wersję zainstalowanej biblioteki:

1
2
3

# sprawdź numer wersji
import imblearn
print(imblearn.__version__)

Wykonanie przykładu spowoduje wydrukowanie numeru wersji zainstalowanej biblioteki; na przykład:

1
0.5.0

Want to Get Started With Imbalance Classification?

Take my free 7-day email crash course now (with sample code).

Kliknij, aby się zapisać i otrzymać darmową wersję PDF Ebook kursu.

Download Your FREE Mini-Course

Random Oversampling Imbalanced Datasets

Random oversampling polega na losowym powielaniu przykładów z klasy mniejszościowej i dodawaniu ich do zbioru danych treningowych.

Przykłady ze zbioru danych treningowych są wybierane losowo z zamianą. Oznacza to, że przykłady z klasy mniejszościowej mogą być wybierane i dodawane do nowego „bardziej zrównoważonego” zbioru danych szkoleniowych wielokrotnie; są one wybierane z oryginalnego zbioru danych szkoleniowych, dodawane do nowego zbioru danych szkoleniowych, a następnie zwracane lub „zastępowane” w oryginalnym zbiorze danych, umożliwiając ich ponowne wybranie.

Ta technika może być skuteczna dla tych algorytmów uczenia maszynowego, na które wpływa rozkład skośny i gdzie wiele zduplikowanych przykładów dla danej klasy może wpływać na dopasowanie modelu. Może to obejmować algorytmy, które iteracyjnie uczą się współczynników, jak sztuczne sieci neuronowe, które używają stochastycznego zejścia gradientowego. Może to również wpływać na modele, które szukają dobrych podziałów danych, takie jak maszyny wektorów nośnych i drzewa decyzyjne.

Przydatne może być dostrojenie docelowego rozkładu klasy. W niektórych przypadkach, poszukiwanie zrównoważonego rozkładu dla poważnie niezrównoważonego zbioru danych może spowodować, że dotknięte algorytmy będą nadmiernie dopasowywać klasę mniejszości, co prowadzi do zwiększenia błędu generalizacji. Efektem może być lepsza wydajność na zestawie danych treningowych, ale gorsza wydajność na zestawie danych testowych.

… losowe nadpróbkowanie może zwiększyć prawdopodobieństwo wystąpienia nadpasowania, ponieważ tworzy dokładne kopie przykładów klasy mniejszościowej. W ten sposób symboliczny klasyfikator, na przykład, może skonstruować reguły, które są pozornie dokładne, ale w rzeczywistości obejmują jeden replikowany przykład.

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

Jako takie, aby uzyskać wgląd w wpływ metody, dobrym pomysłem jest monitorowanie wydajności na obu zbiorach danych trenujących i testowych po nadpróbkowaniu i porównanie wyników z tym samym algorytmem na oryginalnym zbiorze danych.

Zwiększenie liczby przykładów dla klasy mniejszościowej, zwłaszcza jeśli skośność klas była poważna, może również spowodować wyraźny wzrost kosztów obliczeniowych podczas dopasowywania modelu, zwłaszcza biorąc pod uwagę, że model widzi te same przykłady w zestawie danych treningowych ponownie i ponownie.

… w losowym nadpróbkowaniu, losowy zestaw kopii przykładów klasy mniejszościowej jest dodawany do danych. Może to zwiększyć prawdopodobieństwo przepełnienia, szczególnie dla wyższych wskaźników nadpróbkowania. Ponadto, może to zmniejszyć wydajność klasyfikatora i zwiększyć nakład obliczeniowy.

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

Random oversampling można zaimplementować za pomocą klasy RandomOverSampler.

Klasa ta może być zdefiniowana i przyjmuje argument sampling_strategy, który może być ustawiony na „minority”, aby automatycznie zrównoważyć klasę mniejszości z klasą lub klasami większości.

Na przykład:

1
2
3

# zdefiniuj strategię nadpróbkowania
oversample = RandomOverSampler(sampling_strategy=’minority’)

To znaczy, że jeśli klasa większości miała 1000 przykładów, a klasa mniejszości 100, to ta strategia nadpróbkowałaby klasę mniejszości tak, aby miała 1000 przykładów.

Wartość zmiennoprzecinkowa może być określona w celu wskazania stosunku przykładów klasy mniejszości do klasy większości w przekształconym zbiorze danych. Na przykład:

1
2
3

# zdefiniuj strategię nadpróbkowania
oversample = RandomOverSampler(sampling_strategy=0.5)

To zapewniłoby, że klasa mniejszościowa została nadpróbkowana, aby mieć połowę liczby przykładów jak klasa większościowa, dla binarnych problemów klasyfikacji. Oznacza to, że jeśli klasa większości miała 1000 przykładów, a klasa mniejszości 100, przekształcony zbiór danych miałby 500 przykładów klasy mniejszości.

Klasa jest jak obiekt transformacji scikit-learn w tym, że jest dopasowywana do zbioru danych, a następnie używana do generowania nowego lub przekształconego zbioru danych. W przeciwieństwie do transformacji scikit-learn, zmieni ona liczbę przykładów w zbiorze danych, a nie tylko wartości (jak skaler) lub liczbę cech (jak projekcja).

Na przykład można ją dopasować i zastosować w jednym kroku, wywołując funkcję fit_sample():

1
2
3

# dopasuj i zastosuj transformatę
X_over, y_over = oversample.fit_resample(X, y)

Możemy to zademonstrować na prostym syntetycznym problemie klasyfikacji binarnej z nierównowagą klas 1:100.

1
2
3

# define dataset
X, y = make_classification(n_próbek=10000, weights=, flip_y=0)

Pełny przykład definiowania zbioru danych i wykonywania losowego nadpróbkowania w celu zrównoważenia rozkładu klas znajduje się poniżej.

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

# przykład losowego nadpróbkowania w celu zrównoważenia rozkładu klas
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# define oversampling strategy
oversample = RandomOverSampler(sampling_strategy=’minority’)
# fit and apply the transform
X_over, y_over = oversample.fit_resample(X, y)
# summarize class distribution
print(Counter(y_over))

Wykonanie przykładu najpierw tworzy zbiór danych, a następnie podsumowuje rozkład klas. Widzimy, że istnieje prawie 10K przykładów w klasie większości i 100 przykładów w klasie mniejszości.

Potem losowa transformacja nadpróbkowa jest zdefiniowana w celu zrównoważenia klasy mniejszości, następnie dopasowana i zastosowana do zbioru danych. Rozkład klas dla przekształconego zbioru danych jest zgłaszany, pokazując, że teraz klasa mniejszości ma taką samą liczbę przykładów jak klasa większości.

1
2

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

Tego przekształcenia można użyć jako części Pipeline, aby zapewnić, że jest ono stosowane tylko do zbioru danych treningowych jako część każdego podziału w k-krotnej walidacji krzyżowej.

Nie można użyć tradycyjnego potoku scikit-learn; zamiast tego można użyć potoku z biblioteki imbalanced-learn. Na przykład:

1
2
3
4

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

Poniższy przykład przedstawia kompletny przykład oceny drzewa decyzyjnego na niezrównoważonym zbiorze danych z rozkładem klas 1:100.

Model jest oceniany przy użyciu powtarzanej 10-krotnej walidacji krzyżowej z trzema powtórzeniami, a nadpróbkowanie jest wykonywane na zbiorze danych szkoleniowych w ramach każdej fałdy oddzielnie, zapewniając, że nie ma wycieku danych, który mógłby wystąpić, gdyby nadpróbkowanie zostało wykonane przed walidacją krzyżową.

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

# przykład oceny drzewa decyzyjnego z losowym nadpróbkowaniem
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)
# define pipeline
steps =
pipeline = Pipeline(steps=steps)
# evaluate 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)

Uruchomienie przykładu ocenia model drzewa decyzyjnego na niezrównoważonym zbiorze danych z nadpróbkowaniem.

Wybrany model i konfiguracja ponownego próbkowania są arbitralne, zaprojektowane w celu dostarczenia szablonu, który można wykorzystać do testowania nadpróbkowania z własnym zbiorem danych i algorytmem uczenia, a nie optymalnego rozwiązania syntetycznego zbioru danych.

Uwaga: Twoje wyniki mogą się różnić ze względu na stochastyczną naturę algorytmu lub procedury oceny, lub różnice w precyzji numerycznej. Rozważ uruchomienie przykładu kilka razy i porównaj średni wynik.

Używana jest domyślna strategia nadpróbkowania, która równoważy klasy mniejszościowe z klasą większościową. Wynik F1 uśredniony dla każdego złożenia i każdego powtórzenia jest raportowany.

1
F1 Score: 0.990

Teraz, gdy znamy już oversampling, przyjrzyjmy się undersamplingowi.

Random Undersampling Imbalanced Datasets

Random undersampling polega na losowym wybieraniu przykładów z klasy większościowej do usunięcia ze zbioru danych treningowych.

Wpływa to na zmniejszenie liczby przykładów w klasie większościowej w przekształconej wersji zbioru danych treningowych. Proces ten można powtarzać aż do uzyskania pożądanego rozkładu klas, np. równej liczby przykładów dla każdej klasy.

Podejście to może być bardziej odpowiednie dla tych zbiorów danych, w których występuje nierównowaga klas, mimo że wystarczająca liczba przykładów w klasie mniejszościowej, tak użyteczny model może być dopasowany.

Ograniczeniem zaniżonego próbkowania jest to, że usuwane są przykłady z klasy większościowej, które mogą być użyteczne, ważne, a może krytyczne dla dopasowania solidnej granicy decyzji. Biorąc pod uwagę, że przykłady są usuwane losowo, nie ma sposobu, aby wykryć lub zachować „dobre” lub bardziej bogate w informacje przykłady z klasy większości.

… w losowym próbkowaniu (potencjalnie), ogromne ilości danych są odrzucane. Może to być wysoce problematyczne, ponieważ utrata takich danych może sprawić, że granica decyzji między mniejszością a większością instancji będzie trudniejsza do nauczenia, co spowoduje spadek wydajności klasyfikacji.

– Strona 45, Imbalanced Learning: Foundations, Algorithms, and Applications, 2013

Losowa technika undersamplingu może być zaimplementowana przy użyciu klasy RandomUnderSampler imbalanced-learn.

Klasa ta może być używana tak samo jak klasa RandomOverSampler w poprzedniej sekcji, z wyjątkiem strategii wpływających na klasę większości zamiast na klasę mniejszości. Na przykład, ustawienie argumentu sampling_strategy na „majority” spowoduje zaniżenie próbkowania klasy większościowej określonej przez klasę z największą liczbą przykładów.

1
2
3

# define undersample strategy
undersample = RandomUnderSampler(sampling_strategy=’majority’)

Na przykład, zbiór danych z 1000 przykładów w klasie większości i 100 przykładów w klasie mniejszości będzie undersampled tak, że obie klasy będą miały 100 przykładów w przekształconym zbiorze danych szkoleniowych.

Możemy również ustawić argument sampling_strategy na wartość zmiennoprzecinkową, która będzie procentem w stosunku do klasy mniejszości, a konkretnie liczby przykładów w klasie mniejszości podzielonej przez liczbę przykładów w klasie większości. Na przykład, jeśli ustawimy sampling_strategy na 0.5 w niezbalansowanym zbiorze danych z 1000 przykładów w klasie większości i 100 przykładów w klasie mniejszości, to w przekształconym zbiorze danych będzie 200 przykładów dla klasy większości (lub 100/200 = 0.5).

1
2
3

# zdefiniuj strategię undersample
undersample = RandomUnderSampler(sampling_strategy=0.5)

To może być preferowane, aby zapewnić, że wynikowy zbiór danych jest zarówno wystarczająco duży, aby dopasować rozsądny model, jak i że nie jest odrzucane zbyt wiele użytecznych informacji z klasy większości.

W losowym podpróbkowaniu można próbować stworzyć zrównoważony rozkład klas, wybierając losowo 90 przypadków klasy większości do usunięcia. Wynikowy zbiór danych będzie wtedy składał się z 20 instancji: 10 (losowo pozostałych) instancji klasy większościowej i (oryginalnych) 10 instancji klasy mniejszościowej.

– Strona 45, Imbalanced Learning: Foundations, Algorithms, and Applications, 2013

Transformacja może być następnie dopasowana i zastosowana do zbioru danych w jednym kroku poprzez wywołanie funkcji fit_resample() i przekazanie nieprzekształconego zbioru danych jako argumentów.

1
2
3

# dopasuj i zastosuj transformatę
X_over, y_over = undersample.fit_resample(X, y)

Możemy to zademonstrować na zbiorze danych z nierównowagą klas 1:100.

Pełny przykład znajduje się poniżej.

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

# przykład losowego undersamplingu w celu zrównoważenia rozkładu klas
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# define undersample strategy
undersample = RandomUnderSampler(sampling_strategy=’majority’)
# fit and apply the transform
X_over, y_over = undersample.fit_resample(X, y)
# summarize class distribution
print(Counter(y_over))

Wykonanie przykładu najpierw tworzy zbiór danych i raportuje niezrównoważony rozkład klas.

Przekształcenie jest dopasowywane i stosowane na zbiorze danych, a nowy rozkład klas jest raportowany. Widzimy, że klasa większości jest niedopróbkowana, aby mieć taką samą liczbę przykładów jak klasa mniejszości.

Sąd i wyniki empiryczne będą musiały być użyte do tego, czy zbiór danych szkoleniowych z zaledwie 200 przykładami będzie wystarczający do trenowania modelu.

1
2

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

Ta transformacja undersampling może być również używana w Pipeline, tak jak transformacja oversampling z poprzedniej sekcji.

To pozwala na zastosowanie transformacji do zbioru danych treningowych tylko przy użyciu schematów oceny, takich jak k-krotna walidacja krzyżowa, unikając wycieku danych w ocenie modelu.

1
2
3
4

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

Możemy zdefiniować przykład dopasowania drzewa decyzyjnego na niezrównoważonym zbiorze danych klasyfikacyjnych z transformacją undersampling zastosowaną do zbioru danych szkoleniowych na każdym podziale powtarzanej 10-krotnej walidacji krzyżowej.

Pełny przykład znajduje się poniżej.

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

# przykład oceny drzewa decyzyjnego z losowym undersamplingiem
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)
# define pipeline
steps =
pipeline = Pipeline(steps=steps)
# evaluate 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)

Uruchomienie przykładu ocenia model drzewa decyzyjnego na niezrównoważonym zbiorze danych z zaniżonym próbkowaniem.

Wybrany model i konfiguracja ponownego próbkowania są arbitralne, zaprojektowane w celu dostarczenia szablonu, który można wykorzystać do przetestowania zaniżania próbkowania z własnym zbiorem danych i algorytmem uczenia, a nie optymalnego rozwiązania syntetycznego zbioru danych.

Uwaga: Twoje wyniki mogą się różnić ze względu na stochastyczną naturę algorytmu lub procedury oceny, lub różnice w precyzji numerycznej. Rozważ uruchomienie przykładu kilka razy i porównaj średni wynik.

Używana jest domyślna strategia undersamplingu, która równoważy klasy większościowe z klasami mniejszościowymi. Wynik F1 uśredniony dla każdego złożenia i każdego powtórzenia jest raportowany.

1
F1 Score: 0.889

Combining Random Oversampling and Undersampling

Interesujące wyniki można uzyskać łącząc zarówno losowy oversampling jak i undersampling.

Na przykład, umiarkowana ilość nadpróbkowania może być zastosowana do klasy mniejszości, aby poprawić stronniczość w kierunku tych przykładów, jednocześnie stosując umiarkowaną ilość niedostatecznego próbkowania do klasy większości, aby zmniejszyć stronniczość w tej klasie.

To może skutkować poprawą ogólnej wydajności w porównaniu do wykonywania jednej lub drugiej techniki w izolacji.

Na przykład, gdybyśmy mieli zbiór danych z rozkładem klas 1:100, moglibyśmy najpierw zastosować nadpróbkowanie, aby zwiększyć stosunek do 1:10 przez powielanie przykładów z klasy mniejszości, a następnie zastosować niedopróbkowanie, aby dalej poprawić stosunek do 1:2 przez usuwanie przykładów z klasy większości.

To mogłoby być zaimplementowane przy użyciu imbalanced-learn poprzez użycie RandomOverSampler z sampling_strategy ustawionym na 0.1 (10%), a następnie użycie RandomUnderSampler z sampling_strategy ustawionym na 0.5 (50%). Na przykład:

1
2
3
4
5
6
7
8
9

# zdefiniuj strategię nadpróbkowania
over = RandomOverSampler(sampling_strategy=0.1)
# dopasuj i zastosuj transformatę
X, y = over.fit_resample(X, y)
# define undersampling strategy
under = RandomUnderSampler(sampling_strategy=0.5)
# dopasuj i zastosuj transformatę
X, y = under.fit_resample(X, y)

Możemy to zademonstrować na syntetycznym zbiorze danych z rozkładem klas 1:100. Pełny przykład znajduje się poniżej:

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

# przykład połączenia losowego oversamplingu i undersamplingu dla niezrównoważonych danych
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# define oversampling strategy
over = RandomOverSampler(sampling_strategy=0.1)
# fit and apply the transform
X, y = over.fit_resample(X, y)
# podsumuj rozkład klasy
print(Counter(y))
# define undersampling strategy
under = RandomUnderSampler(sampling_strategy=0.5)
# fit and apply the transform
X, y = under.fit_resample(X, y)
# summarize class distribution
print(Counter(y))

Wykonanie przykładu najpierw tworzy syntetyczny zbiór danych i podsumowuje rozkład klas, pokazując w przybliżeniu rozkład klas 1:100.

Następnie stosowane jest nadpróbkowanie, zwiększające rozkład z około 1:100 do około 1:10. Na koniec stosuje się undersampling, dalej poprawiając rozkład klas z 1:10 do około 1:2

1
2
3

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

Możemy również chcieć zastosować to samo hybrydowe podejście podczas oceny modelu za pomocą k-krotnej walidacji krzyżowej.

Można to osiągnąć poprzez użycie Pipeline z sekwencją transformat i kończąc na modelu, który jest oceniany; na przykład:

1
2
3
4
5
6

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

Możemy to zademonstrować za pomocą modelu drzewa decyzyjnego na tym samym syntetycznym zbiorze danych.

Pełny przykład znajduje się poniżej.

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

# przykład oceny modelu z losowym oversamplingiem i undersamplingiem
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
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# define pipeline
over = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
steps =
pipeline = Pipeline(steps=steps)
# evaluate 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)

Wykonanie przykładu ocenia model drzewa decyzyjnego przy użyciu powtarzanej k-krotnej walidacji krzyżowej, w której zbiór danych szkoleniowych jest przekształcany, najpierw przy użyciu nadpróbkowania, a następnie niedopróbkowania, dla każdego podziału i powtórzenia. Podawany jest wynik F1 uśredniony dla każdego złożenia i każdego powtórzenia.

Uwaga: Twoje wyniki mogą się różnić ze względu na stochastyczną naturę algorytmu lub procedury oceny, lub różnice w precyzji numerycznej. Rozważ uruchomienie przykładu kilka razy i porównaj średni wynik.

Wybrany model i konfiguracja resamplingu są arbitralne, zaprojektowane tak, aby zapewnić szablon, który można wykorzystać do przetestowania undersamplingu z własnym zbiorem danych i algorytmem uczenia, a nie optymalnie rozwiązać syntetyczny zbiór danych.

1
F1 Wynik: 0.985

Dalsza lektura

Ta sekcja zapewnia więcej zasobów na ten temat, jeśli szukasz pogłębienia.

Książki

  • Rozdział 5 Data Level Preprocessing Methods, Learning from Imbalanced Data Sets, 2018.
  • Rozdział 3 Imbalanced Datasets: 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.

Artykuły

  • Oversampling i undersampling w analizie danych, Wikipedia.

Podsumowanie

W tym samouczku, odkryłeś losowy oversampling i undersampling dla niezrównoważonej klasyfikacji

Szczegółowo, nauczyłeś się:

  • Losowy resampling zapewnia naiwną technikę dla ponownego zrównoważenia rozkładu klas dla niezrównoważonego zbioru danych.
  • Próbkowanie losowe powiela przykłady z klasy mniejszościowej w zbiorze danych szkoleniowych i może powodować przepełnienie dla niektórych modeli.
  • Losowy undersampling usuwa przykłady z klasy większościowej i może spowodować utratę informacji bezcennych dla modelu.

Czy masz jakieś pytania?
Pytania zadawaj w komentarzach poniżej, a ja postaram się na nie odpowiedzieć.

Poznaj klasyfikację niezrównoważoną!

Klasyfikacja niezrównoważona w Pythonie

Otwórz modele uczenia niezrównoważonego w ciągu kilku minut

…z zaledwie kilkoma liniami kodu Pythona

Odkryj, jak to zrobić w moim nowym podręczniku:
Imbalanced Classification with Python

Zawiera on samouczki i projekty typu end-to-end na temat:
Metrii wydajności, metod niepróbkowania, SMOTE, przesuwania progów, kalibracji prawdopodobieństwa, algorytmów wrażliwych na koszty
i wiele więcej…

Bring Imbalanced Classification Methods to Your Machine Learning Projects

See What’s Inside

Tweet Share Share

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.