Poslední aktualizace 5. ledna 2021
Nevyvážené datové soubory jsou takové, u kterých existuje výrazné zkreslení v rozložení tříd, například 1:100 nebo 1:1000 příkladů v menšinové třídě vůči většinové třídě.
Toto zkreslení trénovacího souboru dat může ovlivnit mnoho algoritmů strojového učení, což vede k tomu, že některé z nich menšinovou třídu zcela ignorují. To je problém, protože je to obvykle menšinová třída, na které jsou předpovědi nejdůležitější.
Jedním z přístupů k řešení problému nevyváženosti tříd je náhodné převzorkování trénovacího souboru dat. Dva hlavní přístupy k náhodnému převzorkování nevyváženého souboru dat jsou odstranění příkladů z většinové třídy, tzv. podvzorkování, a duplikování příkladů z menšinové třídy, tzv. převzorkování.
V tomto tutoriálu se seznámíte s náhodným převzorkováním a podvzorkováním pro nevyváženou klasifikaci
Po dokončení tohoto tutoriálu budete vědět:
- Náhodné převzorkování poskytuje naivní techniku pro obnovení rovnováhy rozdělení tříd pro nevyvážený soubor dat.
- Náhodné převzorkování duplikuje příklady z menšinové třídy v trénovací sadě dat a může vést k nadměrnému přizpůsobení některých modelů.
- Náhodné podvzorkování odstraňuje příklady z většinové třídy a může vést ke ztrátě informací neocenitelných pro model.
Začněte svůj projekt s mou novou knihou Nevyvážená klasifikace s jazykem Python, která obsahuje výukové programy krok za krokem a zdrojové soubory jazyka Python pro všechny příklady.
Začněme.
- Aktualizováno leden/2021:
Náhodné převzorkování a podvzorkování pro nevyváženou klasifikaci
Foto: RichardBH, některá práva vyhrazena.
- Přehled výuky
- Náhodné převzorkování nevyvážených datových sad
- Knihovna nevyváženého učení
- Chcete začít s klasifikací nerovnováhy?“
- Náhodné převzorkování nevyvážených souborů dat
- Náhodné podvzorkování nevyvážených souborů dat
- Kombinace náhodného převzorkování a podvzorkování
- Další literatura
- Knihy
- Papers
- API
- Články
- Shrnutí
- Získejte přehled o nevyvážené klasifikaci!
- Vyvíjejte modely nevyváženého učení během několika minut
- Zavedení nevyvážených klasifikačních metod do vašich projektů strojového učení
Přehled výuky
Tento výukový program je rozdělen do pěti částí; jsou to:
- Náhodné převzorkování nevyvážených souborů dat
- Nevyvážené-Learn Library
- Náhodné převzorkování nevyvážených datových sad
- Náhodné podvzorkování nevyvážených datových sad
- Kombinace náhodného převzorkování a podvzorkování
Náhodné převzorkování nevyvážených datových sad
Převzorkování zahrnuje vytvoření nové transformované verze trénovací datové sady, ve které mají vybrané příklady jiné rozložení tříd.
Jedná se o jednoduchou a účinnou strategii pro nevyvážené klasifikační problémy.
Použití strategie převzorkování k získání vyváženějšího rozložení dat je účinným řešením problému nevyváženosti
– A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
Nejjednodušší strategií je náhodný výběr příkladů pro transformovaný soubor dat, který se nazývá náhodné převzorkování.
Existují dva hlavní přístupy k náhodnému převzorkování pro nevyváženou klasifikaci; jsou to převzorkování a podvzorkování.
- Náhodné převzorkování:
- Náhodné podvzorkování:
Náhodné převzorkování zahrnuje náhodný výběr příkladů z menšinové třídy s nahrazením a jejich přidání do trénovacího souboru dat. Náhodné podvzorkování zahrnuje náhodný výběr příkladů z většinové třídy a jejich odstranění z trénovacího souboru dat.
Při náhodném podvzorkování jsou náhodně vyřazovány příklady z většinové třídy, dokud není dosaženo vyváženějšího rozložení.
– Strana 45, Nevyvážené učení: Foundations, Algorithms, and Applications, 2013
Oba přístupy lze opakovat, dokud není dosaženo požadovaného rozložení tříd v trénovací množině dat, například rovnoměrného rozdělení napříč třídami.
Tyto metody se označují jako „naivní převzorkování“, protože nepředpokládají nic o datech a nepoužívají se žádné heuristiky. Díky tomu jsou jednoduché na implementaci a rychlé na provedení, což je žádoucí u velmi rozsáhlých a složitých souborů dat.
Obě techniky lze použít pro dvoutřídní (binární) klasifikační problémy a vícetřídní klasifikační problémy s jednou nebo více většinovými nebo menšinovými třídami.
Důležité je, že změna rozdělení tříd se aplikuje pouze na trénovací soubor dat. Záměrem je ovlivnit shodu modelů. Převzorkování se neaplikuje na testovací nebo vyčkávací datovou sadu, která se používá k vyhodnocení výkonnosti modelu.
Obecně mohou být tyto naivní metody účinné, i když to závisí na specifikách datové sady a příslušných modelů.
Podívejme se blíže na jednotlivé metody a na jejich použití v praxi.
Knihovna nevyváženého učení
V těchto příkladech budeme používat implementace poskytované knihovnou imbalanced-learn pro Python, kterou lze nainstalovat pomocí pip následujícím způsobem:
1
|
sudo pip install imbalanced-learn
|
Úspěšnost instalace můžete potvrdit vypsáním verze nainstalované knihovny:
1
2
3
|
# check version number
import imblearn
print(imblearn.__version__)
|
Při spuštění příkladu se vypíše číslo verze nainstalované knihovny; např:
1
|
0.5.0
|
Chcete začít s klasifikací nerovnováhy?“
Podstupte nyní můj bezplatný 7denní e-mailový rychlokurz (s ukázkovým kódem).
Klikněte pro registraci a získejte také bezplatnou elektronickou verzi kurzu ve formátu PDF.
Stáhněte si svůj minikurz ZDARMA
Náhodné převzorkování nevyvážených souborů dat
Náhodné převzorkování zahrnuje náhodné duplikování příkladů z minoritní třídy a jejich přidání do trénovacího souboru dat.
Příklady z trénovacího souboru dat jsou vybrány náhodně s nahrazením. To znamená, že příklady z menšinové třídy mohou být vybrány a přidány do nového „vyváženějšího“ trénovacího souboru dat vícekrát; jsou vybrány z původního trénovacího souboru dat, přidány do nového trénovacího souboru dat a poté vráceny nebo „nahrazeny“ v původním souboru dat, což umožňuje jejich opětovný výběr.
Tato technika může být účinná pro ty algoritmy strojového učení, které jsou ovlivněny zkresleným rozdělením a kde více duplicitních příkladů pro danou třídu může ovlivnit shodu modelu. To může zahrnovat algoritmy, které se iterativně učí koeficienty, jako jsou umělé neuronové sítě, které používají stochastický sestup po gradientu. Může také ovlivnit modely, které hledají dobré rozdělení dat, jako jsou stroje s podpůrnými vektory a rozhodovací stromy.
Může být užitečné vyladit rozdělení cílové třídy. V některých případech může hledání vyváženého rozdělení pro silně nevyváženou sadu dat způsobit, že ovlivněné algoritmy nadměrně přizpůsobí menšinovou třídu, což vede ke zvýšené chybě zobecnění. Důsledkem může být lepší výkon na trénovací sadě dat, ale horší výkon na podržené nebo testovací sadě dat.
… náhodné převzorkování může zvýšit pravděpodobnost výskytu overfittingu, protože vytváří přesné kopie příkladů minoritní třídy. Tímto způsobem může například symbolický klasifikátor zkonstruovat pravidla, která jsou zdánlivě přesná, ale ve skutečnosti pokrývají jeden replikovaný příklad.
– Strana 83, Učení z nevyvážených datových sad, 2018.
Pro získání představy o dopadu metody je proto dobré sledovat výkonnost na trénovací i testovací datové sadě po převzorkování a porovnat výsledky se stejným algoritmem na původní datové sadě.
Zvýšení počtu příkladů pro menšinovou třídu, zejména pokud bylo zkreslení třídy silné, může také vést k výraznému zvýšení výpočetních nákladů při fitování modelu, zejména s ohledem na to, že model vidí v trénovacím souboru dat stále stejné příklady.
… při náhodném převzorkování se do dat přidá náhodná sada kopií příkladů menšinové třídy. To může zvýšit pravděpodobnost převzorkování, zvláště pro vyšší míru převzorkování. Navíc může snížit výkon klasifikátoru a zvýšit výpočetní náročnost.
– A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
Náhodné převzorkování lze implementovat pomocí třídy RandomOverSampler.
Třídu lze definovat a přijímá argument sampling_strategy, který lze nastavit na „minority“ pro automatické vyvážení minoritní třídy s majoritní třídou nebo třídami.
Například:
1
2
3
|
…
# define oversampling strategy
oversample = RandomOverSampler(sampling_strategy=’minority‘)
|
To znamená, že pokud by většinová třída měla 1 000 příkladů a menšinová 100, tato strategie by převzala menšinovou třídu tak, aby měla 1 000 příkladů.
Může být zadána hodnota s pohyblivou desetinnou čárkou, která udává poměr příkladů minoritní třídy a majority v transformovaném souboru dat. Například:
1
2
3
|
…
# define oversampling strategy
oversample = RandomOverSampler(sampling_strategy=0.5)
|
Tím by se zajistilo, že menšinová třída bude převzorkována tak, aby měla poloviční počet příkladů než většinová třída, pro problémy binární klasifikace. To znamená, že pokud by většinová třída měla 1 000 příkladů a menšinová třída 100 příkladů, transformovaný dataset by měl 500 příkladů menšinové třídy.
Třída je jako objekt transformace scikit-learn v tom smyslu, že se napasuje na dataset a poté se použije k vytvoření nového nebo transformovaného datasetu. Na rozdíl od transformací scikit-learn změní počet příkladů v datové sadě, nikoli pouze hodnoty (jako škálovač) nebo počet rysů (jako projekce).
Příklad ji lze fitovat a aplikovat v jednom kroku voláním funkce fit_sample():
1
2
3
|
…
# fit a použití transformace
X_over, y_over = oversample.fit_resample(X, y)
|
To můžeme demonstrovat na jednoduchém syntetickém problému binární klasifikace s nevyvážeností tříd 1:100.
1
2
3
|
…
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
|
Kompletní příklad definování datasetu a provedení náhodného převzorkování pro vyvážení rozložení tříd je uveden níže.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# příklad náhodného převzorkování pro vyrovnání rozložení tříd
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)
# sumarizace rozdělení tříd
print(Counter(y))
# definujte strategii převzorkování
oversample = RandomOverSampler(sampling_strategy=’minority‘)
# fitujte a použijte transformaci
X_over, y_over = oversample.fit_resample(X, y)
# shrňte rozdělení tříd
print(Counter(y_over))
|
Spuštěním příkladu se nejprve vytvoří soubor dat a poté se shrne rozložení tříd. Vidíme, že ve většinové třídě je téměř 10 tisíc příkladů a v menšinové třídě 100 příkladů.
Poté se definuje transformace náhodného nadvýběru pro vyvážení menšinové třídy, poté se fituje a aplikuje na datovou sadu. Je uvedeno rozdělení tříd pro transformovaný soubor dat, které ukazuje, že nyní má menšinová třída stejný počet příkladů jako většinová třída.
1
2
|
Counter({0: 9900, 1: 100})
Counter({0: 9900, 1: 100}: 9900})
|
Tuto transformaci lze použít jako součást Pipeline, aby bylo zajištěno, že se použije pouze na trénovací datovou sadu v rámci každého rozdělení v k-násobném křížovém ověření.
Tradiční scikit-learn Pipeline nelze použít; místo toho lze použít Pipeline z knihovny imbalanced-learn. Například:
1
2
3
4
|
…
# pipeline
steps =
pipeline = Pipeline(steps=steps)
|
Následující příklad poskytuje kompletní ukázku vyhodnocení rozhodovacího stromu na nevyvážené množině dat s rozložením tříd 1:100.
Model je vyhodnocen pomocí opakované desetinásobné křížové validace se třemi opakováními, přičemž převzorkování je provedeno na trénovací množině dat v rámci každého opakování zvlášť, čímž je zajištěno, že nedojde k úniku dat, k němuž by mohlo dojít, kdyby bylo převzorkování provedeno před křížovou validací.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# příklad vyhodnocení rozhodovacího stromu s náhodným převzorkováním
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)
|
Spuštěním příkladu se vyhodnotí model rozhodovacího stromu na nevyváženém souboru dat s převzorkováním.
Zvolený model a konfigurace převzorkování jsou libovolné, navržené tak, aby poskytovaly šablonu, kterou můžete použít k testování podvzorkování s vaší sadou dat a učícím se algoritmem, spíše než k optimálnímu řešení syntetické sady dat.
Poznámka: Vaše výsledky se mohou lišit vzhledem ke stochastické povaze algoritmu nebo postupu vyhodnocení nebo rozdílům v číselné přesnosti. Zvažte několikeré spuštění příkladu a porovnejte průměrný výsledek.
Používá se výchozí strategie převzorkování, která vyrovnává menšinové třídy s většinovou třídou. Uvádí se F1 skóre zprůměrované pro každý fold a každé opakování.
1
|
F1 skóre: 0.990
|
Když už jsme se seznámili s převzorkováním, podívejme se na podvzorkování.
Náhodné podvzorkování nevyvážených souborů dat
Náhodné podvzorkování zahrnuje náhodný výběr příkladů z většinové třídy k odstranění z trénovacího souboru dat.
To má za následek snížení počtu příkladů ve většinové třídě v transformované verzi trénovacího souboru dat. Tento proces lze opakovat, dokud se nedosáhne požadovaného rozložení tříd, například stejného počtu příkladů pro každou třídu.
Tento přístup může být vhodnější pro ty soubory dat, kde existuje nerovnováha tříd, i když je dostatečný počet příkladů v menšinové třídě, takže lze napasovat užitečný model.
Omezením podvýběru je, že se odstraní příklady z většinové třídy, které mohou být užitečné, důležité nebo možná kritické pro napasování robustní rozhodovací hranice. Vzhledem k tomu, že příklady jsou odstraňovány náhodně, neexistuje způsob, jak odhalit nebo zachovat „dobré“ nebo informačně bohatší příklady z většinové třídy.
… při náhodném podvýběru je (potenciálně) vyřazeno obrovské množství dat. To může být velmi problematické, protože ztráta takových dat může ztížit učení rozhodovací hranice mezi menšinovými a většinovými případy, což vede ke ztrátě klasifikačního výkonu.
– Strana 45, Nevyvážené učení: Foundations, Algorithms, and Applications, 2013
Techniku náhodného podvzorkování lze implementovat pomocí třídy RandomUnderSampler imbalanced-learn.
Tuto třídu lze použít stejně jako třídu RandomOverSampler v předchozí části, s tím rozdílem, že strategie ovlivňují většinovou třídu místo menšinové. Například při nastavení argumentu sampling_strategy na hodnotu „majority“ dojde k podvzorkování většinové třídy určené třídou s největším počtem příkladů.
1
2
3
|
…
# define undersample strategy
undersample = RandomUnderSampler(sampling_strategy=’majority‘)
|
Například soubor dat s 1 000 příklady ve třídě majority a 100 příklady ve třídě minority bude podvzorkován tak, aby obě třídy měly v transformovaném trénovacím souboru dat 100 příkladů.
Můžeme také nastavit argument vzorkovací_strategie na hodnotu s pohyblivou desetinnou čárkou, což bude procento vzhledem k menšinové třídě, konkrétně počet příkladů v menšinové třídě dělený počtem příkladů ve většinové třídě. Pokud například nastavíme hodnotu sampling_strategy na 0,5 v nevyvážené datové sadě s 1 000 příklady ve většinové třídě a 100 příklady v menšinové třídě, pak bude v transformované datové sadě 200 příkladů pro většinovou třídu (nebo 100/200 = 0.5).
1
2
3
|
…
# define undersample strategy
undersample = RandomUnderSampler(sampling_strategy=0.5)
|
Tento postup by mohl být upřednostněn, aby bylo zajištěno, že výsledný soubor dat bude jednak dostatečně velký pro fitování rozumného modelu, jednak že nebude vyřazeno příliš mnoho užitečných informací z většinové třídy.
Při náhodném podvýběru se lze pokusit vytvořit vyvážené rozložení tříd tím, že se náhodně vybere 90 případů většinové třídy, které se odstraní. Výsledný soubor dat se pak bude skládat z 20 instancí:
– Strana 45, Nevyvážené učení: Foundations, Algorithms, and Applications, 2013
Transformaci pak lze přizpůsobit a aplikovat na soubor dat v jednom kroku zavoláním funkce fit_resample() a předáním netransformovaného souboru dat jako argumentů.
1
2
3
|
…
# fitování a použití transformace
X_over, y_over = undersample.fit_resample(X, y)
|
Tento postup můžeme demonstrovat na souboru dat s nevyvážeností tříd 1:100.
Kompletní příklad je uveden níže.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# příklad náhodného podvýběru pro vyvážení rozdělení tříd
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)
# sumarizace rozdělení tříd
print(Counter(y))
# definujte strategii podvýběru
undersample = RandomUnderSampler(sampling_strategy=’majority‘)
# fitujte a použijte transformaci
X_over, y_over = undersample.fit_resample(X, y)
# shrňte rozdělení tříd
print(Counter(y_over))
|
Spuštěním příkladu se nejprve vytvoří soubor dat a ohlásí se nevyvážené rozdělení tříd.
Transformace se fituje a aplikuje na soubor dat a ohlásí se nové rozdělení tříd. Vidíme, že tato většinová třída je podvzorkována tak, aby měla stejný počet příkladů jako menšinová třída.
Bude třeba použít úsudek a empirické výsledky, zda by k trénování modelu stačila trénovací datová sada s pouhými 200 příklady.
1
2
|
Counter({0: 9900, 1: 100})
Counter({0: 100, 1: 100})
|
Tuto transformaci s podvzorkováním lze také použít v potrubí Pipeline, stejně jako transformaci s převzorkováním z předchozí části.
To umožňuje použít transformaci pouze na trénovací soubor dat pomocí vyhodnocovacích schémat, jako je k-násobná křížová validace, čímž se zamezí jakémukoli úniku dat při vyhodnocování modelu.
1
2
3
4
|
…
# define pipeline
steps =
pipeline = Pipeline(steps=steps)
|
Můžeme definovat příklad fitování rozhodovacího stromu na nevyváženém souboru klasifikačních dat s transformací podvzorkování aplikovanou na trénovací soubor dat při každém rozdělení opakované 10násobné křížové validace.
Úplný příklad je uveden níže.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# příklad vyhodnocení rozhodovacího stromu s náhodným podvzorkováním
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)
|
Spuštěním příkladu se vyhodnotí model rozhodovacího stromu na nevyváženém souboru dat s podvzorkováním.
Zvolený model a konfigurace převzorkování jsou libovolné, navržené tak, aby poskytovaly šablonu, kterou můžete použít k testování podvzorkování s vaší sadou dat a učícím se algoritmem, spíše než k optimálnímu řešení syntetické sady dat.
Poznámka: Vaše výsledky se mohou lišit vzhledem ke stochastické povaze algoritmu nebo postupu vyhodnocení nebo k rozdílům v číselné přesnosti. Zvažte několikeré spuštění příkladu a porovnejte průměrný výsledek.
Používá se výchozí strategie podvzorkování, která vyrovnává většinové třídy s menšinovými. Uvádí se F1 skóre zprůměrované pro každý fold a každé opakování.
1
|
F1 skóre: 0.889
|
Kombinace náhodného převzorkování a podvzorkování
Zajímavých výsledků lze dosáhnout kombinací náhodného převzorkování i podvzorkování.
Například lze použít mírné množství převzorkování pro třídu menšin, aby se zlepšilo zkreslení vůči těmto příkladům, a zároveň použít mírné množství podvzorkování pro třídu většin, aby se snížilo zkreslení u této třídy.
To může vést ke zlepšení celkového výkonu ve srovnání s izolovaným prováděním jedné nebo druhé techniky.
Příklad pokud bychom měli soubor dat s rozložením tříd 1:100, mohli bychom nejprve použít převzorkování, abychom zvýšili poměr na 1:10 duplikováním příkladů z menšinové třídy, a poté použít podvzorkování, abychom dále zlepšili poměr na 1:2 odstraněním příkladů z většinové třídy.
Toto by se dalo realizovat pomocí nevyváženého učení tak, že by se použil RandomOverSampler s výběrovou_strategií nastavenou na 0,1 (10 %) a poté by se použil RandomUnderSampler s výběrovou_strategií nastavenou na 0,5 (50 %). Například:
1
2
3
4
5
6
7
8
9
|
…
# definovat strategii převzorkování
over = RandomOverSampler(sampling_strategy=0.1)
# fitovat a aplikovat transformaci
X, y = over.fit_resample(X, y)
# definovat strategii podvzorkování
under = RandomUnderSampler(sampling_strategy=0.5)
# fitování a použití transformace
X, y = under.fit_resample(X, y)
|
To můžeme demonstrovat na syntetické datové sadě s rozdělením tříd 1:100. Kompletní příklad je uveden níže:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# příklad kombinace náhodného převzorkování a podvzorkování pro nevyvážená data
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)
# sumarizace rozložení tříd
print(Counter(y))
# definujte strategii převzorkování
over = RandomOverSampler(sampling_strategy=0.1)
# fit a použijte transformaci
X, y = over.fit_resample(X, y)
# shrnutí rozdělení tříd
print(Counter(y))
# definujte strategii podvzorkování
under = RandomUnderSampler(sampling_strategy=0.5)
# fitujte a použijte transformaci
X, y = under.fit_resample(X, y)
# shrňte rozdělení třídy
print(Counter(y))
|
Při spuštění příkladu se nejprve vytvoří syntetická datová sada a shrne se rozložení tříd, přičemž se zobrazí rozložení tříd přibližně v poměru 1:100.
Poté se použije převzorkování, čímž se rozložení zvýší z přibližně 1:100 na přibližně 1:10.
Pak se provede převzorkování. Nakonec se použije podvzorkování, které dále zlepší rozložení tříd z 1:10 na přibližně 1:2
1
2
3
|
Counter({0: 9900, 1: 100})
Counter({0: 9900, 1: 990})
Counter({0: 1980, 1: 990})
|
Tentýž hybridní přístup můžeme chtít použít i při vyhodnocování modelu pomocí k-násobné křížové validace.
Toho lze dosáhnout použitím Pipeline s posloupností transformací a zakončením vyhodnocovaného modelu; např:
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)
|
To můžeme demonstrovat na modelu rozhodovacího stromu na stejné syntetické sadě dat.
Kompletní příklad je uveden níže.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# příklad vyhodnocení modelu s náhodným převzorkováním a podvzorkováním
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)
|
Příklad vyhodnocuje model rozhodovacího stromu pomocí opakované k-násobné křížové validace, kdy je trénovací soubor dat transformován nejprve pomocí převzorkování a poté podvzorkování pro každé provedené rozdělení a opakování. Uvádí se skóre F1 zprůměrované pro každé rozdělení a každé opakování.
Poznámka: Vaše výsledky se mohou lišit vzhledem ke stochastické povaze algoritmu nebo postupu vyhodnocení nebo k rozdílům v číselné přesnosti. Zvažte několikeré spuštění příkladu a porovnejte průměrný výsledek.
Zvolený model a konfigurace převzorkování jsou libovolné, navržené tak, aby poskytovaly šablonu, kterou můžete použít k testování podvzorkování s vaší sadou dat a učícím algoritmem, spíše než k optimálnímu řešení syntetické sady dat.
1
|
F1 Skóre: 0.985
|
Další literatura
Tato část obsahuje další zdroje k tématu, pokud chcete jít hlouběji.
Knihy
- Kapitola 5 Metody předzpracování na úrovni dat, učení z nevyvážených souborů dat, 2018.
- Kapitola 3 Nevyvážené soubory dat: From Sampling to Classifiers, Imbalanced Learning:
Papers
- A Study Of Behavior Of Several Methods For Balancing Machine Learning Training Data, 2004.
- A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
API
- Dokumentace nevyváženého učení.
- imbalanced-learn, GitHub.
- imblearn.over_sampling.RandomOverSampler API.
- imblearn.pipeline.Pipeline API.
- imblearn.under_sampling.RandomUnderSampler API.
Články
- Oversampling a undersampling při analýze dat, Wikipedia.
Shrnutí
V tomto tutoriálu jste objevili náhodné převzorkování a podvzorkování pro nevyváženou klasifikaci
Konkrétně jste se dozvěděli:
- Náhodné převzorkování poskytuje naivní techniku pro vyrovnání rozložení tříd u nevyváženého souboru dat.
- Náhodné převzorkování duplikuje příklady z menšinové třídy v trénovací datové sadě a u některých modelů může vést k nadměrnému přizpůsobení.
- Náhodné podvzorkování odstraňuje příklady z většinové třídy a může vést ke ztrátě informací, které jsou pro model neocenitelné.
Máte nějaké dotazy?
Pokládejte své dotazy v komentářích níže a já se budu snažit odpovědět.
Získejte přehled o nevyvážené klasifikaci!
Vyvíjejte modely nevyváženého učení během několika minut
…s pouhými několika řádky kódu v Pythonu
Objevte, jak na to, v mé nové elektronické knize:
Nevyvážená klasifikace s Pythonem
Nabízí samostudijní návody a ucelené projekty na téma:
Metriky výkonnosti, metody podvzorkování, SMOTE, přesouvání prahových hodnot, pravděpodobnostní kalibrace, nákladově citlivé algoritmy
a mnoho dalšího….
Zavedení nevyvážených klasifikačních metod do vašich projektů strojového učení
Podívejte se, co je uvnitř
.