Random Oversampling and Undersampling for Imbalanced Classification

Tweet Share 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.

Ez a torzítás a képzési adathalmazban számos gépi tanulási algoritmust befolyásolhat, ami egyeseket arra késztet, hogy teljesen figyelmen kívül hagyják a kisebbségi osztályt. Ez azért jelent problémát, mert jellemzően a kisebbségi osztály az, amelyre vonatkozó előrejelzések a legfontosabbak.

Az osztályok kiegyensúlyozatlanságának egyik megközelítése az, hogy véletlenszerűen újramintázzuk a képzési adathalmazt. A kiegyensúlyozatlan adathalmaz véletlenszerű újramintázásának két fő megközelítése a többségi osztályból származó példák törlése, amit alulmintavételezésnek nevezünk, és a kisebbségi osztályból származó példák duplikálása, amit túlmintavételezésnek nevezünk.

Ezzel a bemutatóval megismerheti a véletlenszerű túlmintavételezést és alulmintavételezést a kiegyensúlyozatlan osztályozáshoz

A bemutató elvégzése után tudni fogja:

  • A véletlenszerű újramintázás naiv technikát biztosít a kiegyensúlyozatlan adathalmaz osztályeloszlásának kiegyensúlyozására.
  • A véletlenszerű túlmintavételezés a kisebbségi osztályból származó példákat duplikálja a képzési adathalmazban, és egyes modellek esetében túlillesztést eredményezhet.
  • A véletlenszerű alulmintavételezés a többségi osztályból származó példákat törli, és a modell számára felbecsülhetetlen értékű információk elvesztését eredményezheti.

Kezdje el projektjét új könyvemmel, a Kiegyensúlyozatlan osztályozás Pythonnal című könyvvel, amely lépésről lépésre bemutató útmutatókat és az összes példa Python forráskódfájlját tartalmazza.

Kezdjük el.

  • Frissítve 2021. január:
Random Oversampling and Undersampling for Imbalanced Classification

Random Oversampling and Undersampling for Imbalanced Classification
Photo by RichardBH, some rights reserved.

Tutorial Overview

Ez a bemutató öt részre oszlik; ezek a következők:

  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

A resampling a gyakorló adathalmaz egy új, átalakított változatának létrehozását jelenti, amelyben a kiválasztott példák más osztályeloszlással rendelkeznek.

Ez egy egyszerű és hatékony stratégia kiegyensúlyozatlan osztályozási problémák esetén.

Az újramintázási stratégiák alkalmazása kiegyensúlyozottabb adateloszlás elérése érdekében hatékony megoldás a kiegyensúlyozatlansági problémára

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

A legegyszerűbb stratégia az átalakított adathalmaz példáinak véletlenszerű kiválasztása, amit véletlenszerű újramintavételezésnek nevezünk.

A kiegyensúlyozatlan osztályozáshoz történő véletlenszerű újramintavételezésnek két fő megközelítése van; ezek a túlmintavételezés és az alulmintavételezés.

  • Random Oversampling: A kisebbségi osztályba tartozó példák véletlenszerű duplikálása.
  • Véletlenszerű alulmintavételezés: A többségi osztályban lévő példák véletlenszerű törlése.

A véletlenszerű túlmintavételezés során a kisebbségi osztályból véletlenszerűen választunk ki példákat, cserével, és hozzáadjuk őket a képzési adathalmazhoz. A véletlenszerű alulmintavételezés során véletlenszerűen választunk ki példákat a többségi osztályból, és töröljük őket a képzési adathalmazból.

A véletlenszerű alulmintavételezés során a többségi osztály példányait véletlenszerűen dobjuk ki, amíg egy kiegyensúlyozottabb eloszlást nem érünk el.

– 45. oldal, Kiegyensúlyozatlan tanulás: Foundations, Algorithms, and Applications, 2013

Mindkét megközelítés addig ismételhető, amíg el nem érjük a kívánt osztályeloszlást a képzési adathalmazban, például az osztályok közötti egyenlő felosztást.

Azért nevezik ezeket “naiv újramintavételezési” módszereknek, mert semmit sem feltételeznek az adatokról, és nem használnak heurisztikákat. Emiatt egyszerűen implementálhatók és gyorsan végrehajthatók, ami kívánatos a nagyon nagy és összetett adathalmazok esetében.

Mindkét technika alkalmazható kétosztályos (bináris) osztályozási problémákra és többosztályos osztályozási problémákra egy vagy több több többségi vagy kisebbségi osztállyal.

Fontos, hogy az osztályeloszlás megváltoztatása csak a képzési adathalmazra vonatkozik. A cél a modellek illeszkedésének befolyásolása. Az újramintázást nem alkalmazzák a modell teljesítményének értékelésére használt teszt vagy holdout adathalmazra.

Általában ezek a naiv módszerek hatékonyak lehetnek, bár ez az érintett adathalmaz és modellek sajátosságaitól függ.

Nézzük meg közelebbről az egyes módszereket és a gyakorlati alkalmazásukat.

Imbalanced-Learn könyvtár

Ezekben a példákban az imbalanced-learn Python könyvtár által biztosított implementációkat fogjuk használni, amely a pip segítségével telepíthető a következőképpen:

1
sudo pip install imbalanced-learn

A telepítés sikerességét a telepített könyvtár verziójának kinyomtatásával igazolhatja:

1
2
3

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

A példa futtatása kiírja a telepített könyvtár verziószámát; például:

1
0.5.0

Meg akarja kezdeni az egyensúlytalansági osztályozást?

Vegye fel a 7 napos ingyenes e-mailes gyorstalpaló tanfolyamomat most (mintakóddal).

Kattintson a feliratkozáshoz, és kapja meg a tanfolyam ingyenes PDF Ebook változatát is.

Töltse le az INGYENES minitanfolyamát

Véletlenszerű túlmintavételezés kiegyensúlyozatlan adathalmazokból

A véletlenszerű túlmintavételezés során a kisebbségi osztályból véletlenszerűen duplikáljuk a példákat, és hozzáadjuk a képzési adathalmazhoz.

A képzési adathalmazból a példákat véletlenszerűen választjuk ki, cserével. Ez azt jelenti, hogy a kisebbségi osztályból származó példák többször is kiválaszthatók és hozzáadhatók az új, “kiegyensúlyozottabb” képzési adathalmazhoz; kiválasztásra kerülnek az eredeti képzési adathalmazból, hozzáadódnak az új képzési adathalmazhoz, majd visszakerülnek vagy “kicserélődnek” az eredeti adathalmazba, és így újra kiválaszthatók.

Ez a technika hatékony lehet azon gépi tanulási algoritmusok esetében, amelyeket ferde eloszlás befolyásol, és ahol egy adott osztály több duplikált példája befolyásolhatja a modell illeszkedését. Ide tartozhatnak az olyan algoritmusok, amelyek iteratív módon tanulják az együtthatókat, mint például a sztochasztikus gradiens ereszkedést alkalmazó mesterséges neurális hálózatok. Olyan modelleket is érinthet, amelyek az adatok jó felosztását keresik, mint például a támogató vektorgépek és a döntési fák.

A célosztály eloszlását hasznos lehet hangolni. Bizonyos esetekben a kiegyensúlyozott eloszlás keresése egy súlyosan kiegyensúlyozatlan adatkészlethez azt eredményezheti, hogy az érintett algoritmusok túlillesztik a kisebbségi osztályt, ami megnövekedett általánosítási hibához vezet. A hatás lehet jobb teljesítmény a gyakorló adathalmazon, de rosszabb teljesítmény a visszatartott vagy tesztadathalmazon.

… a véletlenszerű túlmintavételezés növelheti a túlillesztés előfordulásának valószínűségét, mivel pontos másolatokat készít a kisebbségi osztály példáiról. Ily módon például egy szimbolikus osztályozó olyan szabályokat konstruálhat, amelyek látszólag pontosak, de valójában egyetlen másolt példát fednek le.

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

Azért, hogy betekintést nyerjünk a módszer hatásába, érdemes a túlmintavételezés után figyelemmel kísérni a teljesítményt a vonat- és a tesztadathalmazon is, és összehasonlítani az eredményeket az eredeti adathalmazon alkalmazott azonos algoritmussal.

A kisebbségi osztályra vonatkozó példák számának növekedése, különösen, ha az osztályok torzítása súlyos volt, a modell illesztésekor a számítási költségek jelentős növekedését is eredményezheti, különösen, ha figyelembe vesszük, hogy a modell újra és újra ugyanazokat a példákat látja a képzési adathalmazban.

… a véletlenszerű túlmintavételezés során a kisebbségi osztály példáinak véletlenszerű másolatai kerülnek hozzá az adatokhoz. Ez növelheti a túlillesztés valószínűségét, különösen nagyobb túlmintavételi arányok esetén. Ezenkívül csökkentheti az osztályozó teljesítményét és növelheti a számítási ráfordítást.

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

A véletlenszerű túlmintavételezés a RandomOverSampler osztály segítségével valósítható meg.

Az osztály definiálható, és elfogad egy sampling_strategy argumentumot, amelyet “minority”-re lehet állítani, hogy automatikusan kiegyensúlyozza a kisebbségi osztályt a többségi osztállyal vagy osztályokkal.

Például:

1
2
3

# definiáljuk a túlmintavételi stratégiát
oversample = RandomOverSampler(sampling_strategy=’minority’)

Ez azt jelenti, hogy ha a többségi osztály 1000 példával rendelkezik, a kisebbségi osztály pedig 100 példával, akkor ez a stratégia túlmintavételezi a kisebbségi osztályt, hogy az 1000 példával rendelkezzen.

Egy lebegőpontos érték adható meg a kisebbségi osztály többségi példáinak arányára az átalakított adathalmazban. Például:

1
2
3

# definiáljuk a túlmintavételi stratégiát
oversample = RandomOverSampler(sampling_strategy=0.5)

Ez biztosítaná, hogy a kisebbségi osztály túlmintavételezése a bináris osztályozási problémák esetén feleannyi példát tartalmazzon, mint a többségi osztályé. Ez azt jelenti, hogy ha a többségi osztály 1000 példával, a kisebbségi osztály pedig 100 példával rendelkezne, akkor a transzformált adathalmaz 500 példát tartalmazna a kisebbségi osztályból.

Az osztály olyan, mint egy scikit-learn transzformációs objektum abban a tekintetben, hogy egy adathalmazra illeszkedik, majd egy új vagy transzformált adathalmaz létrehozására használják. A scikit-learn-transzformációktól eltérően ez megváltoztatja az adathalmazban lévő példák számát, nem csak az értékeket (mint egy skálázó) vagy a jellemzők számát (mint egy vetület).

Ez például a fit_sample() függvény meghívásával egy lépésben illeszthető és alkalmazható:

1
2
3

# illesztés és a transzformáció alkalmazása
X_over, y_over = oversample.fit_resample(X, y)

Ezt egy egyszerű szintetikus bináris osztályozási problémán tudjuk demonstrálni, 1:100-as osztályegyenlőtlenséggel.

1
2
3

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

Az adathalmaz definiálásának és az osztályeloszlás kiegyensúlyozása érdekében végzett véletlenszerű túlmintavételezés teljes példája az alábbiakban található.

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

# példa véletlenszerű túlmintavételezésre az osztályeloszlás kiegyenlítésére
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))
# definiáljuk a túlmintavételi stratégiát
oversample = RandomOverSampler(sampling_strategy=’minority’)
# illesszük és alkalmazzuk a transzformációt
X_over, y_over = oversample.fit_resample(X, y)
# összegezzük az osztályeloszlást
print(Counter(y_over))

A példa futtatása először létrehozza az adathalmazt, majd összegzi az osztályeloszlást. Láthatjuk, hogy közel 10K példa van a többségi osztályban és 100 példa a kisebbségi osztályban.

Ezután a kisebbségi osztály kiegyensúlyozására definiáljuk a véletlenszerű túlmintás transzformációt, majd illesztjük és alkalmazzuk az adathalmazra. A transzformált adathalmaz osztályeloszlását közöljük, ami azt mutatja, hogy most a kisebbségi osztály ugyanannyi példával rendelkezik, mint a többségi osztály.

1
2

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

Ez a transzformáció egy csővezeték részeként használható annak biztosítására, hogy a k-szoros keresztellenőrzésben csak a képzési adathalmazra alkalmazzák az egyes osztások részeként.

Hagyományos scikit-learn Pipeline nem használható, helyette az imbalanced-learn könyvtárból származó Pipeline használható. Például:

1
2
3
4

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

Az alábbi példa egy döntési fa kiértékelésének teljes példáját mutatja be egy kiegyensúlyozatlan, 1:100 osztályeloszlású adathalmazon.

A modell kiértékelése ismétlődő 10-szeres keresztvalidálással történik három ismétléssel, és a túlmintavételezés minden egyes hajtáson belül külön-külön történik a képzési adathalmazon, biztosítva, hogy ne legyen adatszivárgás, mint ami akkor fordulhatna elő, ha a túlmintavételezést a keresztvalidálás előtt végeznénk el.

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

# példa egy döntési fa kiértékelésére véletlenszerű túlmintavétellel
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)

A példa futtatása kiértékeli a döntési fa modellt a kiegyensúlyozatlan adathalmazon túlmintavételezéssel.

A választott modell és az újramintavételezési konfiguráció tetszőleges, célja, hogy egy olyan sablont adjon, amelyet az alulmintavételezés tesztelésére használhat a saját adatállományával és tanulási algoritmusával, nem pedig a szintetikus adatállomány optimális megoldására.

Megjegyzés: Az algoritmus vagy az értékelési eljárás sztochasztikus jellege, illetve a numerikus pontosság különbségei miatt az Ön eredményei eltérhetnek. Fontolja meg a példa többszöri futtatását, és hasonlítsa össze az átlagos eredményt.

Az alapértelmezett túlmintavételi stratégiát használja, amely kiegyensúlyozza a kisebbségi osztályokat a többségi osztályokkal. Az egyes hajtásokon és minden egyes ismétlésen átlagolt F1 pontszámot közöljük.

1
F1 pontszám: 0.990

Most, hogy már ismerjük a túlmintavételezést, nézzük meg az alulmintavételezést.

Véletlenszerű alulmintavételezés kiegyensúlyozatlan adathalmazok

A véletlenszerű alulmintavételezés során véletlenszerűen választunk ki példákat a többségi osztályból, amelyeket törölni kell a tréningadathalmazból.

Ez azt eredményezi, hogy a tréningadathalmaz átalakított változatában csökken a többségi osztályba tartozó példák száma. Ez a folyamat addig ismételhető, amíg el nem érjük a kívánt osztályeloszlást, például az egyes osztályok egyenlő számú példáját.

Ez a megközelítés alkalmasabb lehet olyan adathalmazok esetében, ahol az osztályok között egyensúlyhiány van, bár a kisebbségi osztályban elegendő számú példa van, így egy hasznos modell illeszthető.

Az alulmintavételezés korlátja, hogy a többségi osztályból olyan példákat törölünk, amelyek hasznosak, fontosak vagy esetleg kritikusak lehetnek egy robusztus döntési határvonal illesztéséhez. Tekintettel arra, hogy a példákat véletlenszerűen törlik, nincs mód a “jó” vagy információban gazdagabb példák felderítésére vagy megőrzésére a többségi osztályból.

… a véletlenszerű alulmintavételezés során (potenciálisan) hatalmas mennyiségű adatot dobunk ki. Ez rendkívül problematikus lehet, mivel az ilyen adatok elvesztése megnehezítheti a kisebbségi és a többségi példányok közötti döntési határvonal megtanulását, ami az osztályozási teljesítmény csökkenését eredményezi.

– 45. oldal, Kiegyensúlyozatlan tanulás: Foundations, Algorithms, and Applications, 2013

A random undersampling technika a RandomUnderSampler imbalanced-learn osztály segítségével valósítható meg.

Az osztály ugyanúgy használható, mint a RandomOverSampler osztály az előző szakaszban, azzal a különbséggel, hogy a stratégiák a kisebbségi osztály helyett a többségi osztályra hatnak. Ha például a sampling_strategy argumentumot “majority”-re állítjuk, akkor a legnagyobb számú példával rendelkező osztály által meghatározott többségi osztályt alulmintavételezzük.

1
2
3

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

Például egy olyan adathalmazt, amely 1000 példát tartalmaz a többségi osztályban és 100 példát a kisebbségi osztályban, alulmintavételezünk úgy, hogy mindkét osztály 100 példát tartalmazzon az átalakított képzési adathalmazban.

A sampling_strategy argumentumot egy lebegőpontos értékre is beállíthatjuk, amely a kisebbségi osztályhoz viszonyított százalékos érték lesz, pontosabban a kisebbségi osztályban lévő példák száma osztva a többségi osztályban lévő példák számával. Például, ha a sampling_strategy értékét 0,5-re állítjuk egy olyan kiegyensúlyozatlan adatkészletben, amelyben 1000 példa van a többségi osztályban és 100 példa a kisebbségi osztályban, akkor az átalakított adatkészletben 200 példa lesz a többségi osztályra (vagy 100/200 = 0.5).

1
2
3

# define undersample strategy
undersample = RandomUnderSampler(sampling_strategy=0.5)

Ez előnyös lehet annak biztosítására, hogy a kapott adathalmaz elég nagy legyen egyrészt egy ésszerű modell illesztéséhez, másrészt hogy a többségi osztályból ne vesszen el túl sok hasznos információ.

A véletlenszerű alulmintavételezés során megkísérelhetünk kiegyensúlyozott osztályeloszlást létrehozni úgy, hogy véletlenszerűen kiválasztunk 90 többségi osztályú példányt, amelyeket eltávolítunk. Az így kapott adathalmaz ekkor 20 példányból fog állni: 10 (véletlenszerűen megmaradó) többségi osztályú példány és (az eredeti) 10 kisebbségi osztályú példány.

– 45. oldal, Kiegyensúlyozatlan tanulás: Foundations, Algorithms, and Applications, 2013

A transzformáció ezután egy lépésben illeszthető és alkalmazható egy adathalmazra a fit_resample() függvény meghívásával és a transzformálatlan adathalmaz argumentumként történő átadásával.

1
2
3

# illesztés és a transzformáció alkalmazása
X_over, y_over = undersample.fit_resample(X, y)

Ezt egy 1:100-as osztályegyensúlytalanságú adathalmazon tudjuk demonstrálni.

A teljes példa az alábbiakban található.

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

# példa véletlenszerű alulmintavételezésre az osztályeloszlás kiegyensúlyozására
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))
# undersample stratégia definiálása
undersample = RandomUnderSampler(sampling_strategy=’majority’)
# illesztés és a transzformáció alkalmazása
X_over, y_over = undersample.fit_resample(X, y)
# osztályeloszlás összegzése
print(Counter(y_over))

A példa futtatása először létrehozza az adathalmazt, és jelenti a kiegyensúlyozatlan osztályeloszlást.

A transzformáció illesztése és alkalmazása az adathalmazon, majd az új osztályeloszlás jelentése. Láthatjuk, hogy a többségi osztály alulmintavételezett, hogy ugyanannyi példát kapjon, mint a kisebbségi osztály.

El kell majd dönteni és empirikus eredményeket kell felhasználni arra vonatkozóan, hogy egy mindössze 200 példát tartalmazó képzési adathalmaz elegendő-e egy modell képzéséhez.

1
2

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

Ez az alulmintavételező transzformáció is használható egy Pipeline-ban, akárcsak az előző szakaszban szereplő túlmintavételező transzformáció.

Ez lehetővé teszi, hogy a transzformációt csak a képzési adathalmazra alkalmazzuk olyan kiértékelési sémák segítségével, mint például a k-szoros keresztvalidálás, elkerülve az adatszivárgást a modell kiértékelése során.

1
2
3
4

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

Meghatározhatunk egy példát egy döntési fa illesztésére egy kiegyensúlyozatlan osztályozási adathalmazon úgy, hogy az alulmintavételi transzformációt alkalmazzuk a képzési adathalmazra egy ismételt 10-szeres keresztvalidálás minden egyes felosztásakor.

A teljes példa az alábbiakban található.

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

# példa egy döntési fa kiértékelésére véletlen alulmintavétellel
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)

A példa futtatása kiértékeli a döntési fa modellt a kiegyensúlyozatlan adathalmazon alulmintavételezéssel.

A választott modell és az újramintavételezési konfiguráció tetszőleges, célja, hogy egy olyan sablont adjon, amelyet az alulmintavételezés tesztelésére használhat a saját adatállományával és tanulási algoritmusával, nem pedig a szintetikus adatállomány optimális megoldására.

Megjegyzés: Az algoritmus vagy az értékelési eljárás sztochasztikus jellege, illetve a numerikus pontosság különbségei miatt az Ön eredményei eltérhetnek. Fontolja meg a példa többszöri futtatását, és hasonlítsa össze az átlagos eredményt.

Az alapértelmezett alulmintavételi stratégiát használja, amely kiegyensúlyozza a többségi osztályokat a kisebbségi osztályokkal. Az egyes hajtásokon és minden egyes ismétlésen átlagolt F1 pontszámot közöljük.

1
F1 pontszám: 0.889

Véletlenszerű túl- és alulmintavételezés kombinálása

Érdekes eredményeket lehet elérni a véletlenszerű túl- és alulmintavételezés kombinálásával.

Például szerény mértékű túlmintavételezést lehet alkalmazni a kisebbségi osztályra, hogy javítsuk a torzítást az ilyen példák felé, miközben szerény mértékű alulmintavételt alkalmazunk a többségi osztályra, hogy csökkentsük a torzítást az adott osztályra vonatkozóan.

Ez összességében jobb teljesítményt eredményezhet, mintha az egyik vagy másik technikát külön-külön hajtanánk végre.

Ha például egy 1:100 arányú osztályeloszlású adathalmazzal rendelkeznénk, először túlmintavételt alkalmazhatnánk, hogy a kisebbségi osztályból származó példák duplikálásával 1:10-re növeljük az arányt, majd a többségi osztályból származó példák törlésével további 1:2-re javíthatnánk az arányt alulmintavételezéssel.

Ezt az imbalanced-learn segítségével úgy lehetne megvalósítani, hogy egy RandomOverSampler-t használunk 0,1-re (10%) beállított sampling_stratégiával, majd egy RandomUnderSampler-t használunk 0,5-re (50%) beállított sampling_stratégiával. Például:

1
2
3
4
5
6
7
8
9

# definiáljuk a túlmintavételi stratégiát
over = RandomOverSampler(sampling_strategy=0.1)
# illesszük és alkalmazzuk a transzformációt
X, y = over.fit_resample(X, y)
# definiáljuk az alulmintavételi stratégiát
under = RandomUnderSampler(sampling_strategy=0.5)
# illesztés és a transzformáció alkalmazása
X, y = under.fit_resample(X, y)

Ezt egy 1:100 osztályeloszlású szintetikus adathalmazon tudjuk demonstrálni. A teljes példa az alábbiakban található:

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

# példa a véletlenszerű túlmintavételezés és alulmintavételezés kombinálására kiegyensúlyozatlan adatok esetén
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))
# definiáljuk a túlmintavételi stratégiát
over = RandomOverSampler(sampling_strategy=0.1)
# illesszük és alkalmazzuk a transzformációt
X, y = over.fit_resample(X, y)
# osztályeloszlás összegzése
print(Counter(y))
# definiáljuk az alulmintavételi stratégiát
under = RandomUnderSampler(sampling_strategy=0.5)
# illesszük és alkalmazzuk a transzformációt
X, y = under.fit_resample(X, y)
# összegezzük az osztályeloszlást
print(Counter(y))

A példa futtatása először létrehozza a szintetikus adathalmazt, és összegzi az osztályeloszlást, ami egy megközelítőleg 1:100 arányú osztályeloszlást mutat.

Aztán túlmintavételezést alkalmazunk, ami az eloszlást körülbelül 1:100-ról körülbelül 1:10-re növeli. Végül alulmintavételezést alkalmazunk, tovább javítva az osztályeloszlást 1:10-ről körülbelül 1:2-re

1
2
3

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

Ugyanezt a hibrid megközelítést alkalmazhatjuk akkor is, amikor egy modellt k-szoros keresztvalidálással értékelünk.

Ez úgy érhető el, hogy egy olyan csővezetéket használunk, amely egy sor transzformációt tartalmaz, és a kiértékelt modellel végződik; például:

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)

Ezt egy döntési fa modellel demonstrálhatjuk ugyanezen a szintetikus adathalmazon.

A teljes példa az alábbiakban található.

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

# példa egy modell kiértékelésére véletlenszerű túl- és alulmintavétellel
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)

A példa futtatása egy döntési fa modellt értékel ki ismételt k-szoros keresztvalidálással, ahol a képzési adathalmazt először túlmintavételezéssel, majd alulmintavételezéssel transzformáljuk minden egyes felosztás és elvégzett ismétlés esetén. Az egyes hajtásokra és ismétlésekre átlagolt F1-pontszámot közli.

Megjegyzés: Az algoritmus vagy az értékelési eljárás sztochasztikus jellege, illetve a numerikus pontosságban mutatkozó különbségek miatt az Ön eredményei eltérhetnek. Fontolja meg a példa többszöri futtatását, és hasonlítsa össze az átlagos eredményt.

A választott modell és az újramintavételezési konfiguráció tetszőleges, célja, hogy egy olyan sablont adjon, amelyet az alulmintavételezés tesztelésére használhat az adathalmazzal és a tanulási algoritmussal, nem pedig a szintetikus adathalmaz optimális megoldására.

1
F1 Score: 0.985

További olvasmányok

Ez a rész további forrásokat tartalmaz a témában, ha mélyebben szeretne elmélyülni.

Könyvek

  • 5. fejezet Adatszintű előfeldolgozási módszerek, Tanulás kiegyensúlyozatlan adathalmazokból, 2018.
  • 3. fejezet Kiegyensúlyozatlan adathalmazok: A mintavételtől az osztályozókig, Kiegyensúlyozatlan tanulás: 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.

Cikkek

  • Oversampling and undersampling in data analysis, Wikipedia.

Összefoglaló

Ezzel a bemutatóval felfedezted a véletlenszerű túl- és alulmintavételt kiegyensúlyozatlan osztályozáshoz

Közelebbről megtanultad:

  • A véletlenszerű újramintavételezés egy naiv technikát biztosít az osztályeloszlás kiegyensúlyozatlan adathalmaz esetén történő újbóli kiegyensúlyozására.
  • A véletlenszerű túlmintavételezés a kisebbségi osztályból származó példákat duplikálja a képzési adathalmazban, és egyes modellek esetében túlillesztést eredményezhet.
  • A véletlenszerű alulmintavételezés törli a példákat a többségi osztályból, és a modell számára felbecsülhetetlen értékű információk elvesztését eredményezheti.

Kérdése van?
Tegye fel kérdéseit az alábbi megjegyzésekben, és igyekszem válaszolni.

Kezd meg a kiegyensúlyozatlan osztályozást!

Kiegyensúlyozatlan osztályozás Pythonnal

Kiegyensúlyozatlan tanulási modellek fejlesztése percek alatt

…mindössze néhány sor python kóddal

Fedezd fel, hogyan az új Ebookomban:
Kiegyensúlyozatlan osztályozás Pythonnal

Ez önképző tananyagokat és végigvitt projekteket tartalmaz:
Teljesítménymérők, alulmintavételi módszerek, SMOTE, küszöbmozgatás, valószínűségi kalibrálás, költségérzékeny algoritmusok
és még sok másról…

Kiegyensúlyozatlan osztályozási módszerek alkalmazása gépi tanulási projektjeiben

Nézze meg, mi van benne

Tweet Share Share Share

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.