Poikkeamien tunnistaminen aikasarjadatasta

03.04.2020

Poikkeamien tunnistaminen aikasarjadatasta

Modernissa maailmassa dataa liikkuu valtavia määriä erilaisten tietojärjestelmien välillä. Valitettavasti kaikki ei aina suju kuin Strömsössä, vaan osa datasta voi jäädä matkalle, tulla tuplana tai olla muuten vaan viallista. Tästä aiheutuu merkittäviä ongelmia jatkoprosesseissa, jotka tarvitsevat luotettavaa dataa toimiakseen. Ongelmien selvittäminen ja korjaaminen (itse ongelman ja sen seurauksien) luonnollisesti maksavat rahaa.

Jos asia esitetään business kielellä, niin käyttökohteita voisivat ola vaikkapa IoT sensoridatan avulla mahdollistettava ennakoiva huolto tai verkkosivuston reaaliaikainen liikenteenseuranta (esim. varoitus liian suuresta liikenteestä normitilanteessa).

Seuraavassa blogissa kuitenkin pureudutaan uudelle alueelle, jossa koneoppimiseen perustuvaa poikkeamien tunnistusta on harvemmin käytetty – nimittäin datalatausten poikkeamiin ETL-prosessissa.

Eli jos tietovarastoon on tullut liian vähän tai liikaa dataa, niin edistynyt ”anomaly detection” systeemi nappaa ne kiinni automaattisesti. Ja tämä onnistuu tehdä lukuisille eri latauskohteille – ilman manuaalisia säätöjä.

Artikkelin sisältö

Ongelma

Silloin tällöin tulee vastaan tilanteita, joissa tietovaraston staging-alueen latauksissa tulee sisään virheellinen määrä rivejä. Tällainen tilanne voi esiintyä esimerkiksi XML-lähdetiedostojen osalta, kun luettavassa kohteessa esiintyy virheellinen määrä XML-tiedostoja. Tästä seuraa se, että tietovarastoon siirtyy liian vähän tai liikaa dataa. Huom! dataa kuitenkin siirtyy, eli tällainen virhe ei jää kiinni “ajojen kaatuminen” ylläpidossa.

Liian suuret datamäärät on usein helppo tunnistaa esimerkiksi hyvin määriteltyjen avaimien avulla. Sen sijaan puuttuvan datan tunnistaminen ja korjaaminen voi olla hankalaa. Joskus asia havaitaan vasta kuukausia virheen sattumisen jälkeen, jolloin korjauksestakin tulee isompi. Mitä nopeammin puute huomataan sen parempi.

Ongelman ratkaisu LSTM-neuroverkkoilla

Ei tarvitse olla datatieteilijä tunnistaakseen että edellä esitetty ongelma liittyy poikkeavien havaintojen etsimiseen (outliers). Tyypillisesti poikkeavia havaintoja pyritään löytämään ennustamalla tai aineistoon sovitettavan mallin avulla (sovite/rekonstruktio). Käsillä oleva ongelma uppoaa jälkimmäiseen kategoriaan.

Kun puhutaan aineiston rekonstruoinnista/poikkeavien havaintojen etsinnästä ei voi olla törmäämättä neuroverkkoihin. LSTM-neuvoverkkoja käytetään tyypillisesti aikasarjojen ennustamisessa/rekonstruoinnissa. Koska meillä on käsillä ongelma, joka voidaan formuloida aikasarja-kontekstiin, on luontevaa käyttää LSTM-neuroverkkoa.

Miten muodostaa aineisto?

Useissa tietovarastoissa on jokin auditointitaulu latauksista, josta saadaan poimittua staging-alueelle tulleet rivimäärät lähde/taulukohtaisesti, sekä latauksen ajanhetki (tässä esimerkissä päivämäärä).

Jos tietovaraston lataukset menevät päivittäin on syytä kerätä ns. business-kokonaisuuden perusteella taulut ja tehdä useampi lähdeaineisto analysoinnille/mallintamiselle. On hyvä huomata, että tässä kirjoituksessa esitetty ratkaisu ei toimi välittömästi, sillä latausajankohtia (rivejä) tulisi neuroverkolle syöttää “riittävästi”. Aluksi pitää siis odotella hetki datan kertymistä.

Kun auditointitaulusta on poimittu halutut tarkasteltavat lähteet, niin seuraavaksi käännetään rivit sarakkeiksi seuraavasti (pivotointi; riveillä päivämääräkohtaiset rivimäärät, sarakkeilla lähde):

Kuvassa on esitetty päivittäin eri tauluihin ladatut rivimäärät.

Kuten olettaa saattaa, on todella harvinaista, että muodostettu lähdeaineisto olisi täysin eheä. Kuvan esimerkissä puuttuu päivämääriä (joko latauksia ei ole suoritettu joka päivä tai lataukset ovat kaatuneet tarkasteltavien lähteiden osalta).

Mallinnuksen/rekonstruoinnin lähdeaineiston tulee esittää normaalia tilannetta; kaikki mennyt kuten pitää ~ rivimäärät ovat oikein. Tästä syystä lähdeaineistoon tulee väistämättä “ajallisia harppauksia”. Nämä aikahypyt on syytä pyrkiä ottamaan huomioon, joten muodostetaan joitakin lisämuuttujia aineistoon (esim. kuvaa kuinka monta päivää on kulunut edellisestä latauksesta ja mikä viikonpäivä on kyseessä)

Edellä mainittujen toimenpiteiden lisäksi on neuroverkkoja sovellettaessa yleensä syytä huomioida ns. ajallinen trendi (kyseisessä esimerkissä rivimäärät tyypillisesti vain kasvavat). Tämä voidaan huomioida laskemalla latuasvolyymien muutos edelliseen tapahtumaan.

Menetelmämmen testaamista varten jaetaan muodostettu aineisto kahteen osaan opetus- ja testiaineistoksi. Testiaineistossa, joka tulee oikeasta tietovarastosta, on kolme todellista latausvirhettä ja lisäski yksi virheetön, mutta selvästi poikkeava tapahtuma:

Rekonstruktion idea poikkeavien havaintojen etsimisessä?

Rekonstruktiossa pyritään luomaan aineistolle “hieman pelkistetty” malli, jonka sovitteita verrataan toteutuneisiin arvoihin. Mikäli sovitteen ja toteutuneen arvon välillä on riittävän suuri ero, voidaan kyseistä havaintohetkeä pitää poikkeavana (ainakin kandidaattina).

Se mikä on riittävä ero, riippuu tietysti monesta asiasta, mutta opetusajanjaksoilta voidaan rekonstruktion ja toteuman väliltä laskea jokin “metriikka” havaintopisteittäin ja tämän metriikan jakaumasta voidaan valita jokin raja-arvo.

Poikkeavien havaintojen etsinnässä rekonstruktioivan autoencoder neuroverkon rakenne on tyypillisesti seuraavan kaltainen. Ideana on aluksi “tiivistää” informaatiota pienentämällä verkon tasoja ja tämän jälkeen rekonstruoida tiivistetystä informaatiosta lähdedatan dimensioita vastaava aineisto. Tiivistämisellä saadaan ”pelkistetty” versio alkuperäisestä aineistosta, jolloin poikkeavien havaintojen tulisi nousta esille.

Wikipedia

Mallinnus ja tulokset

LSTM-malli muodostettiin siis yhteisesti jokaiselle aikasarjalle, käyttäen opetusdataa. Valmistuneen mallin avulla ennustettiin todennäköiset datapisteet testidatalle. Mikäli todellinen havainto ja ennustettu havainto olivat isosti ristiriidassa keskenään, niin silloin kyseessä oli mahdollisesti poikkeava havainto.

Mallinnus tehtiin kahdella tavalla, ilman kovariaatteja ja niiden kanssa.

Jos mallinnuksessa ei oteta huomioon dataan muodostettuja apumuuttujia (kovariaatteja), datasta löydetään 12 kappaletta poikkeamia. Näistä kuitenkin yhdeksän kappaletta on vääriä hälytyksiä:

Entäpä jos kovariaatit otetaan huomioon? Koska opetus- ja testiaineistossa on aikahyppyjä havaintojen väleillä, on syytä pyrkiä ottamaan hypyt huomioon kovariaattien avulla. Emme kuitenkaan pyri rekonstruoimaan kovariaattien arvoja, joten LSTM-mallin sijaan tämä hoidetaan toisella mallilla.

Kun kovariaatit huomioidaan, väärät hälytykset saadaan poistettua, yhtä lukuun ottamatta (tämä poikkeama oli tavallaan syytäkin havaita):

Tulokset ovat oikein hyvät; mallimme löytää kaikki poikkeamat, jotka sen kuuluikin löytää. Se että kuinka herkästi malli reagoi poikkeamiin odotetusta riippuu valitusta kynnysarvosta; mitä suurempi kynnysarvo asetetaan sitä isompi tulee poikkevan havainnon olla ja päinvastoin.

Kuvassa skaalatut aikasarjat 12:sta tietokantataulun latausmääristä, yhden kuukauden ajalta. Punaiset pystyviivat osoittavat ne aikapisteet, joissa on havaittu poikkeamia.

Yhteenveto

Vaikka tässä kirjoituksessa käsiteltiin ETL-latauksien poikkeavien rivimäärien löytämistä, soveltuu LSTM-neuroverkon avulla rekonstruointi useisiin analogisesti samankaltaisiin “ei-itseoppiviin” ongelmiin.

Tyypillisin sovelluskohde lienee vikaantumisen ennustaminen, jossa pyritään mallintamaan jonkin laitteen normaali käyttäytyminen (sensoreista); kun laitteessa alkaa ilmetä ongelmia alkavat rekonstruoidut arvot poiketa odotetusta.

Kirjoituksesta tarkasteltu aineisto on oikeaa ETL-latausten metadataa, johon on haasteen lisäämiseksi luotu lisäpoikkeamia. Erityisesti kovariaattien kanssa toteutettu malli oli niin hyvä, että sen avulla voitaisiin muodostaa automatiikka valvomaan ETL-latauksien datamääriä. Teknisesti ratkaisu voisi toimia on-premise, eli tietovarastopalvelimilla tai sitten pilvessä API-kutsuja hyödyntäen.

Jaa
Contact Person

Bloggaaja

Lasse Liukkonen

Senior Data Scientist

Vincit Bilot

Vincit ja Bilot ovat nyt virallisesti yhtä!

Toiminta jatkuu Vincit-nimen alla.

You have Successfully Subscribed!

Vincit Bilot

Vincit ja Bilot ovat nyt virallisesti yhtä!

Toiminta jatkuu Vincit-nimen alla.

You have Successfully Subscribed!