viimeksi päivitetty 31. elokuuta 2020
Multi-label-luokitukseen kuuluu nollan tai useamman luokkamerkin ennustaminen.
toisin kuin normaalit luokittelutehtävät, joissa luokkamerkit ovat toisensa poissulkevia, monimerkintäluokitus edellyttää erikoistuneita koneoppimisalgoritmeja, jotka tukevat usean toisensa poissulkevan luokan tai ”-merkinnän ennustamista.”
Syväoppivat neuroverkot ovat esimerkki algoritmista, joka natiivisti tukee monimerkityksisiä luokitteluongelmia. Neuroverkkomallit usean merkin luokittelutehtäviin voidaan helposti määritellä ja arvioida Keras deep learning Libraryn avulla.
tässä opetusohjelmassa kerrotaan, miten syväoppimismalleja voidaan kehittää monimerkintään.
kun olet suorittanut tämän opetusohjelman, tiedät:
- Multi-label-luokittelu on ennakoiva mallintamistehtävä, johon kuuluu nollan tai useampien keskenään ei-eksklusiivisten luokkamerkkien ennustaminen.
- Neuroverkkomalleja voidaan konfiguroida usean merkin luokittelutehtäviin.
- kuinka neuroverkkoa arvioidaan monimerkityksistä luokittelua varten ja tehdään ennuste uusille tiedoille.
aloitetaan.
Multi-Label Classification with Deep Learning
Photo by Trevor Marron, some rights reserved.
opetusohjelma yleiskatsaus
tämä opetusohjelma on jaettu kolmeen osaan; ne ovat:
- Monimerkintäluokitus
- neuroverkko Monimerkintäluokitukselle
- neuroverkko Monimerkintäluokitukselle
Monimerkintäluokitus
luokitus on ennakoiva mallintamisongelma, johon liittyy luokkamerkinnän ulostulo, kun otetaan huomioon jokin tulo
se eroaa regressiotehtävistä, jotka sisältää numeerisen arvon ennustamisen.
tyypillisesti luokittelutehtävään kuuluu yhden merkin ennustaminen. Vaihtoehtoisesti siihen voi sisältyä todennäköisyyden ennustaminen kahden tai useamman luokkamerkin välillä. Näissä tapauksissa luokat ovat toisensa poissulkevia, eli luokittelutehtävä olettaa, että tulo kuuluu vain yhteen luokkaan.
jotkin luokittelutehtävät edellyttävät useamman kuin yhden luokkamerkin ennustamista. Tämä tarkoittaa, että luokkamerkinnät tai luokkajäsenyys eivät sulje toisiaan pois. Näistä tehtävistä käytetään nimitystä multiple label classification, lyhyemmin multi-label classification.
monimerkintäluokituksessa tulosteeksi vaaditaan nolla tai useampia merkkejä jokaisesta tulonäytteestä, ja tuotokset vaaditaan samanaikaisesti. Oletus on, että lähdemerkinnät ovat panosten funktio.
voimme luoda synteettisen usean merkin luokitusaineiston käyttämällä make_multilabel_classification ()-toimintoa scikit-learn-kirjastossa.
aineistossamme on 1 000 näytettä, joissa on 10 syöttöominaisuutta. Aineistossa on kolme luokkamerkintätulosta kutakin näytettä varten, ja jokaisella luokalla on yksi tai kaksi arvoa (0 tai 1, esim.preesens tai not preesens).
alla on täydellinen esimerkki synteettisen monimerkintäluokitusaineiston luomisesta ja tiivistämisestä.
1
2
3
4
5
6
7
8
9
|
# esimerkki usean merkin luokittelutehtävästä
sklearnilta.tietokokonaisuudet tuo make_multilabel_luokitus
# define aineisto
X, y = make_multilabel_luokitus(n_samples=1000, n_features = 10, n_classes=3, n_labels=2, random_state=1)
# summary dataset shape
print (X. shape, y.shape)
# summary first few examples
for i in range(10):
print (X, y)
|
esimerkin suorittaminen luo aineiston ja tiivistää Tulo-ja lähtöelementtien muodon.
voimme nähdä, että odotetusti otoksia on 1 000, joista jokaisessa on 10 syöttöominaisuutta ja kolme lähtöominaisuutta.
ensimmäiset 10 riviä Tulo-ja lähtöriviä on tiivistetty, ja voimme nähdä, että kaikki tämän tietojoukon tulot ovat numeerisia ja että tulostusluokkamerkeillä on 0 tai 1 arvo kullekin kolmelle luokkamerkinnälle.
1
2
3
4
5
6
7
8
9
10
11
12
|
(1000, 10) (1000, 3)
|
seuraavaksi tarkastellaan, miten voimme kehittää neuroverkkomalleja monen merkin luokittelutehtäviin.
Neuroverkkoja Monimerkinnöille
jotkut koneoppimisalgoritmit tukevat natiivisti multi-label-luokittelua.
Neuroverkkomallit voidaan konfiguroida tukemaan monileimaista luokittelua ja ne voivat suoriutua hyvin riippuen luokittelutehtävän erityispiirteistä.
Multi-label-luokitusta voidaan tukea suoraan neuroverkkojen avulla yksinkertaisesti määrittelemällä ongelmassa olevien kohdemerkkien määrä lähtökerroksen solmujen lukumääräksi. Esimerkiksi tehtävä, jossa on kolme lähtötarraa (luokkaa), vaatii neuroverkon lähtökerroksen, jossa on kolme solmua lähtökerroksessa.
jokaisen ulostulokerroksen solmun on käytettävä sigmoidiaktivaatiota. Tämä ennustaa merkin luokkajäsenyyden todennäköisyyden, arvon 0 ja 1 välillä. Lopuksi mallin on sovittava binäärisen cross-entropy loss-funktion kanssa.
yhteenvetona voidaan todeta, että neuroverkkomallin määrittäminen monimerkityksistä luokittelua varten on:
- määrä solmuja lähtö kerros vastaa määrä tarroja.
- sigmoid-aktivaatio jokaiselle ulostulokerroksen solmulle.
- binäärinen risti-entropian häviöfunktio.
voimme osoittaa tämän Keras deep learning Libraryn avulla.
määrittelemme monikerroksisen Perceptron (MLP)-mallin edellisessä osassa määriteltyä monimerkintäistä luokittelutehtävää varten.
jokaisessa näytteessä on 10 tuloa ja kolme lähtöä; siksi verkko vaatii syöttökerroksen, joka odottaa 10 tuloa, jotka on määritelty ”input_dim” – argumentin kautta ensimmäisessä piilotetussa kerroksessa ja kolme solmua lähtökerroksessa.
käytämme piilokerroksessa suosittua Reluaktivointifunktiota. Piilokerroksessa on 20 solmua, jotka valittiin jonkin yrityksen ja erehdyksen jälkeen. Sovitamme mallin binäärisellä ristiin entropian häviöllä ja stokastisen gradientin laskeutumisen Adam-versiolla.
alla on lueteltu verkon määritelmä usean merkin luokittelutehtävää varten.
1
2
3
4
5
|
# määritellään malli
malli = juokseva ()
malli.add(Dense (20, input_dim=n_inputs, kernel_initializer= ”he_uniform”, activation= ”relu”))
model.add(Dense (N_outputs, activation= ”sigmoid”))
model.compile(loss= ”binary_crossentropy”, optimizer= ”adam’)
|
haluat ehkä mukauttaa tätä mallia omaan monimerkintäiseen luokittelutehtävääsi; siksi voimme luoda funktion, jolla määritellään ja palautetaan malli, jossa tulo-ja lähtömuuttujien lukumäärä esitetään argumentteina.
1
2
3
4
5
6
7
|
# get the model
def get_model (n_inputs, n_outputs):
model = Sequential ()
model.add(Dense (20, input_dim=n_inputs, kernel_initializer= ”he_uniform”, activation= ”relu”))
model.add(Dense (N_outputs, activation= ”sigmoid”))
model.compile (loss= ”binary_crossentropy”, optimizer= ”adam”)
return model
|
nyt kun olemme perehtyneet siihen, miten määritellään MLP multi-label-luokitusta varten, tutkitaan, miten tätä mallia voidaan arvioida.
neuroverkko Multi-Label-luokitusta varten
jos aineisto on pieni, on hyvä käytäntö arvioida neuroverkkomalleja toistuvasti samassa aineistossa ja raportoida keskimääräinen suorituskyky toistoissa.
tämä johtuu oppimisalgoritmin stokastisesta luonteesta.
lisäksi on hyvä käytäntö käyttää K-kertaista ristivalvontaa datajoukon juna – / testijakauman sijasta, jotta saadaan puolueeton arvio mallin suorituskyvystä, kun tehdään ennusteita uusista tiedoista. Jälleen, vain jos ei ole liikaa tietoa, että prosessi voidaan suorittaa kohtuullisessa ajassa.
tämän huomioon ottaen arvioimme MLP-mallin monilähtöisessä regressiotehtävässä toistuvalla k-kertaisella ristivalidoinnilla, jossa on 10 taitosta ja kolme toistoa.
MLP-malli ennustaa oletuksena todennäköisyyden kullekin luokkamerkinnälle. Tämä tarkoittaa, että se ennustaa kolme todennäköisyyttä jokaiselle otokselle. Nämä voidaan muuttaa crisp-luokan merkinnöiksi pyöristämällä arvot joko 0: een tai 1: een. Voimme sitten laskea crisp-luokan merkintöjen luokitustarkkuuden.
1
2
3
4
5
6
7
|
…
# tee ennuste testisarjalle
yhat = malli.ennustavat (X_test)
# kierroksen todennäköisyydet luokkamerkeille
yhat = yhat.kierros ()
# laske tarkkuus
acc = tarkkuus_score (y_test, yhat)
|
pisteet kerätään, ja ne voidaan tiivistää ilmoittamalla keskiarvo ja keskihajonta kaikissa toistoissa ja ristiintarkistuksissa.
alla oleva evaluate_model () – funktio ottaa aineiston, arvioi mallin ja palauttaa luettelon arviointipisteistä, tässä tapauksessa tarkkuuspisteistä.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# evaluoi mallin toistuvalla k-kertaisella ristivalidoinnilla
def evaluate_malli (X, y):
results = list ()
n_inputs, n_outputs = X. shape, y. shape
# define evaluation procedure
CV = Repeatedfold(n_splits=10, n_repeats=3, random_state=1)
# luetteloi taitokset
train_ix, test_ix cv: ssä.split(X):
# preparate data
X_train, X_test = X, X
y_train, y_test = y, y
# define model
model = get_model(n_inputs, n_outputs)
# fit model
model.fit(X_train, y_train, verbose=0, epookit=100)
# tehdään ennuste testisarjalle
yhat = malli.ennustavat (X_test)
# kierroksen todennäköisyydet luokkamerkeille
yhat = yhat.kierros ()
# laske tarkkuus
acc = accuracy_score(y_test, yhat)
# myymälätulos
tulosta (”>%.3f ’ % acc)
tulokset.append (acc)
palautustulokset
|
sen jälkeen voimme ladata aineistomme ja arvioida mallin ja raportoida keskimääräisen suorituskyvyn.
kun tämä yhdistetään, koko 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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# mlp moniluokitukselle
numpy import mean
from numpy import std
from sklearn.tietokokonaisuudet tuovat make_multilabel_luokituksen
sklearnista.model_ selection import toistettu kertymä
kerakselta.mallit tuovat Kerasista Sekventiaalin
.kerrokset tuovat tiheää
sklearnista.metrics import accuracy_score
# get the dataset
def get_dataset():
X, y = make_multilabel_luokitus(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
Return x, y
# get the model
def get_model(n_inputs, n_outputs):
model = sequential()
model.add(Dense (20, input_dim=n_inputs, kernel_initializer= ”he_uniform”, activation= ”relu”))
model.add(Dense (N_outputs, activation= ”sigmoid”))
model.compile(loss= ”binary_crossentropy”, optimizer= ”adam”)
return model
# evaluate a model using repeated k-fold cross-validation
def evaluate_model(X, y):
results = list()
n_inputs n_outputs = X. muoto, y.shape
# define evaluation procedure
cv = Repeatedfold(n_splits=10, n_repeats=3, random_state=1)
# luetteloi taitokset
train_ix, test_ix cv: ssä.split(X):
# preparate data
X_train, X_test = X, X
y_train, y_test = y, y
# define model
model = get_model(n_inputs, n_outputs)
# fit model
model.fit(X_train, y_train, verbose=0, epookit=100)
# tehdään ennuste testisarjalle
yhat = malli.ennustavat (X_test)
# kierroksen todennäköisyydet luokkamerkeille
yhat = yhat.kierros ()
# laske tarkkuus
acc = accuracy_score(y_test, yhat)
# myymälätulos
tulosta (”>%.3f ’ % acc)
tulokset.append(acc)
palautustulokset
# kuormitustiedot
X, y = get_dataset()
# evaluate model
results = evaluate_model(X, y)
# summarate performance
Print(’tarkkuus: %.3f (%.3f) ” % (keskiarvo (tulokset), std (tulokset)))
|
esimerkin Running raportoi luokituksen tarkkuus kunkin kertainen ja jokainen toisto, antaa käsityksen arvioinnin edistymisestä.
huomaa: tuloksesi voivat vaihdella algoritmin tai arviointimenettelyn stokastisen luonteen tai numeerisen tarkkuuden erojen vuoksi. Harkitse esimerkin ajamista muutaman kerran ja vertaa keskimääräistä lopputulosta.
lopussa ilmoitetaan keskiarvo ja keskihajonnan tarkkuus. Tällöin mallin osoitetaan saavuttavan noin 81,2 prosentin tarkkuuden.
voit käyttää tätä koodia mallina arvioitaessa MLP-malleja omissa usean merkin luokittelutehtävissäsi. Mallin solmujen ja kerrosten määrä voidaan helposti mukauttaa ja räätälöidä tietokokonaisuutesi monimutkaisuuteen.
1
2
3
4
5
6
7
|
…
>0.780
>0.820
>0.790
>0.810
>0.840
Tarkkuus: 0.812 (0.032)
|
kun mallikokoonpano on valittu, voimme sen avulla sovittaa lopullisen mallin kaikkeen käytettävissä olevaan dataan ja tehdä ennusteen uudesta datasta.
alla oleva esimerkki osoittaa tämän asentamalla ensin MLP-mallin koko usean merkin luokitteluaineistoon ja kutsumalla sitten tallennetun mallin ennustus () – funktion, jotta voidaan tehdä ennuste uudelle datariville.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# käytä MLP: tä ennustamiseen on multi-label luokitus
from numpy import asarray
from sklearn.aineistot tuovat make_multilabel_luokituksen
kerasilta.mallit tuovat Kerasista Sekventiaalin
.kerrokset tuovat tiheää
# get the dataset
def get_dataset():
X, y = make_multilabel_luokitus(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X, Y
# get the model
def get_model(n_inputs, n_outputs):
model = sequential()
model.add(Dense (20, input_dim=n_inputs, kernel_initializer= ”he_uniform”, activation= ”relu”))
model.add(Dense (N_outputs, activation= ”sigmoid”))
model.compile(loss= ”binary_crossentropy”, optimizer= ”adam”)
return model
# load dataset
X, y = get_dataset()
n_inputs, n_outputs = X. shape, y.shape
# get model
model = get_model(n_inputs, n_outputs)
# sovita malli kaikkiin tietoihin
malli.fit (X, y, verbose=0, epookit=100)
# tehdään ennuste uusille tiedoille
row =
newX = asarray ()
yhat = malli.ennustaa (newX)
tulosta (”ennustettu: %s” % yhat)
|
esimerkin Running sopii malliin ja tekee ennusteen uudelle riville. Ennusteessa on odotetusti kolme lähtömuuttujaa, jotka vaaditaan monimerkintätehtävään: kunkin luokkamerkin todennäköisyydet.
1
|
ennustettu:
|
lisätietoja
tämä osio tarjoaa lisää resursseja aiheeseen, jos haluat mennä syvemmälle.
- monen merkin luokitus, Wikipedia.
- sklearn.tietojoukko.make_multilabel_classification API.
- Keraksen kotisivut.
- sklearn.malli_valinta.Toistettu stratifiedfoldin API.
Summary
tässä opetusohjelmassa keksit, miten kehittää syväoppimismalleja monimerkintään.
nimenomaan opit:
- Multi-label-luokittelu on ennakoiva mallintamistehtävä, johon kuuluu nollan tai useampien keskenään ei-eksklusiivisten luokkamerkkien ennustaminen.
- Neuroverkkomalleja voidaan konfiguroida usean merkin luokittelutehtäviin.
- kuinka neuroverkkoa arvioidaan monimerkityksistä luokittelua varten ja tehdään ennuste uusille tiedoille.
onko sinulla kysyttävää?
esitä kysymyksesi alla olevissa kommenteissa, niin teen parhaani vastatakseni.
kehitä Syväoppimisprojekteja Pythonin avulla!
mitä jos verkon voisi kehittää minuuteissa
…with just a few Rives of Python
Discover how in my new Ebook:
Deep Learning with Python
It covers end-to-end projects on topics like:
Multilayer Perceptrons, Convolutional Nets and Recurrent Neural Nets, and more…
tuo vihdoin Syväoppiminen
omat projektisi
jätä akateemikot väliin. Pelkkiä Tuloksia.
See What ’ s Inside