Työskentely ei-numeeristen tietojen kanssa voi olla vaikeaa, jopa kokeneet tutkijat . Tyypillinen koneoppimismalli odottaa ominaisuuksiensa olevan lukuja, ei sanoja, sähköposteja, verkkosivustosivuja, luetteloita, kaavioita tai todennäköisyysjakaumia. Tietojen on oltava hyödyllisiä ensin, jotta ne ovat hyödyllisiä. Mutta miten?
Yksi suosittu lähestymistapa olisi käsittele ei-numeerista ominaisuutta kategorisena . Tämä voisi toimia hyvin, jos luokkien lukumäärä on pieni (esimerkiksi jos tiedot osoittavat ammattia tai maata). Jos kuitenkin yritämme soveltaa tätä menetelmää sähköposteihin, saamme todennäköisesti niin monta luokkaa kuin näytteitä on. Ei ole kahta täsmälleen samanlaista sähköpostia, joten tästä lähestymistavasta ei olisi hyötyä.
Toinen lähestymistapa olisi määritä etäisyys datanäytteiden välillä , funktio, joka kertoo kuinka lähellä kaksi näytettä ovat. Tai voisimme määritellä a samankaltaisuusmitta , joka antaisi meille samat tiedot paitsi, että kahden läheisen näytteen välinen etäisyys on pieni ja samankaltaisuus on suuri. Kaikkien datanäytteiden välisen etäisyyden (samankaltaisuuden) laskeminen antaisi meille matkan (tai samankaltaisuuden) matriisin. Tämä on numeerista tietoa, jota voimme käyttää.
Tällä tiedolla olisi kuitenkin niin monta ulottuvuutta kuin näytteitä, mikä ei yleensä ole hienoa, jos haluamme käyttää sitä ominaisuutena (katso ulottuvuuden kirous ) tai visualisoida se (kun yksi juoni pystyy käsittelemään jopa 6D: n , En ole vielä nähnyt 100D-juonia). Voisimmeko pienentää ulottuvuuksien määrän kohtuulliseen määrään?
Vastaus on kyllä! Sitä meillä on upotukset varten.
Upottaminen on korkean ulottuvuuden datan matalaulotteinen esitys. Tyypillisesti upottaminen ei tallenna kaikkia alkuperäisten tietojen sisältämiä tietoja. Hyvällä upottamisella saadaan kuitenkin kiinni tarpeeksi ongelman ratkaisemiseksi.
Tiettyyn tietorakenteeseen on räätälöity monia upotuksia. Olet ehkä kuullut word2vec tekstitiedoille tai Fourier-kuvaimet muodon kuvadataa varten. Sen sijaan keskustelemme upotusten soveltamisesta mihin tahansa tietoon, jossa voimme määrittää etäisyyden tai samankaltaisuuden mittarin. Niin kauan kuin voimme laskea etäisyysmatriisin, tietojen luonteella ei ole mitään merkitystä. Se toimii samalla tavalla, olivatpa ne sähköpostit, luettelot, puita tai verkkosivuja .
Tässä artikkelissa esittelemme sinulle erilaisia upotustyyppejä ja keskustelemme siitä, miten jotkut suositut upotukset toimivat ja kuinka voisimme käyttää upotuksia ratkaisemaan tosielämän ongelmia, joihin liittyy monimutkaisia tietoja. Käymme läpi myös tämän menetelmän edut ja haitat sekä joitain vaihtoehtoja. Kyllä, jotkut ongelmat voidaan ratkaista paremmin muilla keinoilla, mutta valitettavasti koneoppimisessa ei ole hopeamallia.
Aloitetaan.
Kaikissa upottamisissa yritetään vähentää tietojen ulottuvuutta säilyttäen datassa 'välttämätön' tieto, mutta jokainen upotus tekee sen omalla tavallaan. Tässä käydään läpi muutama suosittu upotus, jota voidaan soveltaa etäisyys- tai samankaltaisuusmatriisiin.
Emme edes yritä kattaa kaikkia upotuksia. On olemassa ainakin tusina tunnettua upotusta, joka voi tehdä sen, ja monia muita vähemmän tunnettuja upotuksia ja niiden muunnelmia. Jokaisella on oma lähestymistapa, edut ja haitat.
Jos haluat nähdä, mitä muita upotuksia siellä on, voit aloittaa täältä:
Koskettakaamme lyhyesti matriiseja. Sopivan etäisyyden löytäminen tiedoille vaatii ongelman hyvän ymmärtämisen, matematiikan tuntemuksen ja joskus pelkkä onni . Tässä artikkelissa kuvatussa lähestymistavassa tämä voi olla tärkein tekijä, joka vaikuttaa projektisi yleiseen menestykseen tai epäonnistumiseen.
Sinun tulisi myös pitää mielessä muutama tekninen yksityiskohta. Monissa upotusalgoritmeissa oletetaan, että etäisyys (tai erilaisuus ) matriisin $ textbf {D} $ diagonaalissa on nollia ja symmetrinen. Jos se ei ole symmetrinen, voimme käyttää sen sijaan $ ( textbf {D} + textbf {D} ^ T) / 2 $. Algoritmit, jotka käyttävät ytimen temppu olettaa myös, että etäisyys on metriikka, mikä tarkoittaa, että kolmion eriarvoisuus pätee:
[ kaikki a, b, c ; ; d (a, c) leq d (a, b) + d (b, c) ]Lisäksi, jos algoritmi vaatii sen sijaan samankaltaisuusmatriisia, voimme käyttää mitä tahansa yksitoista pienentävää funktiota etäisyysmatriisin muuntamiseksi samankaltaisuusmatriisiksi: esimerkiksi $ exp -x $.
Pääkomponenttianalyysi , tai PCA, on todennäköisesti tähän mennessä eniten käytetty upotus. Idea on yksinkertainen: Etsi ominaisuuksien lineaarinen muunnos, joka maksimoi kaapatun varianssin tai (vastaavasti) minimoi toisen asteen rekonstruktiovirheen .
Erityisesti olkoon ominaisuudet esimerkkimatriisi $ textbf {X} in mathbb {R} ^ {n kertaa p} $: lla on $ n $ -ominaisuuksia ja $ p $ -mitat. Oletetaan yksinkertaisuuden vuoksi, että datanäytekeskiarvo on nolla. Voimme pienentää ulottuvuuksien määrää arvosta $ p $ arvoon $ q $ kertomalla $ textbf {X} $ ortonormaalimatriisilla $ textbf {V} _q sisään mathbb {R} ^ {p kertaa q} $ :
[ hat {{textbf {X}} = textbf {X} textbf {V} _q ]Sitten uusi ominaisuusjoukko on $ hat { textbf {X}} in mathbb {R} ^ {n kertaa q} $. Uusien ominaisuuksien kartoittaminen takaisin alkuperäiseen tilaan (tätä toimintoa kutsutaan jälleenrakentaminen ), meidän on yksinkertaisesti kerrottava se uudelleen luvulla $ textbf {V} _q ^ T $.
Nyt on löydettävä matriisi $ textbf {V} _q $, joka minimoi jälleenrakennusvirheen:
[ min _ { textbf {V} _q} || textbf {X} textbf {V} _q textbf {V} _q ^ T - textbf {X} || ^ 2 ]Matriisin $ textbf {V} _q $ sarakkeita kutsutaan pääkomponenttisuunniksi ja $ hat { textbf {X}} $ -sarakkeita kutsutaan pääkomponenteiksi. Numeerisesti löydämme $ textbf {V} _q $ soveltamalla SVD-hajotusta kohtaan $ textbf {X} $, vaikka siihen on muitakin yhtä kelvollisia tapoja.
PCA: ta voidaan soveltaa suoraan numeerisiin ominaisuuksiin. Tai jos ominaisuutemme eivät ole numeerisia, voimme soveltaa sitä etäisyys- tai samankaltaisuusmatriisiin.
Jos käytät Pythonia, PCA on toteutettu scikit-learn-sovelluksessa .
Hyöty Tämän menetelmän mukaan se on nopea laskea ja melko vankka melussa tiedoissa.
Haitta se voisi kaapata vain lineaarisia rakenteita, joten alkuperäisten tietojen epälineaarinen tieto todennäköisesti menetetään.
Kernel PCA on ei-lineaarinen versio PCA: sta. Ajatuksena on käyttää ytimen temppu , jonka olet todennäköisesti kuullut, jos tunnet sen Tuki Vector Machines SVM: lle .
On olemassa muutama erilainen tapa laskea PCA. Yksi niistä on laskea grammamatriisin $ textbf {X} textbf {X} ^ T in mathbb {R} ^ {n kertaa n} $ kaksoiskeskeisen version eigendakomponentti. Jos nyt lasketaan a ytimen matriisi $ textbf {K} in mathbb {R} ^ {n kertaa n} $ tietojemme kannalta, ytimen PCA käsittelee sitä gramma-matriisina löytääkseen pääkomponentit.
Olkoon $ x_i $, $ i kohdassa {1, .., n} $ ominaisuusnäytteet. Ytimen matriisi määritetään ytintoiminnolla $ K (x_i, x_j) = langle phi (x_i), phi (x_j) rangle $.
Suosittu valinta on radiaalinen ydin:
[K (x_i, x_j) = exp - gamma cdot d (x_i, x_j) ]missä $ d $ on etäisyysfunktio.
Ytimen PCA vaati meitä määrittämään etäisyyden. Esimerkiksi numeeristen ominaisuuksien osalta voimme käyttää euklidista etäisyyttä: $ d (x_i, x_j) = vert vert x_i-x_j vert vert ^ 2 $.
Ei-numeeristen ominaisuuksien osalta meidän on ehkä luovuttava. Yksi asia on muistaa, että tämä algoritmi olettaa etäisyytemme olevan metriikka.
Jos käytät Pythonia, ytimen PCA on toteutettu scikit-learn-sovelluksessa .
Hyöty Ytimen PCA-menetelmä on, että se voi siepata epälineaarisia tietorakenteita.
Haitta se on, että se on herkkä datan melulle ja että etäisyyden ja ytimen toimintojen valinta vaikuttaa suuresti tuloksiin.
Moniulotteinen skaalaus (MDS) yrittää säilyttää näytteiden väliset etäisyydet maailmanlaajuisesti. Idea on melko intuitiivinen ja toimii hyvin matriisien kanssa.
Annetut ominaisuusnäytteet $ x_i $, $ i in {1, .., n} $ ja etäisyysfunktio $ d $, laskemme uudet ominaisuusnäytteet $ z_i sisään mathbb {R} ^ {q} $, $ i muodossa {1, .., n} $ pienentämällä a stressitoiminto :
[ min_ {z_1, .., z_n} summa_ {1 leq iHyöty MDS: n ajatus on, että sen idea on täysin sopusoinnussa puitteidemme kanssa ja että datan melu ei vaikuta siihen paljon.
Haitta on, että sen toteutus scikit-learn-ohjelmassa on melko hidasta eikä tue näytteen ulkopuolista muunnosta.
Muutamat pienen trooppisen saaren asutukset ovat kehittäneet pakettien kuljetuspalveluja paikallisen matkailualan palvelemiseksi. Kauppias yhdessä näistä siirtokunnista päätti ryhtyä toimiin saadakseen edun kilpailusta, joten hän perusti satelliittivalvontajärjestelmän, joka seurasi kaikkia saaren pakettilähetyksiä. Kun tiedot on kerätty, kauppias kutsui datatieteilijän (me olemme!) Auttamaan häntä vastaamaan seuraavaan kysymykseen: Voimmeko ennustaa matkalla olevan paketin määränpään?
Aineisto sisältää tietoa 200 seuratusta lähetyksestä. Jokaista seurattua lähetystä varten on luettelo (x, y) -koordinaateista kaikista paikoista, joissa paketti havaittiin, mikä on tyypillisesti 20-50 havaintoa. Alla oleva juoni näyttää, miten nämä tiedot näyttävät.
Nämä tiedot näyttävät ongelmilta - itse asiassa kahdelta eri makumieleltä.
Ensimmäinen ongelma on, että käsittelemämme tiedot ovat suuria ulottuvuuksia. Esimerkiksi, jos jokainen paketti huomattiin 50 paikassa, tietojemme ulottuvuus olisi 100 - kuulostaa paljon, verrattuna käytettävissänne oleviin 200 näytteeseen.
Toinen ongelma: Eri lähetysreiteillä on tosiasiallisesti erilainen määrä havaintoja, joten emme voi yksinkertaisesti pinota luetteloita koordinaateilla edustamaan tietoja taulukkomuodossa (ja vaikka ne olisivat olleet, sillä ei silti olisi järkevää).
Kauppias rummuttaa kärsimättömästi pöytää sormillaan, ja datatieteilijä yrittää kovasti olla osoittamatta paniikin merkkejä.
Tällöin etäisyysmatriisit ja upotukset ovat käteviä. Meidän on vain löydettävä tapa vertailla kahta lähetysreittiä. Fréchetin etäisyys näyttää olevan järkevä valinta. Etäisyyden avulla voimme laskea etäisyysmatriisin.
Huomautus: Tämä vaihe voi viedä jonkin aikaa. Meidän on laskettava $ O (n ^ 2) $ -etäisyydet siten, että jokaisella etäisyydellä on $ O (k ^ 2) $ -toistoa, missä $ n $ on näytteiden määrä ja $ k $ on havaintojen määrä yhdessä näytteessä. Etäisyystoiminnon tehokas kirjoittaminen on avainasemassa. Esimerkiksi Pythonissa voit käyttää numba kiihdyttää tätä laskentaa moninkertaisesti.
Nyt voimme upottamisen avulla vähentää ulottuvuuksien määrää 200: sta vain muutamaan. Voimme selvästi nähdä, että kauppareittejä on vain muutama, joten voimme toivoa löytävänsä tiedon hyvän esityksen jopa kahdessa tai kolmessa ulottuvuudessa. Käytämme upotuksia, joista keskustelimme aiemmin: PCA, Kernel PCA ja MDS.
Alla olevista kaavioista näet merkitty reittitiedot (annettu esittelyn vuoksi) ja sen esitys upottamalla 2D- ja 3D-muotoisesti (vasemmalta oikealle). Leimattu tieto merkitsee neljä kauppapistettä, jotka on yhdistetty kuuteen kauppareittiin. Kaksi kuudesta kauppareitistä on kaksisuuntaisia, mikä tekee yhteensä kahdeksan lähetysryhmää (6 + 2). Kuten näette, saimme melko selkeän eron kaikista kahdeksasta 3D-upotuksella varustetusta lähetysryhmästä.
Tämä on hyvä alku.
Nyt olemme valmiita kouluttamaan upottamisen. Vaikka MDS osoitti parhaat tulokset, se on melko hidas; myös scikit-learnin toteutus ei tue näytteen ulkopuolista muunnosta. Se ei ole ongelma tutkimuksessa, mutta se voi olla tuotannossa, joten käytämme sen sijaan Kernel PCA: ta. Ytimen PCA: n osalta ei pidä unohtaa soveltaa etämatriisiin etukäteen radiaalista ydintä.
Kuinka valitset lähtöulottuvuuksien määrän? Analyysi osoitti, että jopa 3D toimii kunnolla. Asettaaksemme upotustulokseksi 10D vain olla turvallisella puolella äläkä jätä pois tärkeitä tietoja. Parhaan suorituskyvyn saavuttamiseksi lähtöulottuvuuksien määrä voidaan asettaa mallihyperparametriksi ja virittää sitten ristivalidoinnilla.
Joten meillä on 10 numeerista ominaisuutta, joita voimme käyttää tulona melkein mihin tahansa luokitusmalliin. Entä yksi lineaarinen ja yksi epälineaarinen malli: esimerkiksi logistinen regressio ja gradienttitehostus? Vertailun vuoksi käytämme myös näitä kahta mallia, joissa on täyden matriisin matriisi. Testataan sen päälle myös SVM (SVM on suunniteltu toimimaan suoraan etäisyysmatriisin kanssa, joten upottamista ei tarvita).
Testisarjan mallin tarkkuus on esitetty alla (10 juna- ja testiaineistoa luotiin, jotta voimme arvioida mallin varianssin):
Mallin tarkkuus
Tämän käyttötapauksen Python-koodi on saatavana GitHubista .
Olemme selittäneet, mitä upotukset ovat, ja osoittaneet, kuinka niitä voidaan käyttää etäisyysmatriisien kanssa reaalimaailman ongelmien ratkaisemiseen. Tuomion aika:
Ovatko upotukset jotain, mitä datatieteilijän tulisi käyttää? Katsotaanpa tarinan molempia puolia.
Plussat:
Haittoja:
Tätä lähestymistapaa käytettäessä menetämme välttämättä joitain tietoja:
Upotukset etäisyysmatriisien kanssa ovat uskomattoman hyödyllinen työkalu, jos satut työskentelemään monimutkaisten ei-numeeristen tietojen kanssa, varsinkin kun et pysty muuntamaan tietojasi suoraan vektoritilaan ja haluat mieluummin mallisi pienimittaisen syötteen.
Upottaminen on matalaulotteinen esitys tiedoista. Esimerkiksi maailmankartta on 2D-esitys maapallon 3D-pinnasta ja Diskreetti Fourier-sarja on ääretön ulotteinen ääni-aalto.
Upottaminen voi vähentää datan ulottuvuuksia ja säilyttää samalla tärkeät sisäiset suhteet datassa. Esimerkiksi maailmankartta säilyttää maastojen ja valtamerien suhteelliset sijainnit.
Algoritmien upottaminen ML: ään kuuluvat yleensä valvomattomaan oppimiseen. Ne työskentelevät merkitsemättömän datan suhteen, mutta vaativat hyperparametrien, kuten ulostulomittojen lukumäärän, manuaalisen asettamisen.
Korkeaulotteista tietoa voi olla vaikea analysoida, piirtää tai käyttää ML-mallin kouluttamiseen. Upottaminen voi vähentää ulottuvuuksien määrää ja yksinkertaistaa huomattavasti näitä tehtäviä datatieteilijälle.
Jotkin upotukset on suunniteltu toimimaan ei-numeeristen tietojen kanssa. Esimerkiksi kuuluisa upottava word2vec muuntaa sanat vektoreiksi. Tämä artikkeli näyttää, kuinka upotukset voivat toimia ei-numeeristen tietojen kanssa hyvin yleisissä asetuksissa.