Supraeșantionare și subeșantionare aleatorie pentru clasificarea dezechilibrată

Tweet Share Share

Ultima actualizare la 5 ianuarie 2021

Seturile de date dezechilibrate sunt cele în care există o înclinație severă în distribuția claselor, cum ar fi 1:100 sau 1:1000 de exemple în clasa minoritară față de clasa majoritară.

Acest dezechilibru în setul de date de instruire poate influența mulți algoritmi de învățare automată, determinându-i pe unii să ignore complet clasa minoritară. Aceasta este o problemă deoarece, de obicei, clasa minoritară este cea asupra căreia predicțiile sunt cele mai importante.

O abordare pentru a aborda problema dezechilibrului de clasă este re-eșantionarea aleatorie a setului de date de instruire. Cele două abordări principale pentru reeșantionarea aleatorie a unui set de date dezechilibrat sunt ștergerea exemplelor din clasa majoritară, numită subeșantionare, și dublarea exemplelor din clasa minoritară, numită supraeșantionare.

În acest tutorial, veți descoperi supraeșantionarea și subeșantionarea aleatorie pentru clasificarea dezechilibrată

După terminarea acestui tutorial, veți ști:

  • Reeșantionarea aleatorie oferă o tehnică naivă de reechilibrare a distribuției claselor pentru un set de date dezechilibrat.
  • Supraeșantionarea aleatorie dublează exemplele din clasa minoritară în setul de date de instruire și poate duce la supraadaptare pentru unele modele.
  • Subeșantionarea aleatorie șterge exemplele din clasa majoritară și poate duce la pierderea unor informații neprețuite pentru un model.

Dă startul proiectului tău cu noua mea carte Imbalanced Classification with Python, care include tutoriale pas cu pas și fișierele de cod sursă Python pentru toate exemplele.

Să începem.

  • Actualizat în ianuarie/2021: Link-uri actualizate pentru documentația API.
Random Oversampling and Undersampling for Imbalanced Classification

Random Oversampling and Undersampling for Imbalanced Classification
Fotografie de RichardBH, unele drepturi rezervate.

Tutorial Overview

Acest tutorial este împărțit în cinci părți; acestea sunt:

  1. Reșantionarea aleatoare a seturilor de date dezechilibrate
  2. Imbalansarea…Learn Library
  3. Random Oversampling Imbalanced Datasets
  4. Random Undersampling Imbalanced Datasets
  5. Combining Random Oversampling and Undersampling

Random Resampling Imbalanced Datasets

Reampling presupune crearea unei noi versiuni transformate a setului de date de instruire în care exemplele selectate au o distribuție diferită a claselor.

Aceasta este o strategie simplă și eficientă pentru problemele de clasificare dezechilibrată.

Aplicarea strategiilor de reeșantionare pentru a obține o distribuție mai echilibrată a datelor este o soluție eficientă la problema dezechilibrului

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

Cea mai simplă strategie constă în alegerea aleatorie a exemplelor pentru setul de date transformat, numită reeșantionare aleatorie.

Există două abordări principale de reeșantionare aleatorie pentru clasificarea dezechilibrată; acestea sunt supraeșantionarea și subeșantionarea.

  • Random Oversampling: Duplicarea aleatorie a exemplelor din clasa minoritară.
  • Subeșantionare aleatorie: Eliminarea aleatorie a exemplelor din clasa majoritară.

Supraeșantionarea aleatorie implică selectarea aleatorie a exemplelor din clasa minoritară, cu înlocuire, și adăugarea lor la setul de date de instruire. Subeșantionarea aleatorie implică selectarea aleatorie a exemplelor din clasa majoritară și ștergerea lor din setul de date de instruire.

În subeșantionarea aleatorie, exemplele din clasa majoritară sunt eliminate la întâmplare până când se ajunge la o distribuție mai echilibrată.

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

Ambele abordări pot fi repetate până când se obține distribuția dorită a claselor în setul de date de instruire, cum ar fi o împărțire egală între clase.

Acestea sunt denumite metode de „reeșantionare naivă” deoarece nu presupun nimic despre date și nu se utilizează nicio euristică. Acest lucru le face simplu de implementat și rapid de executat, ceea ce este de dorit pentru seturi de date foarte mari și complexe.

Ambele tehnici pot fi utilizate pentru probleme de clasificare în două clase (binare) și probleme de clasificare în mai multe clase cu una sau mai multe clase majoritare sau minoritare.

Important este faptul că modificarea distribuției claselor se aplică numai la setul de date de instruire. Intenția este de a influența ajustarea modelelor. Reeșantionarea nu se aplică setului de date de testare sau de reținere utilizat pentru a evalua performanța unui model.

În general, aceste metode naive pot fi eficiente, deși acest lucru depinde de specificul setului de date și al modelelor implicate.

Să aruncăm o privire mai atentă asupra fiecărei metode și a modului de utilizare a acestora în practică.

Biblioteca imbalanced-Learn

În aceste exemple, vom folosi implementările furnizate de biblioteca Python imbalanced-learn, care poate fi instalată prin pip după cum urmează:

1
sudo pip install imbalanced-learn

Puteți confirma că instalarea a avut succes prin imprimarea versiunii bibliotecii instalate:

1
2
3

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

Executarea exemplului va imprima numărul de versiune al bibliotecii instalate; de exemplu:

1
0.5.0

Vrei să începi cu clasificarea dezechilibrelor?

Fă acum cursul meu rapid gratuit de 7 zile prin e-mail (cu cod de probă).

Click pentru a vă înscrie și pentru a obține, de asemenea, o versiune gratuită a cursului în format PDF Ebook.

Download Your FREE Mini-Course

Random Oversampling Imbalanced Datasets

Random oversampling implică duplicarea aleatorie a exemplelor din clasa minoritară și adăugarea lor la setul de date de instruire.

Exemplele din setul de date de instruire sunt selectate aleatoriu cu înlocuire. Acest lucru înseamnă că exemplele din clasa minoritară pot fi alese și adăugate la noul set de date de instruire „mai echilibrat” de mai multe ori; acestea sunt selectate din setul de date de instruire original, adăugate la noul set de date de instruire și apoi returnate sau „înlocuite” în setul de date original, permițându-le să fie selectate din nou.

Această tehnică poate fi eficientă pentru acei algoritmi de învățare automată care sunt afectați de o distribuție înclinată și în cazul în care mai multe exemple duplicate pentru o anumită clasă pot influența ajustarea modelului. Aceasta ar putea include algoritmi care învață iterativ coeficienții, cum ar fi rețelele neuronale artificiale care utilizează coborârea gradientului stocastic. De asemenea, poate afecta modelele care caută împărțiri bune ale datelor, cum ar fi mașinile vectoriale de suport și arborii de decizie.

Ar putea fi utilă reglarea distribuției clasei țintă. În unele cazuri, căutarea unei distribuții echilibrate pentru un set de date puternic dezechilibrat poate determina algoritmii afectați să supraadapteze clasa minoritară, ceea ce duce la o eroare de generalizare crescută. Efectul poate fi o performanță mai bună pe setul de date de instruire, dar o performanță mai slabă pe setul de date de reținere sau de testare.

… supraeșantionarea aleatorie poate crește probabilitatea apariției supraadaptării, deoarece realizează copii exacte ale exemplelor clasei minoritare. În acest fel, un clasificator simbolic, de exemplu, ar putea construi reguli care sunt aparent exacte, dar care, de fapt, acoperă un singur exemplu replicat.

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

Ca atare, pentru a înțelege mai bine impactul metodei, este o idee bună să se monitorizeze performanța atât pe seturile de date de antrenament, cât și pe setul de date de testare după supraeșantionare și să se compare rezultatele cu cele ale aceluiași algoritm pe setul de date original.

Creșterea numărului de exemple pentru clasa minoritară, în special dacă distorsiunea clasei a fost severă, poate duce, de asemenea, la o creștere marcantă a costului de calcul atunci când se ajustează modelul, mai ales având în vedere că modelul vede aceleași exemple în setul de date de instruire din nou și din nou.

… în supraeșantionarea aleatorie, un set aleatoriu de copii ale exemplelor din clasa minoritară este adăugat la date. Acest lucru poate crește probabilitatea de supraadaptare, în special pentru rate de supraeșantionare mai mari. În plus, poate scădea performanța clasificatorului și poate crește efortul de calcul.

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

Supraeșantionarea aleatorie poate fi implementată utilizând clasa RandomOverSampler.

Clasa poate fi definită și primește un argument sampling_strategy care poate fi setat la „minority” pentru a echilibra automat clasa minoritară cu clasa sau clasele majoritare.

De exemplu:

1
2
3

# definește strategia de supraeșantionare
oversample = RandomOverSampler(sampling_strategy=’minority’)

Aceasta înseamnă că, dacă clasa majoritară are 1.000 de exemple și clasa minoritară are 100, această strategie ar supraeșantiona clasa minoritară astfel încât să aibă 1.000 de exemple.

Se poate specifica o valoare în virgulă mobilă pentru a indica raportul dintre exemplele majoritare ale clasei minoritare din setul de date transformat. De exemplu:

1
2
3

# definește strategia de supraeșantionare
oversample = RandomOverSampler(sampling_strategy=0.5)

Aceasta ar asigura că clasa minoritară a fost supraeșantionată pentru a avea jumătate din numărul de exemple față de clasa majoritară, pentru probleme de clasificare binară. Acest lucru înseamnă că, dacă clasa majoritară avea 1.000 de exemple și clasa minoritară avea 100, setul de date transformat ar avea 500 de exemple din clasa minoritară.

Clasa este ca un obiect de transformare scikit-learn în sensul că se potrivește pe un set de date, apoi se utilizează pentru a genera un set de date nou sau transformat. Spre deosebire de transformările scikit-learn, aceasta va schimba numărul de exemple din setul de date, nu doar valorile (ca un scalator) sau numărul de caracteristici (ca o proiecție).

De exemplu, poate fi ajustată și aplicată într-un singur pas prin apelarea funcției fit_sample():

1
2
3

# potriviți și aplicați transformarea
X_over, y_over = oversample.fit_resample(X, y)

Puteți demonstra acest lucru pe o problemă simplă de clasificare binară sintetică cu un dezechilibru de clasă de 1:100.

1
2
3

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

Exemplul complet de definire a setului de date și de efectuare a supraeșantionării aleatorii pentru a echilibra distribuția claselor este prezentat mai jos.

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

# exemplu de supraeșantionare aleatorie pentru a echilibra distribuția claselor
din collections import Counter
din sklearn.datasets import make_classification
> from imblearn.over_sampling import RandomOverSampler
# define dataset
> X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# rezumă distribuția claselor
> print(Counter(y))
# definiți strategia de supraeșantionare
oversample = RandomOverSampler(sampling_strategy=’minority’)
# ajustați și aplicați transformarea
> X_over, y_over = oversample.fit_resample(X, y)
# rezumați distribuția clasei
print(Counter(y_over))

Executarea exemplului creează mai întâi setul de date, apoi rezumă distribuția pe clase. Putem vedea că există aproape 10K de exemple în clasa majoritară și 100 de exemple în clasa minoritară.

Apoi se definește transformarea aleatorie de supraeșantionare pentru a echilibra clasa minoritară, apoi se ajustează și se aplică la setul de date. Se raportează distribuția claselor pentru setul de date transformat, arătând că acum clasa minoritară are același număr de exemple ca și clasa majoritară.

1
2

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

Această transformare poate fi utilizată ca parte a unui Pipeline pentru a se asigura că este aplicată numai setului de date de instruire ca parte a fiecărei diviziuni într-o validare încrucișată k-fold.

Nu poate fi utilizat un Pipeline scikit-learn tradițional; în schimb, poate fi utilizat un Pipeline din biblioteca imbalanced-learn. De exemplu:

1
2
3
4

# pipeline
pași =
pipeline = Pipeline(steps=steps)

Exemplul de mai jos oferă un exemplu complet de evaluare a unui arbore de decizie pe un set de date dezechilibrat cu o distribuție a claselor de 1:100.

Modelul este evaluat folosind o validare încrucișată repetată de 10 ori cu trei repetări, iar supraeșantionarea este efectuată pe setul de date de instruire în cadrul fiecărei pliuri separat, asigurându-se că nu există nicio scurgere de date, așa cum ar putea apărea dacă supraeșantionarea ar fi efectuată înainte de validarea încrucișată.

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

# exemplu de evaluare a unui arbore de decizie cu supraeșantionare aleatorie
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)

Executarea exemplului evaluează modelul arborelui de decizie pe setul de date dezechilibrat cu supraeșantionare.

Modelul ales și configurația de reeșantionare sunt arbitrare, concepute pentru a oferi un șablon pe care îl puteți utiliza pentru a testa subeșantionarea cu setul dvs. de date și algoritmul de învățare, mai degrabă decât pentru a rezolva în mod optim setul de date sintetic.

Nota: Rezultatele dvs. pot varia, având în vedere natura stocastică a algoritmului sau a procedurii de evaluare, sau diferențele de precizie numerică. Luați în considerare rularea exemplului de câteva ori și comparați rezultatul mediu.

Se utilizează strategia implicită de supraeșantionare, care echilibrează clasele minoritare cu clasa majoritară. Se raportează scorul F1 calculat ca medie pentru fiecare pliu și fiecare repetare.

1
Scorul F1: 0.990

Acum că suntem familiarizați cu supraeșantionarea, haideți să aruncăm o privire la subeșantionare.

Subeșantionarea aleatorie a seturilor de date dezechilibrate

Subeșantionarea aleatorie implică selectarea aleatorie a exemplelor din clasa majoritară pentru a le șterge din setul de date de instruire.

Acest lucru are ca efect reducerea numărului de exemple din clasa majoritară în versiunea transformată a setului de date de instruire. Acest proces poate fi repetat până când se obține distribuția dorită a claselor, cum ar fi un număr egal de exemple pentru fiecare clasă.

Această abordare poate fi mai potrivită pentru acele seturi de date în care există un dezechilibru al claselor, deși există un număr suficient de exemple în clasa minoritară, astfel încât să poată fi ajustat un model util.

O limitare a subeșantionării este aceea că sunt șterse exemple din clasa majoritară care pot fi utile, importante sau poate critice pentru ajustarea unei limite de decizie robuste. Având în vedere că exemplele sunt eliminate în mod aleatoriu, nu există nicio modalitate de a detecta sau de a păstra exemplele „bune” sau mai bogate în informații din clasa majoritară.

… în subeșantionarea aleatorie (potențial), sunt eliminate cantități mari de date. Acest lucru poate fi extrem de problematic, deoarece pierderea unor astfel de date poate face ca granița de decizie între instanțele minoritare și majoritare să fie mai greu de învățat, ceea ce duce la o pierdere a performanței de clasificare.

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

Tehnica de subeșantionare aleatorie poate fi implementată cu ajutorul clasei RandomUnderSampler imbalanced-learn.

Clasa poate fi utilizată la fel ca și clasa RandomOverSampler din secțiunea anterioară, cu excepția faptului că strategiile au impact asupra clasei majoritare în loc de clasa minoritară. De exemplu, setarea argumentului sampling_strategy la „majority” va subeșantiona clasa majoritară determinată de clasa cu cel mai mare număr de exemple.

1
2
3

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

De exemplu, un set de date cu 1.000 de exemple în clasa majoritară și 100 de exemple în clasa minoritară va fi subeșantionat astfel încât ambele clase să aibă 100 de exemple în setul de date de instruire transformat.

De asemenea, putem seta argumentul sampling_strategy la o valoare în virgulă mobilă care va fi un procent în raport cu clasa minoritară, mai exact numărul de exemple din clasa minoritară împărțit la numărul de exemple din clasa majoritară. De exemplu, dacă setăm sampling_strategy la 0,5 într-un set de date dezechilibrat cu 1 000 de exemple în clasa majoritară și 100 de exemple în clasa minoritară, atunci vor exista 200 de exemple pentru clasa majoritară în setul de date transformat (sau 100/200 = 0.5).

1
2
3

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

Aceasta ar putea fi preferată pentru a se asigura că setul de date rezultat este atât suficient de mare pentru a se potrivi unui model rezonabil, cât și că nu sunt eliminate prea multe informații utile din clasa majoritară.

În cazul unei subeșantionări aleatorii, se poate încerca crearea unei distribuții echilibrate a claselor prin selectarea aleatorie a 90 de instanțe ale clasei majoritare pentru a fi eliminate. Setul de date rezultat va consta atunci din 20 de instanțe: 10 instanțe ale clasei majoritare (rămase la întâmplare) și (cele 10 instanțe originale) ale clasei minoritare.

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

Transformarea poate fi apoi ajustată și aplicată unui set de date într-un singur pas prin apelarea funcției fit_resample() și trecerea setului de date netransformat ca argumente.

1
2
3

# fit and apply the transform
X_over, y_over = undersample.fit_resample(X, y)

Potem demonstra acest lucru pe un set de date cu un dezechilibru de clasă de 1:100.

Exemplul complet este prezentat mai jos.

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

# exemplu de subeșantionare aleatorie pentru a echilibra distribuția clasei
din collections import Counter
din sklearn.datasets import make_classification
> from imblearn.under_sampling import RandomUnderSampler
# define dataset
> X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# rezumă distribuția claselor
> print(Counter(y))
# definiți strategia de subeșantionare
undersample = RandomUnderSampler(sampling_strategy=’majority’)
# ajustați și aplicați transformarea
> X_over, y_over = undersample.fit_resample(X, y)
# rezumați distribuția clasei
print(Counter(y_over))

Executarea exemplului creează mai întâi setul de date și raportează distribuția dezechilibrată a claselor.

Transformarea este ajustată și aplicată pe setul de date și este raportată noua distribuție a claselor. Putem observa că acea clasă majoritară este subeșantionată pentru a avea același număr de exemple ca și clasa minoritară.

Judecata și rezultatele empirice vor trebui să fie folosite pentru a stabili dacă un set de date de instruire cu doar 200 de exemple ar fi suficient pentru a instrui un model.

1
2

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

Această transformare de subeșantionare poate fi, de asemenea, utilizată într-un Pipeline, ca și transformarea de supraeșantionare din secțiunea anterioară.

Aceasta permite ca transformarea să fie aplicată doar la setul de date de instruire folosind scheme de evaluare cum ar fi validarea încrucișată k-fold, evitând orice scurgere de date în evaluarea unui model.

1
2
3
4

# define pipeline
pași =
pipeline = Pipeline(steps=steps)

Potem defini un exemplu de ajustare a unui arbore de decizie pe un set de date de clasificare dezechilibrată cu transformarea de subeșantionare aplicată setului de date de instruire la fiecare divizare a unei validări încrucișate repetate de 10 ori.

Exemplul complet este prezentat mai jos.

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

# exemplu de evaluare a unui arbore de decizie cu subeșantionare aleatorie
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)

Executarea exemplului evaluează modelul arborelui de decizie pe setul de date dezechilibrat cu subeșantionare.

Modelul ales și configurația de reeșantionare sunt arbitrare, concepute pentru a oferi un șablon pe care îl puteți utiliza pentru a testa subeșantionarea cu setul dvs. de date și algoritmul de învățare, mai degrabă decât pentru a rezolva în mod optim setul de date sintetic.

Nota: Rezultatele dvs. pot varia având în vedere natura stocastică a algoritmului sau a procedurii de evaluare, sau diferențele de precizie numerică. Luați în considerare rularea exemplului de câteva ori și comparați rezultatul mediu.

Se utilizează strategia implicită de subeșantionare, care echilibrează clasele majoritare cu cele minoritare. Se raportează scorul F1 calculat ca medie pentru fiecare pliu și fiecare repetare.

1
Scorul F1: 0.889

Combinarea supraeșantionării și subeșantionării aleatorii

Se pot obține rezultate interesante prin combinarea atât a supraeșantionării cât și a subeșantionării aleatorii.

De exemplu, o cantitate modestă de supraeșantionare poate fi aplicată clasei minoritare pentru a îmbunătăți tendința spre aceste exemple, în timp ce se aplică, de asemenea, o cantitate modestă de subeșantionare clasei majoritare pentru a reduce tendința asupra acestei clase.

Aceasta poate duce la îmbunătățirea performanței generale în comparație cu efectuarea uneia sau a celeilalte tehnici în mod izolat.

De exemplu, dacă am avea un set de date cu o distribuție a claselor de 1:100, am putea aplica mai întâi supraeșantionarea pentru a crește raportul la 1:10 prin duplicarea exemplelor din clasa minoritară, apoi am putea aplica subeșantionarea pentru a îmbunătăți și mai mult raportul la 1:2 prin ștergerea exemplelor din clasa majoritară.

Acest lucru ar putea fi implementat folosind imbalanced-learn prin utilizarea unui RandomOverSampler cu sampling_strategy setat la 0,1 (10%), apoi prin utilizarea unui RandomUnderSampler cu un sampling_strategy setat la 0,5 (50%). De exemplu:

1
2
3
4
5
6
7
8
9

# definiți strategia de supraeșantionare
> over = RandomOverSampler(sampling_strategy=0.1)
# ajustați și aplicați transformarea
> X, y = over.fit_resample(X, y)
# definiți strategia de subeșantionare
> under = RandomUnderSampler(sampling_strategy=0.5)
# ajustați și aplicați transformarea
X, y = under.fit_resample(X, y)

Puteți demonstra acest lucru pe un set de date sintetice cu o distribuție a claselor 1:100. Exemplul complet este prezentat mai jos:

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

# exemplu de combinare a supraeșantionării și subeșantionării aleatorii pentru date dezechilibrate
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_samampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# summarize class distribution
print(Counter(y))
# definiți strategia de supraeșantionare
over = RandomOverSampler(sampling_strategy=0.1)
# ajustați și aplicați transformarea
> X, y = over.fit_resample(X, y)
# rezumați distribuția pe clase
print(Counter(y))
# definiți strategia de subeșantionare
under = RandomUnderSampler(sampling_strategy=0.5)
# ajustați și aplicați transformarea
> X, y = under.fit_resample(X, y)
# rezumați distribuția clasei
print(Counter(y))

Executarea exemplului creează mai întâi setul de date sintetice și rezumă distribuția claselor, arătând o distribuție a claselor de aproximativ 1:100.

Apoi se aplică supraeșantionarea, mărind distribuția de la aproximativ 1:100 la aproximativ 1:10. În cele din urmă, se aplică subeșantionarea, îmbunătățind și mai mult distribuția claselor de la 1:10 la aproximativ 1:2

1
2
3

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

Am putea dori, de asemenea, să aplicăm aceeași abordare hibridă atunci când evaluăm un model utilizând validarea încrucișată k-fold.

Acest lucru poate fi realizat prin utilizarea unui Pipeline cu o secvență de transformări și care se termină cu modelul care este evaluat; de exemplu:

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)

Potem demonstra acest lucru cu un model de arbore de decizie pe același set de date sintetice.

Exemplul complet este prezentat mai jos.

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

# exemplu de evaluare a unui model cu supraeșantionare și subeșantionare aleatoare
din numpy import mean
din 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.over_sampling
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
# define pipeline
# define pipeline
over = RandomOverSampler(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
pași =
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)

Executarea exemplului evaluează un model de arbore de decizie folosind validarea încrucișată repetată k-fold în care setul de date de instruire este transformat, mai întâi folosind supraeșantionare, apoi subeșantionare, pentru fiecare divizare și repetare efectuată. Se raportează scorul F1 calculat ca medie pentru fiecare pliere și fiecare repetare.

Nota: Rezultatele dumneavoastră pot varia având în vedere natura stocastică a algoritmului sau a procedurii de evaluare, sau diferențele de precizie numerică. Luați în considerare rularea exemplului de câteva ori și comparați rezultatul mediu.

Modelul ales și configurația de reeșantionare sunt arbitrare, concepute pentru a oferi un șablon pe care îl puteți utiliza pentru a testa subeșantionarea cu setul dvs. de date și algoritmul de învățare, mai degrabă decât pentru a rezolva în mod optim setul de date sintetice.

1
F1 Scor: 0.985

Further Reading

Această secțiune oferă mai multe resurse pe această temă, dacă doriți să aprofundați.

Cărți

  • Capitolul 5 Data Level Preprocessing Methods, Learning from Imbalanced Data Sets, 2018.
  • Capitolul 3 Imbalanced Datasets: De la eșantionare la clasificatori, 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.
  • 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.
  • imblearn.under_sampling.RandomUnderSampler API.

Articole

  • Supraeșantionare și subeșantionare în analiza datelor, Wikipedia.

Rezumat

În acest tutorial, ați descoperit supraeșantionarea și subeșantionarea aleatorie pentru clasificarea dezechilibrată

În mod specific, ați învățat:

  • Reamplasarea aleatorie oferă o tehnică naivă pentru reechilibrarea distribuției claselor pentru un set de date dezechilibrat.
  • Supraeșantionarea aleatorie duplică exemplele din clasa minoritară în setul de date de instruire și poate duce la supraadaptare pentru unele modele.
  • Subeșantionarea aleatorie șterge exemple din clasa majoritară și poate duce la pierderea unor informații neprețuite pentru un model.

Aveți întrebări?
Puneți întrebările dumneavoastră în comentariile de mai jos și voi face tot posibilul să vă răspund.

Descoperiți clasificarea dezechilibrată!

Clasificarea dezechilibrată cu Python

Dezvoltați modele de învățare dezechilibrată în câteva minute

…cu doar câteva linii de cod python

Descoperiți cum în noul meu Ebook:
Imbalanced Classification with Python

Acesta oferă tutoriale de autoinstruire și proiecte end-to-end pe:
Performance Metrics, Undersampling Methods, SMOTE, Threshold Moving, Probability Calibration, Cost-Sensitive Algorithms
și multe altele….

Aduceți metode de clasificare dezechilibrată în proiectele dvs. de învățare automată

Vedeți ce conține

Tweet Share Share Share

Lasă un răspuns

Adresa ta de email nu va fi publicată.