Koneoppimismallit lintudatalle – jatkoa edelliseen

 

Koneoppimismallit lintudatalle – jatkoa edelliseen

Kirjoitin edellisen blogipostaukseni outliereiden löytämisestä lajihavaintodatasta. Kirjoitus on edelleen mainio, mutta sen jälkeen olen viritellyt mallejani lisää. Mallien uusimmat versiot ovat GitHubissa

Tässä blogipostauksessa esittelen vielä yhden menetelmän, joka käyttää kaikkien mahdollisten lajihavaintojen sijaan lintuatlas-aineiston pesimävarmuusindeksejä, eli tietoa kunkin lintulajin pesimistodennäköisyydestä 10 km x 10 km ruuduissa. Aineisto on mainio koneoppimisharjoituksiin, sillä se on järjestelmällisesti ja kattavasti kerätty ympäri Suomea ja sisältää myös ns. absence-dataa (= lintu ei todennäköisesti pesi ruudussa). 

 




Tämä menetelmä pohjautuu löyhästi kollegani Mikko Heikkisen aiempiin mallinnuksiin, joista lisää hänen blogissaan:

Data

Tätä menetelmää varten tarvitaan pohjaksi 10 km x 10 km YKJ-ruudukko, jonka voi ladata täältä. Ruudukko kattaa koko Suomen alueen ja se täydennetään lintuatlaksen rajapinnasta saatavilla kunkin lintulajin pesimävarmuusindeksitiedolla. Tämä vaatinee pientä skriptiä.

Kun satojen eri lintulajien pesimävarmuudet yhdistetään 3816 kymppiruutuun ympäri Suomea, tuloksena saa datasetin, jossa on n. 289 000 ruutua. Näistä suurin osa on tietenkin päällekkäisiä, yksi kullekin linnulle. Kullakin ruudulla on siis tieto linnun nimestä, id:stä, pesimävarmuudesta ja selvitysasteesta. Matalan selvitysasteen ruudut on jätetty pois ei niin luotettavina.

Tämän jälkeen jokainen ruutu rikastetaan selittävillä ympäristömuuttujilla:

  • Ruudun prosentuaaliset osuudet jokaiselle CORINE-maankäyttöluokalle. Voidaan laskea Zonal Statistics -työkalulla esim. QGIS:sä.
  • Keskimääräinen lämpötila, maksimipuuntilavuus ja keskimääräinen korkeus.
  • YKJ:n pohjois- ja itäkoordinaatit splittaamalla ”koordinaatit”-sarake kahteen sarakkeeseen.
  • Rantaviivan pituus ruuduissa skriptillä add_coastline_lenghths.py.

Ja lisäksi ”weight”-sarakkeeseen laskin painoarvon sen perusteella, kuinka suuri osa ruudusta on Suomen rajojen sisällä. Jos esim. vain 1 % ruudusta on Suomessa, ruudun painoarvo on 0.01.

Lopuksi jokaisen ruudun arvot näyttävät about tältä:



Lisäksi testidataksi tarvitset samanlaiset 3816 ruutua samanlaisilla selittävillä ympäristömuuttujilla, mutta ilman mitään tietoja linnuista. Tämmöisen saa luotua esim. täydentämällä YKJ-ruutuihin samat tiedot kuin aiemmin, tai poistamalla aiemmasta jättitiedostosta kaikki duplikaattigeometriat ja tiedot linnuista.

Dataa vois myös kysyä allekirjoittaneelta, niin pääsee helpommalla.

Koodin työvaiheet

  1. Ladataan molemmat tiedostot (289 000 ruutua, joissa tiedot linnuista ja ympäristöstä, sekä 3816 ruutua, joissa tiedot vain ympäristöstä). Jätetään pois linnut, joista on liian paljon tai liian vähän havaintoja.
  2. Seuraavat askeleet suoritetaan jokaiselle linnulle erikseen:
  3. Jaetaan aineisto koulutus ja testausdatoihin pesimävarmuusindeksin perusteella. Presence-dataa ovat varma ja todennäköinen pesintä, kun taas absence-dataa on epätodennäköinen ja mahdollinen pesintä, sekä tyhjät arvot.
  4. Normalisoidaan kaikki arvot välille 0–1.
  5. Etsitään parhaimmat hyperparametrit seuraaville malleille:
    • Random Forest Classified
    • Histogram Gradient Boosting Classifier
    • Logistic Regression (Eli käytännössä Maximum Entropy.
  6. Pyöräytetään mallit parhaimmilla hyperparametreillä ja tulostetaan tilastollisia tunnuslukuja mallin suorituksen arvioimiseksi. 
  7. Tulokset normalisoidaan ja niistä lasketaan keskiarvo. Kaikki tallennetaan uuteen GeoPackage-tiedostoon ja visualisoidaan. Koska vain testidatasta saa tuloksia, ne voi interpoloida jatkuvaksi tasoksi interpolate_results.py -skriptillä.

Kaikista kolmesta mallista keskiarvoistetut ja interpoloidut kartat näyttävät siis about tältä:

 

Tulokset

Tämän lähestymistavan merkittävin etu no se, että tuloksia on melko helppo arvioida tunnuslukujen avulla. Yleisesti ottaen mallit, joiden ROC AUC tai Accuracy on lähellä yhtä, ovat toimivia. Esim. kultarinnalle tunnusluvut ovat seuraavanlaiset:

  • Number of presence data: 663
  • Number of absent data: 3153
  • ROC AUC Random Forest: 0.9211
  • ROC AUC Histogram Gradient Boosting: 0.9186
  • ROC AUC MaxEnt: 0.9193
ROC AUC on tilastollinen tunnusluku, joka kuvaa mallin kykyä erotella positiiviset ja negatiiviset tapaukset oikein. Optimaalisessa tapauksessa ROC AUC on 1 ja huonoimmassa 0. Tämän esimerkin korkea ROC AUC -arvo viittaa siihen, että malli ennustaa pesimistodennäköisyydet tarkasti ja luotettavasti.

Miinukset

  • Ennustaa käytännössä lintujen pesimätodennäköisyyttä, ei niinkään lajin havainnon luotettavuutta. Esim. muuttolintuja voi havaita Etelä-Suomessakin, vaikka pesisi vain lapissa. Lisäksi jakoa presence-absence datoihin voisi miettiä lisää. Kumpaan luokkaan esim. ’mahdollinen pesintä’ kuuluisi?
  • Monissa lintuatlaksen lajeissa on joko liian vähän havaintoja, tai sitten ne kattavat koko Suomen, jolloin mallit antavat aina vääriä negatiivisia tuloksia.
  • Jos mallit aikoo pyöräyttää kaikille lintuatlaksen lajeille, siihen menee monta tuntia. Toki koodia helppo keventää jättämällä esim. Histogram Gradient Boostingin pois, joka tuottaa välillä outoja tuloksia. Tai sitten vähentämällä erilaisten hyperparametrien tai splittien määrää.
  • Voi yleistää liikaa, koska 10 km x 10 km ruudun sisälle mahtuu monenlaista habitaattia. Esim. saaristo leimautuu välttämättä merelliseksi alueeksi, vaikka saaressa olisikin suuri ja mukava metsäalue metsissä viihtyvälle linnulle.

Plussat

  • Kiva malli, koska yksittäisten havaintojen tarkkuus ei vaikuta niin paljoa 10 km x 10 km ruuduissa. Lisäksi lintuatlasdata on kerätty järjestelmällisesti ympäri Suomea.
  • Hyperparametrit voi määrittää automaattisesti ja tuloksia voi helposti verrata tunnuslukujen avulla.
  • Malli pyörii automaattisesti kaikille lintuatlaksen linnuille. Mallin voi toki keskeyttää ja jatkaa myöhemmin haluamastaan linnusta lisäämällä muutaman rivin koodia.
  • Lintuatlaksen data on vähemmän vääristynyttä, kuin moni muu lajihavaintodata.

Johtopäätös

Yleisesti ottaen tämä malli antaa hyviä tuloksia (ROC AUC > 0.8) lähes kaikille linnuille, jos rajaa liian harvinaiset / liian yleiset pois. Lintuatlaksen data on oivallista erilaisiin mallinnuksiin. Menetelmää voisi toki jatkojalostaa vielä paljon ja vertailla, millä aineistoilla ja muuttujilla saisi korkeimmat tunnusluvut.

Lisää infoa malleista GitHubissa.

Kommentit

Tämän blogin suosituimmat tekstit

Miksi paikkatietoa on niin vaikea löytää?

Paikkatietotekoäly olisi hieno

OGC API -paikkatietopalvelut