Viimeisin päivitetty 5.1.2021
Epäsymmetriset tietokokonaisuudet ovat tietokokonaisuuksia, joissa luokkajakaumassa on vakava vinouma, esimerkiksi 1:100 tai 1:1000 esimerkkiä vähemmistöluokassa suhteessa enemmistöluokkaan.
Tämä harha koulutustietoaineistossa voi vaikuttaa moniin koneoppimisalgoritmeihin, jolloin jotkut jättävät vähemmistöluokan kokonaan huomiotta. Tämä on ongelma, koska tyypillisesti juuri vähemmistöluokka on se, jota koskevat ennusteet ovat tärkeimpiä.
Yksi lähestymistapa luokkien epätasapainon ongelman ratkaisemiseen on harjoitusaineiston satunnainen uudelleennäytteenotto. Kaksi tärkeintä lähestymistapaa epätasapainoisen tietokokonaisuuden satunnaiseen uudelleennäytteenottoon ovat esimerkkien poistaminen enemmistöluokasta, jota kutsutaan alinäytteenotoksi, ja esimerkkien monistaminen vähemmistöluokasta, jota kutsutaan ylinäytteenotoksi.
Tässä opetusohjelmassa tutustut satunnaiseen ylinäytteenottoon ja alinäytteenottoon epätasapainoisessa luokittelussa
Tämän opetusohjelman suoritettuasi osaat:
- Sattumanvarainen uusintanäytteenotto tarjoaa naiivin tekniikan epätasapainoisen tietokokonaisuuden luokkajakauman tasapainottamiseen uudelleen.
- Sattumanvarainen ylinäytteenotto päällekkäistää esimerkkejä vähemmistöluokasta harjoitusaineistossa ja voi johtaa joidenkin mallien ylisovittamiseen.
- Sattumanvarainen alinäytteenotto poistaa esimerkkejä enemmistöluokasta ja voi johtaa mallin kannalta korvaamattoman arvokkaan informaation menetykseen.
Käynnistä projektisi uudella kirjallani Epätasapainoinen luokittelu Pythonilla, joka sisältää vaiheittaiset opetusohjelmat ja Python-lähdekooditiedostot kaikille esimerkeille.
Aloitetaan.
- Päivitetty tammi/2021: Päivitetyt linkit API-dokumentaatioon.
Random Oversampling and Undersampling for Imbalanced Classification
Kuva: RichardBH, jotkin oikeudet pidätetään.
- Ohjeen yleiskatsaus
- Random Resampling Imbalanced Datasets
- Imbalanced-Learn-kirjasto
- Want to Get Started With Imbalance Classification?
- Sattumanvarainen ylinäytteenotto epätasapainoisista aineistoista
- Sattumanvarainen alinäytteenotto epätasapainoisista aineistoista
- Sattumanvaraisen yli- ja alinäytteenoton yhdistäminen
- Lisälukemista
- Kirjat
- Papers
- API
- Artikkelit
- Yhteenveto
- Ota käsiksi epätasapainotettuun luokitteluun!
- Kehitä epätasapainotetun oppimisen malleja muutamassa minuutissa
- Bring Imbalanced Classification Methods to Your Machine Learning Projects
Ohjeen yleiskatsaus
Tämä ohje on jaettu viiteen osaan; ne ovat:
- Random Resampling Imbalanced Datasets
- Imbalanced-Learn Library
- Random Oversampling Imbalanced Datasets
- Random Undersampling Imbalanced Datasets
- Combining Random Oversampling and Undersampling
Random Resampling Imbalanced Datasets
Uusinäytteenotossa luodaan harjoittelutietokannasta uusi muunnettu versio, jossa valituilla esimerkeillä on erilainen luokkajakauma.
Tämä on yksinkertainen ja tehokas strategia epätasapainossa oleviin luokitusongelmiin.
Resampling-strategioiden soveltaminen tasapainoisemman datajakauman saamiseksi on tehokas ratkaisu epätasapaino-ongelmaan
– A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
Yksinkertaisin strategia on valita esimerkit muunnettuun aineistoon satunnaisesti, jota kutsutaan satunnaiseksi uudelleennäytteenotoksi.
Satunnaiseen uudelleennäytteenottoon epätasapainoisessa luokittelussa on kaksi pääasiallista lähestymistapaa; ne ovat ylinäytteenotto (oversampling) ja alinäytteenotto (undersampling).
- Random Oversampling: Monistetaan satunnaisesti esimerkkejä vähemmistöluokassa.
- Satunnainen alinäytteenotto: Poistetaan satunnaisesti esimerkkejä enemmistöluokasta.
Sattumanvaraisessa ylinäytteistämisessä valitaan satunnaisesti esimerkkejä vähemmistöluokasta korvaavasti ja lisätään ne harjoitusaineistoon. Satunnaisessa alivalinnassa valitaan satunnaisesti esimerkkejä enemmistöluokasta ja poistetaan ne harjoitusaineistosta.
Satunnaisessa alivalinnassa enemmistöluokan instansseja hylätään satunnaisesti, kunnes saavutetaan tasapainoisempi jakauma.
– Sivu 45, Epätasapainoinen oppiminen: Foundations, Algorithms, and Applications, 2013
Kahta lähestymistapaa voidaan toistaa, kunnes harjoitusaineistossa saavutetaan haluttu luokkajakauma, kuten tasainen jakauma luokkien välillä.
Menetelmiä kutsutaan ”naiiveiksi uudelleennäytteenottomenetelmiksi” (naive resampling), koska niissä ei oleteta mitään aineistosta eikä käytetä mitään heuristiikkaa. Tämän vuoksi ne ovat yksinkertaisia toteuttaa ja nopeita toteuttaa, mikä on toivottavaa hyvin suurissa ja monimutkaisissa tietokokonaisuuksissa.
Kahta tekniikkaa voidaan käyttää kahden luokan (binäärinen) luokitusongelmiin ja moniluokkaisiin luokitusongelmiin, joissa on yksi tai useampi enemmistö- tai vähemmistöluokka.
Tärkeää on se, että luokkajakauman muutosta sovelletaan vain harjoitustietokokonaisuuteen. Tarkoituksena on vaikuttaa mallien sopivuuteen. Uudelleen näytteenottoa ei sovelleta testi- tai pidätystietoaineistoon, jota käytetään mallin suorituskyvyn arvioimiseen.
Yleisesti nämä naiivit menetelmät voivat olla tehokkaita, vaikka se riippuukin kyseessä olevan aineiston ja mallien erityispiirteistä.
Katsotaanpa tarkemmin kutakin menetelmää ja sitä, miten niitä käytetään käytännössä.
Imbalanced-Learn-kirjasto
Näissä esimerkeissä käytämme imbalanced-learn Python-kirjaston tarjoamia toteutuksia, jotka voi asentaa pipin kautta seuraavasti:
1
|
sudo pip install imbalanced-learn
|
Voit varmistaa asennuksen onnistumisen tulostamalla asennetun kirjaston version:
1
2
3
|
# tarkista versionumero
import imblearn
print(imblearn.__version__)
|
Esimerkin suorittaminen tulostaa asennetun kirjaston versionumeron; esim:
1
|
0.5.0
|
Want to Get Started With Imbalance Classification?
Take my free 7-day email crash course now (with sample code).
Klikkaa ilmoittautuaksesi ja saat myös ilmaisen PDF-kirjaversion kurssista.
Lataa ILMAINEN minikurssisi
Sattumanvarainen ylinäytteenotto epätasapainoisista aineistoista
Sattumanvarainen ylinäytteenotto tarkoittaa, että vähemmistöluokan esimerkit kopioidaan sattumanvaraisesti ja lisätään harjoitusaineistoon.
Esimerkit harjoitusaineistosta valitaan sattumanvaraisesti korvaavasti. Tämä tarkoittaa, että vähemmistöluokan esimerkkejä voidaan valita ja lisätä uuteen ”tasapainoisempaan” koulutustietokantaan useita kertoja; ne valitaan alkuperäisestä koulutustietokannasta, lisätään uuteen koulutustietokantaan ja palautetaan tai ”korvataan” sitten alkuperäisessä tietokannassa, jolloin ne voidaan valita uudelleen.
Tämä tekniikka voi olla tehokas sellaisissa koneoppimisalgoritmeissa, joihin vaikuttaa vinoutunut jakauma ja joissa useat päällekkäiset esimerkit tietylle luokalle voivat vaikuttaa mallin sopivuuteen. Tällaisia voivat olla esimerkiksi algoritmit, jotka oppivat iteratiivisesti kertoimia, kuten keinotekoiset neuroverkot, jotka käyttävät stokastista gradienttilaskua. Se voi vaikuttaa myös malleihin, jotka etsivät hyviä jakoja datasta, kuten tukivektorikoneet ja päätöspuut.
Kohdeluokan jakauman virittäminen voi olla hyödyllistä. Joissakin tapauksissa tasapainoisen jakauman etsiminen vakavasti epätasapainoiselle aineistolle voi aiheuttaa sen, että asianomaiset algoritmit sovittavat vähemmistöluokan liikaa, mikä johtaa yleistysvirheen lisääntymiseen. Vaikutuksena voi olla parempi suorituskyky harjoitustietokannassa, mutta huonompi suorituskyky pidätys- tai testitietokannassa.
… satunnainen ylinäytteenotto voi lisätä ylisovittamisen todennäköisyyttä, koska se tekee tarkkoja kopioita vähemmistöluokan esimerkeistä. Näin esimerkiksi symbolinen luokittelija saattaa rakentaa sääntöjä, jotka ovat näennäisen tarkkoja, mutta jotka todellisuudessa kattavat yhden kopioidun esimerkin.
– Sivu 83, Learning from Imbalanced Data Sets, 2018.
Siten menetelmän vaikutuksen selvittämiseksi on hyvä seurata suorituskykyä sekä juna- että testiaineistoissa ylinäytteenoton jälkeen ja verrata tuloksia samaan algoritmiin alkuperäisellä aineistolla.
Vähemmistöluokan esimerkkien määrän lisääntyminen, varsinkin jos luokkavinouma oli voimakas, voi johtaa myös laskentakustannusten huomattavaan kasvuun mallia sovitettaessa, varsinkin kun otetaan huomioon, että malli näkee samat esimerkit harjoitusaineistossa yhä uudelleen.
… satunnaisessa ylinäytteenotossa aineistoon lisätään satunnainen joukko vähemmistöluokan esimerkkien kopioita. Tämä voi lisätä ylisovittamisen todennäköisyyttä, erityisesti suuremmilla ylinäytteenottoprosenteilla. Lisäksi se voi heikentää luokittelijan suorituskykyä ja lisätä laskennallista vaivaa.
– A Survey of Predictive Modelling under Imbalanced Distributions, 2015.
Satunnainen ylinäytteenotto voidaan toteuttaa RandomOverSampler-luokan avulla.
Luokka voidaan määritellä ja se ottaa vastaan argumentin sampling_strategy, jonka arvoksi voidaan asettaa ”minority”, jolloin vähemmistöluokka tasapainotetaan automaattisesti enemmistöluokan tai -luokkien kanssa.
Tämä tarkoittaa, että jos enemmistöluokassa olisi 1000 esimerkkiä ja vähemmistöluokassa 100 esimerkkiä, tämä strategia ottaisi vähemmistöluokasta ylinäytteen niin, että sillä olisi 1000 esimerkkiä.
Voidaan määrittää liukulukuarvo, joka ilmaisee vähemmistöluokan enemmistöesimerkkien suhdetta muunnetussa tietokokonaisuudessa. Esimerkiksi:
1
2
3
|
…
# define oversampling strategy
oversample = RandomOverSampler(sampling_strategy=0.5)
|
Näin varmistettaisiin, että vähemmistöluokalle otettaisiin ylinäytteet niin, että esimerkkejä olisi puolet enemmän kuin enemmistöluokalla, binäärisissä luokitusongelmissa. Tämä tarkoittaa, että jos enemmistöluokassa olisi 1000 esimerkkiä ja vähemmistöluokassa 100 esimerkkiä, muunnetussa tietokokonaisuudessa olisi 500 esimerkkiä vähemmistöluokasta.
Luokka on kuin scikit-learnin muunnosobjekti siinä mielessä, että se sovitetaan tietokokonaisuuteen, minkä jälkeen sitä käytetään uuden tai muunnetun tietokokonaisuuden luomiseen. Toisin kuin scikit-learn-muunnokset, se muuttaa datasetin esimerkkien lukumäärää, ei vain arvoja (kuten skaalain) tai piirteiden lukumäärää (kuten projektio)…
Voimme havainnollistaa tätä yksinkertaisella synteettisellä binääriluokitusongelmalla, jossa on luokkatasapainon epätasapaino luokassa 1:100.
1
2
3
|
…
# define dataset
X, y = make_classification(n_samples=10000, weights=, flip_y=0)
|
Kokonaisesimerkki datasetin määrittelystä ja satunnaisen ylinäytteenoton suorittamisesta luokkien jakauman tasapainottamiseksi on lueteltu alla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# esimerkki satunnaisesta ylinäytteenotosta luokkajakauman tasapainottamiseksi
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import RandomOverSampler
# define dataset
X, y = make_classification(n_näytteet=10000, painot=, flip_y=0)
# summataan luokkajakauma
print(Counter(y))
# määrittele ylinäytteenottostrategia
oversample = RandomOverSampler(sampling_strategy=’minority’)
# sovita ja sovita muunnos
X_over, y_over = oversample.fit_resample(X, y)
# tiivistä luokkajakauma
print(Counter(y_over))
|
Esimerkin ajaminen luo ensin datasetin ja tekee sitten yhteenvedon luokkajakaumasta. Näemme, että enemmistöluokassa on lähes 10K esimerkkiä ja vähemmistöluokassa 100 esimerkkiä.
Sitten määritellään satunnainen ylinäytemuunnos vähemmistöluokan tasapainottamiseksi, sitten sovitetaan ja sovelletaan aineistoon. Muunnetun tietokokonaisuuden luokkajakauma raportoidaan, mikä osoittaa, että nyt vähemmistöluokassa on sama määrä esimerkkejä kuin enemmistöluokassa.
1
2
|
Counter({0: 9900, 1: 100})
Counter({0: 9900, 1: 9900})
|
Tätä muunnosta voidaan käyttää osana putkilinjaa sen varmistamiseksi, että sitä sovelletaan koulutustietokantaan vain osana k-kertaisen ristiinvalidoinnin jokaista jakoa.
Traditionaalista scikit-learn-putkilinjaa ei voi käyttää, vaan sen sijaan voidaan käyttää epätasapainoisen oppimisen kirjaston putkilinjaa. Esimerkiksi:
1
2
3
3
4
|
…
# pipeline
steps =
pipeline = Pipeline(steps=steps)
|
Oheinen esimerkki tarjoaa täydellisen esimerkin päätöksentekopuun arvioinnista epätasapainoisella tietokokonaisuudella, jonka luokkajakauma on 1:100.
Mallia arvioidaan käyttämällä toistettua 10-kertaista ristiinvalidointia, jossa on kolme toistoa, ja ylinäytteenotto suoritetaan koulutustietokannalle jokaisessa kertauksessa erikseen, jolloin varmistetaan, että dataa ei vuoda, kuten voisi tapahtua, jos ylinäytteenotto suoritettaisiin ennen ristiinvalidointia.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
18
|
# esimerkki päätöksentekopuun arvioinnista satunnaisella ylinäytteenotolla
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)
|
Esimerkin suorittaminen arvioi päätöspuumallia epätasapainoisella tietokokonaisuudella ylinäytteenotolla.
Valittu malli ja uudelleennäytteenottokokoonpano ovat mielivaltaisia, ja ne on suunniteltu tarjoamaan malli, jonka avulla voit testata alinäytteenottoa omalla aineistollasi ja oppimisalgoritmillasi sen sijaan, että ratkaisisit synteettisen aineiston optimaalisesti.
Huomautus: Tuloksesi voivat vaihdella, kun otetaan huomioon algoritmin tai arviointimenettelyn stokastinen luonne tai erot numeerisessa tarkkuudessa. Harkitse esimerkin ajamista muutaman kerran ja vertaa keskimääräistä tulosta.
Käytetään oletusarvoista ylinäytteenottostrategiaa, joka tasapainottaa vähemmistöluokat enemmistöluokan kanssa. Raportoidaan F1-pistemäärä keskiarvona jokaisesta kertauksesta ja jokaisesta toistosta.
1
|
F1-pisteet: 0.990
|
Nyt kun ylinäytteenotto on meille tuttu, tarkastellaanpa nyt alinäytteenottoa.
Sattumanvarainen alinäytteenotto epätasapainoisista aineistoista
Sattumanvaraisessa alinäytteenotossa valitaan satunnaisesti esimerkkejä enemmistöluokasta poistettavaksi harjoitusaineistosta.
Tämän vaikutuksesta enemmistöluokkaan kuuluvien esimerkkien määrä vähenee harjoitusaineiston muunnetussa versiossa. Tätä prosessia voidaan toistaa, kunnes saavutetaan haluttu luokkajakauma, esimerkiksi yhtä suuri määrä esimerkkejä kuhunkin luokkaan.
Tämä lähestymistapa saattaa soveltua paremmin sellaisiin tietokokonaisuuksiin, joissa on luokkien epätasapaino, vaikka vähemmistöluokassa on riittävä määrä esimerkkejä, niin että käyttökelpoisen mallin sovittaminen on mahdollista.
Alinäytteenoton rajoituksena on se, että enemmistöluokassa olevista esimerkeistä poistetaan sellaisia esimerkkejä, jotka saattavat olla käyttökelpoisia, tärkeitä tai kenties kriittisiä vankan päätösrajan sovittamisen kannalta. Koska esimerkit poistetaan satunnaisesti, ei ole mitään keinoa havaita tai säilyttää ”hyviä” tai informaatiorikkaampia esimerkkejä enemmistöluokasta.
… satunnaisessa aliotannassa (mahdollisesti) hylätään valtavat määrät dataa. Tämä voi olla erittäin ongelmallista, sillä tällaisen datan menettäminen voi vaikeuttaa vähemmistö- ja enemmistöesimerkkien välisen päätösrajan oppimista, jolloin luokittelusuorituskyky heikkenee.
– Sivu 45, Epätasapainoinen oppiminen: Foundations, Algorithms, and Applications, 2013
Satunnainen undersampling-tekniikka voidaan toteuttaa käyttämällä RandomUnderSampler imbalanced-learn-luokkaa.
Luokkaa voidaan käyttää kuten edellisen kappaleen RandomOverSampler-luokkaa, paitsi että strategiat vaikuttavat enemmistöluokkaan vähemmistöluokan sijaan. Esimerkiksi sampling_strategy-argumentin asettaminen arvoon ”majority” alinäytteenottaa enemmistöluokan, joka määräytyy sen luokan mukaan, jolla on eniten esimerkkejä.
Esimerkiksi datasetti, jossa on 1000 esimerkkiä enemmistöluokassa ja 100 esimerkkiä vähemmistöluokassa, undersamplataan siten, että molemmissa luokissa olisi 100 esimerkkiä muunnetussa harjoitteluaineistossa.
Voidaan myös asettaa sampling_strategy-argumentiksi liukulukuarvo, joka on prosenttiluku suhteessa vähemmistöluokkaan, tarkemmin sanottuna vähemmistöluokan esimerkkien määrä jaettuna enemmistöluokan esimerkkien määrällä. Jos esimerkiksi asetamme sampling_strategy-arvoksi 0,5 epätasapainoisessa tietokokonaisuudessa, jossa enemmistöluokassa on 1 000 esimerkkiä ja vähemmistöluokassa 100 esimerkkiä, muunnetussa tietokokonaisuudessa olisi 200 esimerkkiä enemmistöluokkaa varten (tai 100/200 = 0.
Tätä saatetaan pitää parempana, jotta voidaan varmistaa, että tuloksena saatava tietokokonaisuus on sekä tarpeeksi suuri kohtuullisen mallin sovittamiseksi että ettei enemmistöluokan hyödyllinen informaatio joudu liikaa pois.
Sattumanvaraisessa alipoiminnassa voidaan yrittää luoda tasapainoinen luokkajakauma valitsemalla satunnaisesti 90 enemmistöluokan tapausta poistettavaksi. Tuloksena oleva aineisto koostuu tällöin 20 instanssista: 10 (satunnaisesti jäljelle jäävää) enemmistöluokan instanssia ja (alkuperäiset) 10 vähemmistöluokan instanssia.
– Sivu 45, Epätasapainoinen oppiminen: Foundations, Algorithms, and Applications, 2013
Transformaatio voidaan sitten sovittaa ja soveltaa tietokokonaisuuteen yhdessä vaiheessa kutsumalla fit_resample()-funktiota ja antamalla muuttamaton tietokokonaisuus argumentteina.
1
2
3
|
…
# sovita ja sovita muunnos
X_over, y_over = undersample.fit_resample(X, y)
|
Voimme havainnollistaa tätä tietokokonaisuudella, jossa on luokkien välinen epätasapaino 1:100.
Kokonaisuudessaan täydellinen esimerkki on lueteltu alla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# esimerkki satunnaisesta undersamplingista luokan jakauman tasapainottamiseksi
from collections import Counter
from sklearn.datasets import make_classification
from imblearn.under_sampling import RandomUnderSampler
# define dataset
X, y = make_classification(n_näytteet=10000, painot=, flip_y=0)
# summataan luokkajakauma
print(Counter(y))
# määrittele undersample-strategia
undersample = RandomUnderSampler(sampling_strategy=’majority’)
# sovita ja sovita muunnos
X_over, y_over = undersample.fit_resample(X, y)
# tee yhteenveto luokkien jakaumasta
print(Counter(y_over))
|
Esimerkin ajaminen luo ensin datasetin ja raportoi epätasapainoisen luokkajakauman.
Muunnos sovitetaan ja sovelletaan datasettiin ja raportoidaan uusi luokkajakauma. Näemme, että enemmistöluokka on alimitoitettu niin, että sillä on sama määrä esimerkkejä kuin vähemmistöluokalla.
Tuomiota ja empiirisiä tuloksia joudutaan käyttämään sen suhteen, riittäisikö vain 200 esimerkkiä sisältävä koulutustietokanta mallin kouluttamiseen.
1
2
|
Counter({0: 9900, 1: 100})
Counter({0: 100, 1: 100})
|
Tätä undersampling-muunnosta voidaan käyttää myös putkistossa, kuten edellisen kappaleen oversampling-muunnosta.
Tällöin muunnosta voidaan soveltaa vain koulutustietokantaan käyttäen arviointijärjestelmiä, kuten k-kertaista ristiinvalidointia, jolloin vältetään tietovuoto mallin arvioinnissa.
1
2
3
4
|
…
# define pipeline
steps =
pipeline = Pipeline(steps=steps)
|
Voidaan määritellä esimerkki päätöspuun sovittamisesta epätasapainotettuun luokittelutietoaineistoon, jossa koulutustietoaineistoon on sovellettu undersampling-muunnosta jokaisessa toistetun 10-kertaisen ristiinvalidoinnin osituksessa.
Täydellinen esimerkki on lueteltu alla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
18
|
# esimerkki päätöksentekopuun arvioinnista satunnaisella undersamplingilla
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)
|
Esimerkin suorittaminen arvioi päätöspuumallia epätasapainoisella tietokokonaisuudella undersamplingilla.
Valittu malli ja uudelleennäytteenottokokoonpano ovat mielivaltaisia, ja ne on suunniteltu tarjoamaan malli, jonka avulla voit testata alinäytteenottoa aineistollasi ja oppimisalgoritmillasi sen sijaan, että ratkaisisit synteettisen aineiston optimaalisesti.
Huomautus: Tuloksesi voivat vaihdella algoritmin tai arviointimenettelyn stokastisen luonteen tai numeerisen tarkkuuden eroavaisuuksien vuoksi. Harkitse esimerkin ajamista muutaman kerran ja vertaa keskimääräistä tulosta.
Käytetään oletusarvoista undersampling-strategiaa, joka tasapainottaa enemmistöluokat vähemmistöluokkien kanssa. Raportoidaan F1-pistemäärä keskiarvona jokaisesta kertauksesta ja jokaisesta toistosta.
1
|
F1-pistemäärä: 0.889
|
Sattumanvaraisen yli- ja alinäytteenoton yhdistäminen
Interenkiintoisia tuloksia voidaan saavuttaa yhdistämällä sekä satunnainen yli- että alinäytteenotto.
Vähemmistöluokkaan voidaan esimerkiksi soveltaa vaatimaton määrä ylinäytteenottoa näiden esimerkkien harhaisuuden parantamiseksi, kun taas enemmistöluokkaan voidaan soveltaa myös vaatimaton määrä alinäytteenottoa tämän luokan harhaisuuden vähentämiseksi.
Tämä voi johtaa parempaan kokonaissuorituskykyyn verrattuna siihen, että jompikumpi tekniikka suoritettaisiin erikseen.
Jos meillä olisi esimerkiksi tietokokonaisuus, jonka luokkajakauma on 1:100, voisimme ensin soveltaa ylinäytteenottoa kasvattaaksemme suhdelukua 1:10:een kopioimalla esimerkkejä vähemmistöluokasta, ja sen jälkeen soveltaa alinäytteenottoa parantaaksemme suhdelukua 1:2:een poistamalla esimerkkejä enemmistöluokasta.
Tämä voitaisiin toteuttaa käyttämällä imbalanced-learnia käyttämällä RandomOverSampleria, jonka sampling_strategiaksi on asetettu 0.1 (10 %), ja sitten RandomUnderSampleria, jonka sampling_strategiaksi on asetettu 0.5 (50 %). Esimerkiksi:
1
2
3
4
5
6
7
8
9
|
…
# määritä ylinäytteenottostrategia
over = RandomOverSampler(sampling_strategy=0.1)
# sovita ja sovita muunnos
X, y = over.fit_resample(X, y)
# define undersampling strategy
under = RandomUnderSampler(sampling_strategy=0.5)
# sovita ja sovita muunnos
X, y = under.fit_resample(X, y)
|
Voidaan demonstroida tätä synteettisellä tietokokonaisuudella, jossa on luokkajakauma 1:100. Täydellinen esimerkki on lueteltu alla:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# esimerkki satunnaisen ylinäytteenoton (oversampling) ja alimman näytteenoton (undersampling) yhdistämisestä epätasapainoiselle aineistolle
from collections import Laskuri (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)
# tiivistää luokkajakauman
print(Counter(y))
# määrittele undersampling-strategia
under = RandomUnderSampler(sampling_strategy=0.5)
# sovita ja sovita muunnos
X, y = under.fit_resample(X, y)
# tee yhteenveto luokkien jakaumasta
print(Counter(y))
|
Esimerkin ajaminen luo ensin synteettisen datasetin ja tekee yhteenvedon luokkajakaumasta, jolloin saadaan likimääräinen 1:100 luokkajakauma.
Sitten sovelletaan ylinäytteenottoa, jolloin jakauma kasvaa noin 1:100:sta noin 1:10:een. 9900, 1: 100})
Saatamme myös haluta soveltaa tätä samaa hybridi-lähestymistapaa arvioidessamme mallia k-kertaisen ristiinvalidoinnin avulla.
Tämä voidaan saavuttaa käyttämällä putkilinjaa, jossa on muunnosten sarja ja joka päättyy arvioitavaan malliin; esim:
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)
|
Voidaan havainnollistaa tätä päätöksentekopuumallilla samalla synteettisellä aineistolla.
Täydellinen esimerkki on lueteltu alla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# esimerkki mallin arvioinnista satunnaisella ylinäytteenotolla (oversampling) ja satunnaisella alinäytteenotolla (undersampling)
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)
|
Esimerkin suorittaminen arvioi päätöspuumallia käyttämällä toistuvaa k-kertaista ristiinvalidointia, jossa koulutustietokanta muunnetaan käyttäen ensin ylinäytteenottoa ja sitten alinäytteenottoa jokaista jakoa ja suoritettua toistoa varten. Raportoidaan F1-pistemäärä, joka on keskiarvo jokaisesta kertauksesta ja jokaisesta toistosta.
Huomautus: Tuloksesi voivat vaihdella algoritmin tai arviointimenettelyn stokastisen luonteen tai numeerisen tarkkuuden erojen vuoksi. Harkitse esimerkin ajamista muutaman kerran ja vertaa keskimääräistä tulosta.
Valittu malli ja uudelleennäytteenottokokoonpano ovat mielivaltaisia, ja ne on suunniteltu tarjoamaan malli, jonka avulla voit testata alinäytteenottoa aineistollasi ja oppimisalgoritmillasi sen sijaan, että ratkaisisit synteettisen aineiston optimaalisesti.
1
|
F1 Pisteet: 0.985
|
Lisälukemista
Tässä osiossa on lisää resursseja aiheesta, jos haluat syventyä aiheeseen.
Kirjat
- Luku 5 Datatason esiprosessointimenetelmät, Oppiminen epätasapainoisista aineistoista, 2018.
- Luku 3 Epätasapainoiset aineistot: From Sampling to Classifiers, Epätasapainoinen oppiminen: 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.
Artikkelit
- Oversampling and undersampling in data analysis, Wikipedia.
Yhteenveto
Tässä opetusohjelmassa tutustuit satunnaiseen ylinäytteenottoon ja alinäytteenottoon epätasapainoisessa luokittelussa
Kohtaisesti opit:
- Sattumanvarainen ylinäytteenotto tarjoaa naiivin tekniikan luokkajakauman uudelleentasapainottamiseen epätasapainoisessa datajoukossa.
- Sattumanvarainen ylinäytteenotto kopioi esimerkkejä vähemmistöluokasta harjoitusaineistossa ja voi johtaa joidenkin mallien ylisovittamiseen.
- Sattumanvarainen alinäytteenotto poistaa esimerkkejä enemmistöluokasta ja voi johtaa mallin kannalta korvaamattoman arvokkaan tiedon menettämiseen.
Onko sinulla kysyttävää?
Kysy kysymyksesi alla olevissa kommenteissa, ja teen parhaani vastatakseni.
Ota käsiksi epätasapainotettuun luokitteluun!
Kehitä epätasapainotetun oppimisen malleja muutamassa minuutissa
…vain muutamalla rivillä python-koodia
Tutustu siihen uudessa E-kirjassani:
Epäsymmetrinen luokittelu Pythonilla
Se tarjoaa itseopiskeluoppaita ja kokonaisvaltaisia projekteja:
suorituskykymetriikoista, Undersampling-menetelmistä, SMOTE-menetelmistä, kynnysarvojen siirtelystä, todennäköisyyskalibroinnista, kustannusherkistä algoritmeista
ja paljosta muusta…
Bring Imbalanced Classification Methods to Your Machine Learning Projects
See What’s Inside