python-kieli ensikosketuksena ko- neoppimiseen

41
Evgen Heiskanen Python-kieli ensikosketuksena ko- neoppimiseen Metropolia Ammattikorkeakoulu Insinööri (AMK) Tieto- ja viestintätekniikka Insinöörityö 8.11.2021

Upload: others

Post on 23-May-2022

13 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Python-kieli ensikosketuksena ko- neoppimiseen

Evgen Heiskanen

Python-kieli ensikosketuksena ko-neoppimiseen

Metropolia Ammattikorkeakoulu

Insinööri (AMK)

Tieto- ja viestintätekniikka

Insinöörityö

8.11.2021

Page 2: Python-kieli ensikosketuksena ko- neoppimiseen

Tiivistelmä

Tekijä: Evgen Heiskanen

Otsikko: Python-kieli ensikosketuksena koneoppimiseen

Sivumäärä: 35 sivua

Aika: 8.11.2021

Tutkinto: Insinööri (AMK)

Tutkinto-ohjelma: Tieto- ja viestintätekniikka

Ammatillinen pääaine: Ohjelmistotuotanto

Ohjaajat: Lehtori Vesa Ollikainen

Insinöörityön tavoitteena on arvioida Python-kielen koneoppimiskirjastojen käyttöä

ensikosketuksena koneoppimiseen. Soveltuvuutta arvioidaan datan käsittelyn help-

pouden, analyysityökalujen kattavuuden sekä datan ja tulosten visualisointimahdolli-

suuksien näkökulmasta.

Tapausesimerkkinä käytetään Tilastokeskuksen aikasarja-aineistoa kotitalouksien tu-

lonjakoa kuvaavan Gini-indeksin kehityksestä. Työn tuotoksina saadaan sovellus,

joka toteuttaa koneoppimisprosessin relaatiotietokantahausta tulosten visualisointiin

sekä arvio Python-kielen soveltuvuudesta koneoppimisen ensimmäiseksi työväli-

neeksi.

Avainsanat: python, koneoppimiskirjasto, lineaarinen regressio, pan-

das, matplotlib, Gini-kerroin, tilastot

Page 3: Python-kieli ensikosketuksena ko- neoppimiseen

Abstract

Author: Evgen Heiskanen

Title: Python as a Prelude to machine learning

Number of Pages: 35 pages

Date: 8 November 2021

Degree: Bachelor of Engineering

Degree Programme: Information and communication technologies

Professional Major: Software Engineering

Supervisor: Vesa Ollikainen, Senior Lecturer

The aim of the study was to evaluate the use of Python machine learning libraries in a

process of machine learning as a prelude. The suitability was assessed in terms of and

result visualization capabilities.

As a case study, Statistics Finland's time series data on the development of the Gini

index describing household income distribution were used. The outcome of the study

is an application that implements the machine learning process from relational data-

base search to visualization of results as well as an assessment of the suitability of

Python as the first tool for machine learning.

Keywords: Python, machine learning library, linear regression, pan-

das, matplotlib, Gini coefficient, statistics

Page 4: Python-kieli ensikosketuksena ko- neoppimiseen

Sisällys

1 Johdanto 1

2 Koneoppiminen 3

2.1 Koneoppimisen historia 4

2.2 Lineaarinen regressio 6

2.3 Logistinen regressio 8

2.4 Päätöspuut 8

2.5 K:n lähimmän naapurin menetelmä 9

2.6 Naiivi Bayes-luokittelija 9

3 Tietokanta ja sen luominen 10

3.1 Tilastokeskuksesta saatavat tiedot 10

3.2 Tietokannan luominen MySQL Command Line Client -ohjelmointiympäristössä 10

4 Datan käsittely Pythonissa 12

4.1 Työskentely-ympäristöt 12

4.2 Datan käsittelykirjastot 13

4.3 Koneoppimiskirjastot 13

4.4 Visualisointikirjastot 14

5 Pythonin ohjelmointi ja mallinnus 14

6 Visualisointi 27

7 Työkalujen arviointi 31

8 Yhteenveto 31

Lähteet 33

Page 5: Python-kieli ensikosketuksena ko- neoppimiseen

1

1 Johdanto

Viime aikoina Pythonista on tullut suosituin ohjelmointikieli. Tämä johtuu siitä,

että Pythonilla on helppo kirjoittaa ja se on erittäin joustava. Python on erityisen

suosittu matematiikassa ja erilaisissa tilastollisissa tutkimuksissa. Tämä johtuu

siitä, että Python sisältää suuren määrän matemaattisia ohjelmakoodikirjastoja.

Pythonin perustaja on Alankomaista kotoisin oleva ohjelmoija Guido van Ros-

sum. Python oli luotu vuonna 1991 ja sitä on siitä lähtien kehitetty nopeasti ja

tehokkaasti. (1.)

Tärkeää on se, että Pythonista on tullut monipuolinen kieli ohjelmistokehityk-

seen kuten pelien tuottamiseen, web-kehitykseen, erilaisten sovellusten kehittä-

miseen, graafisiin käyttöliittymiin jne. Pythonin ohjelmointikirjastoa Qiskit voi

käyttää jopa kvanttitietokoneessa. (2.) Python tarjoaa käyttäjälle monia mahdol-

lisuuksia toisiin ohjelmointikieliin verrattuna.

Yleensä Pythonin vahvuudet ovat seuraavat.

• Monenlaisia kirjastoja, erityisesti math-kirjastoja, kuten NumPy ja Pandas.

• Hyvät työkalut visualisointiin, kuten matplotlib.pyplot.

• Pythonille on olemassa erittäin tehokkaita ohjelmointiympäristöjä, kuten Spyder ja Jupyter Notebook.

• Pythonilla voidaan helposti käsitellä XML-koodia.

• Pythonilla koodi on lyhyempi kuin Javalla tai C:lla. Sen takia ohjel-mointikieli sopii aloittelijalle erinomaisesti. Kieltä on helppo koodata ja oppia. Ohjelmoija voi kirjoittaa Pythonilla nopeammin, kuin Javalla tai C:lla.

• Python-kielellä voidaan kuvata koko datan analyysiprosessi.

• Tuottavuus, koska ohjelmoijalta kuluu pienempi aika koodin luomi-seen ja kirjoittamiseen.

Yleisesti Python on integroitava, interaktiivinen, tehokas ja oliopohjainen ohjel-

mointikieli. (3.) Maailmassa toimii niin sanottu Python Software Foundation -

Page 6: Python-kieli ensikosketuksena ko- neoppimiseen

2

yhteisö. (4.) Tämä yhteisö on Python-version 2.1 ja sitä uudempien omistaja.

Yhteisön päätehtävä on avoimen lähdekoodin teknologian edistäminen. Lisäksi

yhteisö mainostaa kielen käytön mahdollisuuksia ja ominaisuuksia. Python-oh-

jelmien suoritus on yleensä melko nopeaa. Joskus Python toimii hitaammin kuin

esimerkiksi Java tai C. Mutta monessa tapauksissa Pythonin tuottavuus on to-

della tehokas. Tähän vaikuttavat ensisijaisesti Pythonin laajat matemaattiset kir-

jastot, kuten NumPy ja Pandas. Python toimii myös hyvin, kun pitää käyttää oh-

jelmointirajapintoja.

Todetaan, että sekä Windows- että Linux-käyttöjärjestelmissä Pythonin käyttö

on mahdollista. Kieltä käytetään myös tehokkaasti järjestelmänhallintaan.

Google, Yahoo ja Lucasfilm Ltd käyttävät Pythonia. (2.)

Mediajätti YouTube on kokonaisuudessaan luotu ja kirjoitettu Pythonilla. Kiin-

nostavaa on, että Pythonilla on luotu versiohallinnan sivusto Bitbucket. Kieli so-

pii erinomaisesti Web-ohjelmoinnin prosessien toteutukseen. Myös Nasa käyt-

tää Pythonia aktiivisesti. (5.)

Tässä työssä arvioidaan Python-kielen koneoppimiskirjastojen soveltuvuutta ko-

neoppimisongelmien ratkaisemiseen. Tätä tarkoitusta arvioidaan datan käsitte-

lyn helppouden, analyysityökalujen kattavuuden sekä datan ja tulosten visuali-

sointimahdollisuuksien näkökulmasta. Python toimii ensimmäisen koneoppimis-

projektin toteutusympäristönä todella hyvin, koska se sopii datan käsittelyyn

erinomaisesti. Esimerkkinä käytetään Tilastokeskuksen aikasarja-aineistoa koti-

talouksien tulonjakoa kuvaavan Gini-indeksin kehityksestä.

Työ edellyttää riittävän laajan tietokannan luomista, jota myöhemmin käsitellään

Python-ohjelmalla Anaconda-ohjelmointiympäristössä. Edellä esitetystä seuraa,

että työssä käytetään koneoppimismenetelmiä. Koneoppimismenetelmistä line-

aarisella regressiomenetelmällä on erityinen merkitys, koska sen avulla voidaan

havainnoida eri muuttujien välisiä riippuvuuksia. Tähän analyysiin osallistuvat

sellaiset Pythonin matemaattiset kirjastot kuten Numpy, Pandas ja Sklearn.

Page 7: Python-kieli ensikosketuksena ko- neoppimiseen

3

Luku 2 toimii teoriakatsauksena koneoppimismenetelmiin. Tämän jälkeen kuva-

taan ohjelmiston rakentaminen ja arviointi, joka koostuu kolmesta vaiheesta.

Ohjelmiston rakentamisen ensimmäinen vaihe edellyttää, kuten jo todettiin, tie-

tokannan luomista. Sitä varten käytetään SQL-kieltä MySQL-komentorivitulkin

kautta. Tämä esitellään luvussa 3.

Toisessa vaiheessa on tarkoituksena kirjoittaa itse Python-ohjelma Anaconda-

ohjelmointiympäristössä sekä käyttää erilaisia mallintamismenetelmiä. Luvussa

4 esitellään Pythonin koneoppimiskirjastoja ja luvussa 5 laaditaan lineaarinen

regressiomalli.

Sen jälkeen kolmannessa vaiheessa visualisoidaan tuloksia ja tehdään niistä

johtopäätöksiä (luku 6). Visualisoinnissa käytetään Pythonin kirjastoa MatPlot-

Lib.

Lopuksi luvussa 7 arvioidaan Pythonin ja sen kirjastojen soveltuvuutta ensim-

mäisen koneoppimisprojektin toteutusympäristöksi.

Opinnäytetyön tuloksia voidaan hyödyntää harkittaessa toteutusympäristöä ko-

neoppimisprojektille. Erityisesti työ toimii esimerkkinä taloustieteellisen aineiston

analysoinnista Python-kirjastoilla.

2 Koneoppiminen

Tämän luvun tarkoituksena on tarjota yleiskuva koneoppimismenetelmistä. Tätä

varten kerrotaan koneoppimisen historiasta ja menetelmistä.

Page 8: Python-kieli ensikosketuksena ko- neoppimiseen

4

2.1 Koneoppimisen historia

Usein koneoppimisella tarkoitetaan teknologioita, jotka antavat ohjelmoijalle

mahdollisuuden ratkaista erilaisia ongelmia virheet minimoivien ja itseoppimi-

seen kykenevien ohjelmien avulla. (6.)

Koneoppimisen tutkimus aloitettiin useita vuosia sitten. Tekoälyn pioneeri Arthur

Samuel julkaisi ensimmäisen artikkelin vuonna 1959. (7.) Kuuluisat tutkijat Pro-

vost ja Kohavi jo kauan sitten määrittelivät koneoppimisen teknologiaksi, joka

kykenee ennakoimaan ohjelman tulevaa käyttäytymistä. (8.)

Kansainvälisen tiedeyhteisön mukaan koneoppiminen on tekoälyn osa-alue.

Voidaan todeta, että tekoäly (artificial intelligence) pystyy simuloimaan ihmisten

älykkyyden ominaisuuksia. (1.) Tämän jälkeen kaikki älykkyyteen liittyvät pro-

sessit voitaisiin luoda uudelleen tietokoneilla. Tässä tapauksessa otetaan huo-

mioon binäärijärjestelmän pohjalta rakennetun konelogiikan erityispiirteet. Sillä

tavalla tietokone käsittää tietoja ja samanaikaisesti jäljittelee ihmisen älykkäitä

tekoja. Nämä teot sisältävät tehtävien ratkaisemista ja päätöksien löytämistä.

On olemassa kahdenlaista tekoälyä: heikkoa ja vahvaa. Heikon tekoälyn syno-

nyymi on kapea tekoäly.

Vahvan tekoälyn ominaisuudet ovat samanlaisia kuin ihmisten kognitiiviset ky-

vyt. Voidaan sanoa, että vahva tekoäly ei vaadi ohjelmoijan väliintuloa ohjelman

suoritusprosessissa, mutta heikko tekoäly merkitsee aina kehittäjän suoraa

osallistumista.

Tämä koskee tietysti ensisijaisesti robotiikkaa. Tällaiset tekniikat eivät vaadi

henkilön läsnäoloa joka minuutti. Ehkä jossakin ei kovin kaukana tulevaisuu-

dessa robotit pystyvät kehittämään itseään. Yhteiskunta on kuitenkin jo nyt

Page 9: Python-kieli ensikosketuksena ko- neoppimiseen

5

lähestymässä teknisen ainutlaatuisuuden tilaa. Tällaisessa tilanteessa teko-

älystä tulee inhimillisen kehityksen menestyksen pääedellytys.

Tekoälyn nykyaikaisista saavutuksista voidaan mainita sellaisia teknisiä läpi-

murtoja kuin konenäkö, automaattisten planeettojenvälisten ajoneuvojen hallinta

ja keinotekoisten elinten viljely.

Tietotekniikan kehitys alkoi lähinnä von Neumannin ajatuksesta. Vuonna 1946

von Neumann ja muut tutkijat hahmottivat tietokoneen toiminnan perusperiaat-

teet. Erityisen tunnettu on periaate ohjeiden ja tietojen tallentamisesta tietoko-

neen muistiin. (9.) Sen jälkeen koneoppimisessa tapahtui 1900-luvun lopulla

teknologinen läpimurto. 1900-luvun jälkipuoliskolla ohjelmoija sai uusia työka-

luja ja menetelmiä. Se mahdollistaa laskelmien suorittamisen uudella tasolla.

Koneoppimisalgoritmit voidaan luokitella seuraavasti:

a) Ohjattu oppiminen — Ennalta suunniteltu ohjelman tulos on odotettavissa. Se

vaatii aina ihmisten läsnäoloa. Mitä enemmän opetustietoja ja aikaa käytetään,

sitä parempi on odotettu tulos. (4.)

b) Ohjaamaton oppiminen — Ohjelman lopputulosta ei tiedetä etukäteen. Oh-

jelma kehitetään itse. Ohjelma voi luoda mallin ja etsiä ratkaisuja. Tämä mene-

telmä ei vaadi ihmistä. (10.)

c) Vahvistusoppiminen — Mallit ja ympäristö ovat vuorovaikutuksessa. Tässä

tapauksessa etsitään parasta tehokkuutta. Samaan aikaan tutkijan on parannet-

tava ohjelman tuloksia jokaisella uudella kierroksella. (11.)

Yleisesti koneoppiminen pohjautuu vahvasti tilastotieteen menetelmiin. Tilasto-

tieteen alan tutkimuksissa lineaarisella regressiolla on keskeinen rooli. Koneop-

pimisessa käytetään sellaisia tekniikoita kuin lineaarinen regressio, logistinen

Page 10: Python-kieli ensikosketuksena ko- neoppimiseen

6

regressio, päätöspuut, k:n lähimmän naapurin menetelmä ja naiivi Bayes-luokit-

telija.

Tämä työ edellyttää ensisijaisesti lineaarisen regression käyttöä. Se on yksi

suosituimmista koneoppimismenetelmistä. Lisäksi luodaan katsaus muihin ko-

neoppimisen menetelmiin kuten logistinen regressio. Nämä metodit muodosta-

vat tutkimuksen teoreettisen taustan.

2.2 Lineaarinen regressio

Lineaarisella regressioanalyysillä tarkoitetaan ”tilastollista analyysimenetelmää,

jossa kerätyn aineiston perusteella ohjelma estimoi tarkasteltavan vastemuuttu-

jan lineaarista riippuvuutta selittävistä muuttujista”. (12.)

Pohjimmiltaan lineaarinen regressio on matemaattisten odotusarvon poik-

keamien neliöiden minimointia. Tätä menetelmää käytetään monella tieteen-

alalla. Lineaarista regressiota käytetään jopa tekoälymalleissa, mukaan lukien

hermoverkot.

Regressioanalyysin avulla voidaan ymmärtää, miten selittävät muuttujat vaikut-

tavat selitettävään muuttujaan. Voi olla tapaus, jossa on vain yksi selittävä

muuttuja ja selitettävä muuttuja (vastemuuttuja). Siinä tapauksessa analyysiä

kutsutaan yksinkertaiseksi lineaariseksi regressioksi. Englanniksi se tarkoittaa

”simple linear regression”. Yleisesti ottaen yksinkertainen lineaarinen regres-

siokaava on:

𝑌 = a + bX

jossa Y on vastemuuttuja, X selittävä muuttuja, a vakiotermi ja 𝑏 regressioker-

roin.

Tässä insinöörityössä tarkastellaan, miten käytettävistä olevasta rahasta, tuo-

tannontekijätulosta ja bruttorahatulosta lasketut Gini-kertoimet liittyvät toisiinsa.

Page 11: Python-kieli ensikosketuksena ko- neoppimiseen

7

On tärkeää huomata, että tämän tutkimuksen tarkoituksena ei ole tulkita talous-

suhteita, mutta niiden ymmärtäminen on välttämätöntä lineaaristen regressioyh-

tälöiden rakentamiseen tarvittavien funktioiden oikean määrittelyn kannalta.

Tutkimuksessa käytetään siis kolmea muuttujaa, joita ovat käytettävissä olevat

rahatulot, bruttorahatulot ja tuotannontekijätulot. Jokaiselle näistä taloudellisista

indikaattoreista laskettiin Gini-kerroin, joka luonnehtii omaisuuden kerrostumis-

tasoa yhteiskunnassa. Kuten taloustieteestä tiedetään, tuotannontekijätulot tar-

koittavat palkka-, yrittäjä- ja omaisuustuloja. (13.)

Toiminnallisesti nämä indikaattorit määritellään seuraavien funktioiden F kautta

(13.):

1) käytettävissä olevat rahatulot = F (bruttorahatulot)

jossa käytettävissä olevat rahatulot on selitettävä (riippuva) muuttuja, ja brutto-

rahatulot on selittävä (riippumaton) muuttuja

2) bruttorahatulot = F (tuotannontekijätulot)

jossa bruttorahatulot edellisen kommentin mukaisesti

Monimuuttujaregression laskeminen on mahdotonta, kun käytetään funktioita

”käytettävissä olevat rahatulot = F (bruttorahatulot, tuotannontekijätulot)”, koska

tässä tapauksessa syntyy multikollineaarisuus. Syynä on se, että bruttorahatu-

lojen ja tuotannontekijä-tulojen parametrien välillä on yhteys. Tilanteessa, jossa

lineaarisen regressioyhtälön riippumattomien muuttujien välillä on suhde, muo-

dostuu aina multikollineaarisuutta. (14.) Tärkeää on se, että multikollineaarisuus

on regressiomallin kannalta ongelmallista: regressiokertoimet riippuvat toisis-

taan ja yksittäisen muuttujan merkityksen arviointi on vaikeaa.

Yllä olevat yhtälöt on esitetty vain siksi, että voimme selittää insinöörityössä ke-

hitetyn lineaarisen regression mekanismin. Tämän esimerkin avulla voidaan tar-

kastella Python-ohjelmointikirjaston toimintaa, mikä on tutkimuksen päätavoite.

Page 12: Python-kieli ensikosketuksena ko- neoppimiseen

8

Käytännössä koneoppimisessa käytetään tietojen analysointiin myös muita ma-

temaattisia menetelmiä. Niistä esitellään logistinen regressio, päätöspuut, k:n

lähimmän naapurin menetelmä sekä naiivi Bayes-luokittelija.

2.3 Logistinen regressio

Koneoppimisen seuraava menetelmä on logistinen regressio (logistic regres-

sion). Tässä matemaattisessa menetelmässä muodostetaan tilastollinen malli.

(15.)

Tässä tapauksessa riippuvalla muuttujalla on kaksi arvoa. Se on niin sanottu di-

kotominen muuttuja. Tälle parametrille on ominaista se, että sillä on kaksi luok-

kaa. Funktio on siis binäärinen. Selitettävä muuttuja saa arvon 0 tai 1, eikä

muita arvoja ole. Logistisella regressiolla on omat piirteensä, jotka erottavat

sen lineaarisesta regressiosta. Lisäksi voidaan todeta, että logistinen regressio-

malli on yleistetty lineaarinen malli. (9.) Virallisen määritelmän mukaan logisti-

sella regressiossa ”selittävät muuttujat voivat olla suhdeasteikollisia, järjestysas-

teikollisia tai luokiteltuja”. (16.)

2.4 Päätöspuut

Myös päätöspuita käytetään koneoppimisessa. Lyhyesti sanoen koneoppimis-

ohjelma muodostaa päätöspuun rakenteen sillä tavalla, että puun oksat tarkoit-

tavat erilaisia empiirisiä ominaisuuksia ja lehtisolmut tarkoittavat loppupäätök-

siä.

Päätöspuu on datan perusteella rakennettu malli. Päätöspuussa on olemassa

niin sanottu kohdemuuttuja, joka voi olla diskreetti. Silloin päätöspuu on luon-

teeltaan luokittelupuu. Kiinnostavaa on se, että päätöspuuta voidaan käyttää

sekä numeerisen arvon ennustamiseen lineaarisen regression tapaan että luo-

kittelumenetelmänä. Molemmat metodit kuuluvat koneoppimisen suosituimpiin

menetelmiin. (16.)

Page 13: Python-kieli ensikosketuksena ko- neoppimiseen

9

2.5 K:n lähimmän naapurin menetelmä

K:n lähimmän naapurin menetelmää käytetään melko usein koneoppimisen tut-

kimuksissa. Se on metodi, joka tekee luokittelun sen perusteella, mihin luok-

kaan lähimmät opetusjoukon havainnot kuuluvat. Tätä läheisyysperiaatetta so-

velletaan kaikkiin luokiteltaviin havaintoihin. (17.)

Jos ohjelmoija käyttää luokittelumenetelmää, havainto määritetään luokkaan,

joka on yleisin annetun elementin k -naapureiden ryhmässä, jonka luokat ovat

jo tiedossa. Mutta jos k:n lähimmän naapurin menetelmää käytetään regressio-

menetelmänä, arvoksi ennustetaan k:n lähimmän opetusjoukon havainnon kes-

kiarvo, joka on helposti laskettavissa. (18.)

Yksinkertaisuudestaan huolimatta menetelmä on suosittu, koska se toimii

useissa käytännön ongelmissa hyvin.

2.6 Naiivi Bayes-luokittelija

Koneoppimisessa naiivi Bayes-luokittelija on harvemmin käytetty menetelmä

kuin esimerkiksi lineaarinen regressio. Menetelmä perustuu Bayesin teoree-

maan. Teoreema edellyttää sitä, että jokaisen luokan kohdalla estimoidaan se-

littävien muuttujien jakaumat käyttäen normaalijakaumaoletusta. Tämän toimi-

tuksen jälkeen voidaan laskea todennäköisyydet eri luokkiin kuulumiselle. Naiivi

Bayes-luokittelija antaa mahdollisuuden tutkia erilaisia dataryhmiä.

Menetelmän vahvuutena on, että naiivi Bayes-luokittelija toimii hyvin monenlais-

ten aineistojen kohdalla, vaikka riippumattomuusoletus ei toteutuisikaan. (19.)

Selittävien muuttujien ei tarvitse olla toisistaan riippuvia.

Page 14: Python-kieli ensikosketuksena ko- neoppimiseen

10

3 Tietokanta ja sen luominen

Tässä luvussa kuvataan relaatiotietokannan rakentaminen koneoppimisprojek-

tia varten.

3.1 Tilastokeskuksesta saatavat tiedot

Tietokannan luominen alkaa relaatiotietokannan hallintajärjestelmän valinnalla.

Soveltuvia ovat MS SQL, Oracle Database, MySQL, IBM Db2, Amazon Relati-

onal Database Service (RDS), PostgreSQL, SAP HANA, Amazon Aurora. (20.)

MySQL valittiin toimivaksi tietokannaksi, koska MySQL:lle on ominaista nopea

työnopeus tietojen lukemisessa ja yleensä korkea toimivuus. Lisäksi MySQL in-

tegroituu tehokkaasti Pythoniin.

Koneoppimisprojektit vaativat yleensä melko suuren tietokannan. Tästä syystä

hankkeen alussa oli tarpeen luoda MySQL-tietokanta.

Hankkeessa luodaan ohjelma lineaarisen regression laskemiseksi ja visualisoi-

miseksi. Tämä edellyttää suuren määrän tilastotietojen käyttöä.

Kaikki tiedot on saatu Tilastokeskuksesta tietosarjasta. Tilastokeskuksesta ha-

ettu data on kokonaisuudessaan HTML-muodossa. (21.)

Data-taulukoissa jokaiselle näistä taloudellisista indikaattoreista (käytettävissä

olevat rahatulot, tuotannontekijätulot, bruttotulot) laskettiin Gini -kerroin. Näitä

indeksejä käytetään edelleen matemaattiseen käsittelyyn Python-ohjelmistokir-

jastojen avulla.

3.2 Tietokannan luominen MySQL Command Line Client -ohjelmointiym-päristössä

Kuten jo todettiin, tietokanta luotiin MySQL-komentotulkissa SQL-kieltä käyt-

täen. Kaikki Tilastokeskuksesta saadut tiedot on siirretty MySQL-tietokantaan.

Page 15: Python-kieli ensikosketuksena ko- neoppimiseen

11

MySQL-tietokannan nimi on STATISTIC_X. MySQL on perinteinen tiedonhallin-

taohjelma, joka ei ole menettänyt merkitystään tähän asti. Mainittua ohjelmistoa

käytetään insinöörityön kaikissa laskelmissa.

Kaikki tilastotiedot syötetään tähän tietokantaan niiden myöhempää käsittelyä

varten Python-ohjelmassa.

Kuvassa 1 on tietokanta STATISTIC_X, jossa on Gini-kertoimen arvot. Kussa-

kin sarakkeessa Gini-kerroinarvot lasketaan eri indikaattoreiden perusteella (ra-

hatulot, tuotannontulot, bruttotulot).

Gini -kerroin osoittaa sosiaalisen eriarvoisuuden asteen. Se vaihtelee nollasta

yhteen. Mitä lähempänä ollaan kerrointa 1, sitä suurempi on sosiaalinen eriar-

voisuus. Tämä tarkoittaa, että kaikki tulot yhteiskunnassa keskittyvät kapean ih-

misryhmän käsiin. (22.)

Gini -kerroin voidaan näyttää prosentteina. Tässä muodossa Gini -kerroin on

ymmärrettävämpi lukijalle.

Gini -kerroin voidaan laskea kaavalla (23.):

𝐺 = 1 − ∑(

𝑛

𝑘=2

𝑋𝑘 − 𝑋𝑘−1)(𝑌𝑘 + 𝑌𝑘−1)

jossa 𝐺 Gini-kerroin, 𝑋𝑘 väestön osuus tulojen kasvun mukaan, 𝑌𝑘 on tulojen

osuus, joka saa 𝑋𝑘, ja n on kotitalouksin lukumäärä.

Page 16: Python-kieli ensikosketuksena ko- neoppimiseen

12

Kuva 1. Tietokannan sisällys.

4 Datan käsittely Pythonissa

4.1 Työskentely-ympäristöt

Pythonissa tietojen käsittelyyn ja ohjelmointiin on olemassa ohjelmointiympäris-

töjä, joista Anaconda on kenties tehokkain. Anacondalla on käyttäjäystävällinen

sisäinen rakenne ja monipuolinen käyttöliittymä. Se helpottaa kirjastojen asen-

nusta. Monet kirjastosta voidaan helposti asentaa conda install -komennolla.

Page 17: Python-kieli ensikosketuksena ko- neoppimiseen

13

On suositeltavaa aloittaa työskentely Anacondan kanssa kytkemällä Anaconda

Navigator -järjestelmä päälle. Tässä järjestelmässä käyttäjä voi löytää käteviä

ohjelmointiympäristöjä, kuten Spyderin ja JuPyTer Notebookin.

Spyder on tehokas integroitu ohjelmointiympäristö, joka on erityisen hyödyllinen

matemaattisessa tutkimuksessa. JuPyTer Notebook on selainpohjainen sovel-

lus ja tarjoaa runsaasti mahdollisuuksia koodin näyttämiseen ihmisen luetta-

vassa muodossa. JuPyTer Notebook on koneoppimisessa suosittu siitä syystä,

että se sallii ohjelmakoodin, välitulosten ja lopputulosten esittämisen ja muok-

kaamisen samassa dokumentissa.

4.2 Datan käsittelykirjastot

Ohjelmoinnissa Pythonissa on käytettävässä erilaisia ohjelmakoodikirjastoja.

Tässä projektissa käytetään aktiivisesti sellaisia kirjastoja kuin Pandas

(https://pandas.pydata.org/ ) ja NumPy (https://numpy.org/ ). Voidaan todeta,

että NumPy palvelee erilaisia matemaattisia laskelmia ja Pandas tarjoaa erityi-

siä tietorakenteita ja toimintoja numeeristen taulukoiden ja aikasarjojen käsitte-

lyyn. Samaan aikaan Pandas on korkeamman tason kirjasto, ja sen kanssa

työskentely perustuu NumPy-kirjastoon. Esimerkiksi Pandas-kirjaston avulla

voidaan käyttää sellaisia tärkeitä metodeja kuin pd.read_sql() ja pd.Da-

taFrame(), joita tarvitaan DateFrame-olion luomiseen. Kuten tiedetään, Da-

taFrame on kaksiulotteinen taulukko, jonka tietorakenne on kätevä Pythonin

matemaattiseen jatkokäsittelyyn. (24.)

4.3 Koneoppimiskirjastot

Lisäksi käsittelykirjastoja Sklearn (Scikit-learn), Keras ja TensorFlow käytetään

koneoppimisprosessien toteuttamiseen. Niistä Sklearn sisältää erilaisia luokitus-

, regressio- ja klusterointialgoritmeja. Keras tarjoaa työkalut keinotekoisten her-

moverkkojen kanssa työskentelyyn. Keras on lisäosa TensorFlow-ohjelmistoke-

hyksen päälle. Käsittelykirjastoa TensorFlow käyttää erityisesti Google-yritys

Google Brian -projektissa keinotekoisten hermoverkkojen kouluttamiseen. (25.)

Page 18: Python-kieli ensikosketuksena ko- neoppimiseen

14

Jälkimmäinen seikka on erityisen mielenkiintoinen tekoälyjärjestelmien toteutta-

misessa.

Scikit-learn on kirjoitettu pääasiassa Pythonilla ja käyttää NumPy-kirjastoa laa-

jasti korkean suorituskyvyn lineaarisessa algebrassa ja matriisitoiminnoissa. Li-

säksi joitakin perusalgoritmeja on kirjoitettu Cython-kielellä suorituskyvyn paran-

tamiseksi. Cython on ohjelmointikieli, jonka avulla Pythonille on helppo kirjoittaa

C/C++-koodimoduuleja. Python-syntaksin lisäksi tuetaan suorita kutsuja C/C++-

funktioihin ja metodeihin. (25.)

4.4 Visualisointikirjastot

Visualisointi on tärkeää tutkimustulosten graafiselle esittämiselle. Sen ansiosta

koneoppimisprosessit ovat tulossa visuaalisemmiksi ja luettavammiksi. Visuali-

sointimahdollisuuksia tarjoavia kirjastoja ovat ensinnäkin Matplotlib

(https://matplotlib.org/ ) ja Seaborn (https://seaborn.pydata.org/ ). Matplotlib on

kirjasto tietojen visualisoimiseksi 2D-grafiikan keinoin Python-ohjelmointikielellä

(myös 3D-grafiikkaa tuetaan). Tuloksena olevia kuvia voidaan käyttää julkaisu-

jen kuvituksina. Seaborn on yhtä voimakas kuin matplotlib, mutta se tarjoaa

enemmän metodeja kaavioiden piirtämisen helpottamiseksi. (26.)

Matplotlib on Python-datavisualisointityökalujen päätyökalu, jota käytetään

tässä tutkimuksessa. Se on vielä nykyäänkin suosituin Python-pohjainen visu-

alisointikirjasto. Se on kehitetty läheisesti muistuttamaan 1980-luvulla käytettyä

MATLAB-ohjelmointikieltä. (26.) Olosuhteisiin nähden se on ensimmäinen datan

visualisointiin tarkoitettu kirjasto Pythonille.

5 Pythonin ohjelmointi ja mallinnus

Lineaarinen regressiomallinnus voidaan suorittaa tehokkaasti Pythonin avulla.

Se on koneoppimisen päämenetelmä tässä työssä. Kuten jo on kerrottu työn

alussa, tutkimuksen päätavoite on Pythonin käsittelykirjastojen

Page 19: Python-kieli ensikosketuksena ko- neoppimiseen

15

käyttökelpoisuuden tutkiminen ja arviointi. Arviointia tehdään ensimmäisen ko-

neoppimisprojektin näkökulmasta.

Tässä insinöörityössä käytetään Anaconda-ohjelmointiympäristöä. Kaikki ohjel-

mointi suoritetaan Anacondan tarjoamassa Spyder IDE (Python 3.8) -kehitti-

messä. Tämä ohjelmointiympäristö valittiin siksi, että Spyder IDE erottuu no-

peudellaan ja tehokkuudellaan matemaattisissa laskelmissa. Spyder on suunni-

teltu erityisesti matemaattiseen ohjelmointiin.

Kuten jo todettiin, tehokkain tapa on ottaa Spyder käyttöön Anaconda Navigato-

rin kautta. Työ suoritetaan tietokoneen järjestelmänvalvojan tilillä. Nämä toimen-

piteet auttavat välttämään joitain virheitä.

Vaihtoehtoisesti Python-ohjelma Spyder-ohjelmointiympäristössä voidaan aloit-

taa näin:

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.linear_model import LinearRegression

Esimerkkikoodi 1. Python-ohjelman aloitus.

Esimerkkikoodin 1 import-lauseet tuovat työssä tarvittavat kirjastot käyttöön.

Pandas-ohjelmistokirjasto vastaa tietojen lukemisesta tietokannasta. Kaikki ar-

vot syötetään datakehykseen (Data Frame). Pd.read_sql-funktiolla on tärkeä

rooli, koska sitä käytetään tilastotietojen lukemiseen tietokannasta. Matplo-

lib.pyplot-ohjelmistokirjasto luo tarvittavan visualisoinnin. Sclearn.linear_model-

ohjelmistokirjasto tuo työkaluja lineaarisen regression laskemiseen.

Sen jälkeen rakennetaan Python-koodi seuraavan hahmotelman mukaisesti:

Page 20: Python-kieli ensikosketuksena ko- neoppimiseen

16

# Data preparation

X = df['. . .'].to_frame()

# Preparation of variables

y = df['. . .']

Esimerkkikoodi 2. Python-koodihahmotelma.

Tämä malli oli kirjoitettu suurin piirtein, ja se on lähtökohta datan käsittelylle Pyt-

hon-kielellä. Edellä X on matriisi eli Pandas-kirjaston termein datakehys, joka si-

sältää selittävien muuttujien arvot. Vektori y sisältää vastemuuttujien arvot.

Ensimmäinen asia oli se, että piti ottaa yhteyttä tietokantaan statistic_x.

Sitä varten lisätään seuraava import-lause:

import mysql.connector

Se ottaa ohjelmassa käyttöön Mysql Connector Python -tietokanta-ajurin. Yllä

mainittu Python-ajuri oli ladattu omaan koneeseen virallisesta internetosoit-

teesta https://dev.mysql.com/downloads/connector/python/.

Sen jälkeen Python ohjelman ja tietokannan välinen yhteys testattiin onnistu-

neesti. Käytettävä Python ohjelma on esimerkkikoodin 3 mukainen:

# -*- coding: utf-8 -*-

"""

Created on Sun Nov 15 20:10:55 2020

@author: Evgeni

"""

import mysql.connector

mydb = mysql.connector.connect(

host="localhost",

user="root",

password=" ",

database="statistic_x"

)

mycursor = mydb.cursor()

sql = "SELECT * FROM gin"

mycursor.execute(sql)

myresult = mycursor.fetchall()

for x in myresult:

print(x)

Esimerkkikoodi 3. Ohjelman ja tietokannan välissä yhteys.

Page 21: Python-kieli ensikosketuksena ko- neoppimiseen

17

Seuraava vaihe on datakehyksen luominen tietokantahaun perusteella sekä li-

neaarisen regression määrittäminen.

Esimerkkikoodi 4 näyttää datakehyksen luonnin:

SQL_Query = pd.read_sql_query(sql, mydb)

df = pd.DataFrame(SQL_Query,columns=['vuosi', 'rahatulot', 'tuotan-

nontulot', 'bruttotulot'])

print("Data of DataFrame from MySQL database")

print(df)

Esimerkkikoodi 4. Datakehyksen (DataFrame) saaminen.

Sql_query-metodin avulla data luetaan tietokannoista. DataFrame on kaksiulot-

teinen merkitty rakenne, joka näyttää taulukolta. DataFrame-konstruktori luo

olion tietojen matemaattista jatkokäsittelyä varten.

Kuva 2. DataFrame:n tiedot tietokannasta.

Esimerkkikoodin 5 esittämä koodi laskee ja tulostaa tuotannontulojen ja brutto-

tulojen yhteyden (koodissa oleva ”Hei” on insinöörityön tekijän järjestelmävalvo-

jan tilin nimi).

# -*- coding: utf-8 -*-

Page 22: Python-kieli ensikosketuksena ko- neoppimiseen

18

"""

Created on Fri Oct 8 22:06:25 2021

@author: Hei

"""

import mysql.connector

import pandas as pd

import numpy as np

from sklearn import linear_model

import matplotlib.pyplot as plt

from sklearn.metrics import mean_squared_error, r2_score

import pyodbc

# MySQL database

mydb = mysql.connector.connect(

host="localhost",

user="root",

password=" ",

database="statistic_x"

)

# Use mycursor method

mycursor = mydb.cursor()

sql = "SELECT * FROM gin"

mycursor.execute(sql)

myresult = mycursor.fetchall()

Page 23: Python-kieli ensikosketuksena ko- neoppimiseen

19

# Get DataFrame

SQL_Query = pd.read_sql_query(sql, mydb)

df = pd.DataFrame(SQL_Query,columns=['vuosi', 'rahatulot', 'tuotan-

nontulot', 'bruttotulot'])

print("Data of DataFrame from MySQL database")

print(df)

# Visualization of variables

plt.xlabel('tuotannontulot')

plt.ylabel('bruttotulot')

plt.scatter(df.tuotannontulot,df.bruttotulot, color = 'dark red',

marker= '*')

# Linear regression function

reg = linear_model.LinearRegression()

reg.fit(df[['tuotannontulot']],df.bruttotulot)

# Get linear regression results

plt.scatter(df.tuotannontulot,df.bruttotulot, color = 'dark red',

marker= '*')

plt.plot(df.tuotannontulot,reg.predict(df[['tuotannontulot']]),color =

'black')

predicted_bruttotulot = reg.predict(df[['tuotannontulot']])

gradient = reg.coef_ # gradient or slope

intercept = reg.intercept_ # it is intercept

r2 = r2_score(df.bruttotulot,predicted_bruttotulot)

mse = mean_squared_error(df.bruttotulot,predicted_bruttotulot)

plt.show()

print("Linear regression: ")

print("The r-square value is :", r2)

print("Mean square error is :",mse)

print("The gradient is : ",gradient)

print("The intercept is :",intercept)

Esimerkkikoodi 5. Bruttotulojen ja tuotannontulojen välisen lineaarisen regres-sioanalyysin toteuttava ohjelma.

Tässä ohjelmassa analysoidaan funktio F(tuotannontulot) = bruttotulot. Talous-

tieteen perusteella suhde on käytännössä juuri tällainen. (13.) Sen ymmärtämi-

nen on tärkeää muuttujien oikealle sijoittamiselle lineaarisessa regressioyhtä-

lössä.

Käsiteltävässä tapauksessa riippuva muuttuja on bruttotulot ja riippumaton

muuttuja on tuotannontulot. Esimerkkikoodi 3 osoittaa tämän yhtälön ja lineaari-

sen regression indikaattorit. Kuva 3 esittää bruttotulojen ja rahatulojen gini-ker-

toimien välisen lineaarisen riippuvuuden.

Page 24: Python-kieli ensikosketuksena ko- neoppimiseen

20

Kuva 3. Rahatulojen Gini-kertoimen lineaarisen regression kaavio.

Jos katsotaan mallia ”rahatulot – bruttotulot”, ohjelma on samakaltainen. Kun

ohjelma suoritetaan, nähdään, että määrityskerroin (r-square) saa arvon

0,9894. Se on huomattavasti enemmän kuin 0,5. Määrityskerroin r2 on riippuvai-

sen muuttujan varianssin osuus, joka selittyy tarkasteltavana olevalla riippu-

vuusmallilla eli selittävillä muuttujilla. (18.) Tämä osoittaa korkean suhteen riip-

puvan ja riippumattoman muuttujien välillä. Siten ehdotettu lineaarinen regres-

siomalli on pätevä ja toimiva.

Mallin tarkistamiseksi suoritettiin k-ristiinvalidointi. Englanniksi siitä käytetään ni-

mitystä ”k-fold cross validation”. Näyte on jaettu k näytemäärään. Malli tarkiste-

taan jokaiselle ryhmälle. Ryhmien lukumäärä k voi olla erilainen. Joskus se on

5, joskus 10, mutta voi myös olla niin, että 𝑘 = 𝑛, missä 𝑛 on kokoelmassa ole-

vien näytteiden lukumäärä. (24.) Tutkittavassa valitaan 𝑘 = 𝑛, jotta saadaan mi-

nimoitua näytteenoton vaikutus opetusjoukon valintaan.

Kun katsotaan muuttujaparia ”rahatulot – bruttotulot”, ristiinvalidoinnin sisältävä

koodi on esimerkkikoodin 6 mukainen:

Page 25: Python-kieli ensikosketuksena ko- neoppimiseen

21

SQL_Query = pd.read_sql_query(sql, mydb)

df = pd.DataFrame(SQL_Query,columns=['vuosi', 'rahatulot', 'tuotan-

nontulot', 'bruttotulot'])

print("Data of DataFrame from MySQL database")

print(df)

# Variables and DataFrame

X = df[['bruttotulot']]

y = df['rahatulot']

# Cross-validation

cv = KFold(n_splits=33, random_state=1, shuffle=True)

# Linear regression model

model = LinearRegression()

# Get k-fold

scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_er-

ror',

cv=cv, n_jobs=-1)

# We can get mean absolute error

mean(absolute(scores))

print("Cross-Validation: ",mean(absolute(scores)))

Esimerkkikoodi 6. ”Rahatulot – bruttotulot” ristiinvalidoinnin koodi.

Koodin suorittamisen tuottama tulos on esitetty kuvassa 4:

Kuva 4. Bruttotulojen ja rahatulojen välisen regressiomallin ristiinvalidointi.

Page 26: Python-kieli ensikosketuksena ko- neoppimiseen

22

Kun tutkitaan muuttujaparia ”tuotannontulot – bruttotulot”, koodi muuttuu vähän:

X = df[['tuotannontulot']]

y = df['bruttotulot']

# We can get cross-validation

cv = KFold(n_splits=33, random_state=1, shuffle=True)

# We can get linear regression model

model = LinearRegression()

# It is k-fold

scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_er-

ror',

cv=cv, n_jobs=-1)

# This is mean absolute error

mean(absolute(scores))

print("Cross-Validation: ",mean(absolute(scores)))

Esimerkkikoodi 7. ”Bruttotulot – tuotannontulot” ristiinvalidoinnin koodi.

Tässä koodissa on laskettu ennustusvirheiden keskiarvo (neg_mean_abso-

lute_error).

Sen takia ristivalidoinnin tulos on:

Kuva 5. Tuotannontulojen ja bruttotulojen välisen regressiomallin ristiinvalidointi.

Page 27: Python-kieli ensikosketuksena ko- neoppimiseen

23

K-ristiinvalidointi, joka sisältää funktion mean(absolute(scores)), osoitti, että

malli on toimiva, mutta ylioppimista ei ole mainittavasti tapahtunut, koska ristiin-

validoinnin tuloksena saatu funktion arvo on pieni molemmissa tapauksissa. Se

tarkoittaa, että kun ennustusvirheiden keskiarvo on pieni, malli kuvaa oikein

suurimman osan otoksesta toimintaa.

Palaten yleiseen lineaariseen regressiokoodiin ja kuvaan 3, voidaan katsoa,

että siellä vastemuuttuja on ”rahatulot” ja riippumaton muuttuja ”bruttotulot”.

Seuraava koodi vastaa lineaarista regressiomallia:

# Function of linear regression

reg = linear_model.LinearRegression()

reg.fit(df[['bruttotulot']],df.rahatulot)

# Linear regression results

plt.scatter(df.bruttotulot,df.rahatulot, color = 'dark red', marker=

'*')

plt.plot(df.bruttotulot,reg.predict(df[['bruttotulot']]),color =

'black')

predicted_rahatulot = reg.predict(df[['bruttotulot']])

# Gradient or slope

gradient = reg.coef_

# It is intercept

intercept = reg.intercept_

r2 = r2_score(df.rahatulot,predicted_rahatulot)

mse = mean_squared_error(df.rahatulot,predicted_rahatulot)

plt.show()

Esimerkkikoodi 8. ”Rahatulot – bruttotulot”-malli.

Page 28: Python-kieli ensikosketuksena ko- neoppimiseen

24

On huomattava, että muuttujaparien riippuvuudet “rahatulot-bruttotulot” ja “brut-

totulot-tuotannontulot” näyttävät samankaltaisia tuloksia lineaarisessa regressi-

oanalyysissä.

Kuva 6. Tuotannontulojen ja bruttotulojen välisen lineaarisen regression

tulokset.

Kuva 7. Bruttotulojen ja rahatulojen välisen lineaarisen regression tulokset.

Se tarkoittaa, että menetelmä toimii yhdenmukaisesti monessa tapauksessa.

Näiden tuloksien perusteella voidaan todeta, että lopullisen lineaarisen regres-

sion tuloksen yhtälöt näyttävät seuraavilta.

1) Muuttujat “rahatulot – bruttotulot”:

y = 1,14x + (−9,26) = 1,14𝑥 − 9,26

2) Muuttujat “bruttotulot – tuotannontulot”:

y = 0,58x + 1,88

Page 29: Python-kieli ensikosketuksena ko- neoppimiseen

25

Jatkettiin analyysiä tarkastelemalla muuttujaparia "bruttotulot – tuotannontulot”.

Jaetaan aineisto kahteen osaan ja opetetaan malli toisella osista. Yksi osa

toimii testijoukkona, ja toinen osa on opetusjoukko. (27.) Esimerkkikoodi 9 näyt-

tää tähän tarvittavan ohjelmakoodin:

# Linear regression model

model = LinearRegression()

X_train, X_test, y_train, y_test = train_test_split(X, y,

test_size=1/3, random_state=0)

model.fit(X_train, y_train)

# Visualization of the training program

visual_train = plt

visual_train.scatter(X_train, y_train, color='red')

visual_train.plot(X_train, model.predict(X_train), color='blue')

visual_train.title('Bruttotulot-tuotannontulot (Training set)')

visual_train.xlabel('tuotannontulot')

visual_train.ylabel('bruttotulot')

visual_train.show()

# Visualization of the test program

visual_test = plt

visual_test.scatter(X_test, y_test, color='red')

visual_test.plot(X_train, model.predict(X_train), color='blue')

visual_test.title('Bruttotulot-tuotannontulot (Test set)')

visual_test.xlabel('tuotannontulot')

visual_test.ylabel('bruttotulot')

visual_test.show()

Esimerkkikoodi 9. ”Bruttotulot – tuotannontulot”-mallin opettaminen.

Page 30: Python-kieli ensikosketuksena ko- neoppimiseen

26

Kuva 8. Tuotannontulojen ja bruttotulojen välinen lineaarinen riippuvuus

testijoukosta laskettuna.

Page 31: Python-kieli ensikosketuksena ko- neoppimiseen

27

Kuva 9. Tuotannontulojen ja bruttotulojen välinen lineaarinen riippuvuus ope-

tusjoukosta laskettuna.

Molemmat harjoituskaaviot ovat hyvin samanlaisia. Tämä viittaa siihen, että

merkittävää ylioppimista ei olisi tapahtunut.

6 Visualisointi

Tutkimustulosten visualisointi koostuu lineaarisen regressiokaavioiden luomi-

sesta Spyder IDE:ssä Matplotlib-käsittelykirjaston avulla. Matplotlib-ohjelmisto-

kirjastolla on ratkaiseva rooli tietojen visualisoinnissa. Esimerkkikoodi 10 osoit-

taa sen käytön:

Page 32: Python-kieli ensikosketuksena ko- neoppimiseen

28

# Linear regression results

plt.scatter(df.bruttotulot,df.rahatulot, color = 'dark red', marker=

'*')

plt.plot(df.bruttotulot,reg.predict(df[['bruttotulot']]),color =

'black')

predicted_rahatulot = reg.predict(df[['bruttotulot']])

# Gradient or slope

gradient = reg.coef_

# It is intercept

intercept = reg.intercept_

r2 = r2_score(df.rahatulot,predicted_rahatulot)

mse = mean_squared_error(df.rahatulot,predicted_rahatulot)

plt.show()

Esimerkkikoodi 10. ”Rahatulot – bruttotulot”-mallin kaavion koodi.

Lisäksi oli tehty residuaalikuvia, jotka näyttävät ennustusvirheiden jakauman.

Kuva 10. Rahatulojen lineaarisen regression kaavio ja residuaalikuvia.

Page 33: Python-kieli ensikosketuksena ko- neoppimiseen

29

Residuualikuvion koodi on esimerkkikoodin 11 mukainen:

model = ols('rahatulot ~ bruttotulot', data=df).fit()

# Get model summary

print(model.summary())

# Define figure size

fig = plt.figure(figsize=(12,8))

# Produce residual plots

fig = sm.graphics.plot_regress_exog(model, 'bruttotulot', fig=fig)

Esimerkkikoodi 11. Residuualikuvion koodi.

Tämä koodi edellytti ohjelmointikirjaston “statsmodel” käyttöönottoa seuraavan

mukaisesti:

import statsmodels.api as sm

from statsmodels.formula.api import ols

Esimerkkikoodi 12. Statsmodel.api ohjelmointikirjaston-käyttö.

Page 34: Python-kieli ensikosketuksena ko- neoppimiseen

30

Kuva 11. Rahatulojen regressionmallin tulokset.

Jäännökset eli residuaalit vastaavat havaittujen ja ennustettujen arvojen eroa.

Niin kutsutut jäännöskaaviot osoittavat, kuinka luotettava regressiomalli on.

Tässä tapauksessa voimme päätellä, että lineaarinen malli on luotettava. Jään-

nökset jakautuvat lineaarisen regressiolinjan mukaisesti. Tämä vahvistaa sen,

että kuten edellä todettiin, lineaarinen regressioyhtälö osoittaa saavuttaa kor-

kean 𝑟2-arvon eli regressiomallin selitysosuuden. Tulokset osoittavat, että malli,

joka koskee bruttotulojen ja rahatulojen välistä riippuvuutta, kattaa yli 98 pro-

senttia varianssista. Katsottaessa muuttujaparia ”bruttotulot – tuotannontulot”

malli kattaa yli 70 prosenttia varianssista.

Page 35: Python-kieli ensikosketuksena ko- neoppimiseen

31

7 Työkalujen arviointi

Insinöörityön ensimmäinen päätavoite oli Python-sovelluksen luominen gini-ker-

toimien välisen lineaarisen riippuvuuden arvioimiseksi. Ratkaiseva rooli tässä

tapauksessa oli lineaarisen regressiomallin rakentaminen. Toinen päätavoite oli

Python-työkalujen käyttämisen arviointi. Tämä koskee pääasiallisesti Python-

ohjelmointiympäristöä ja -käsittelykirjastoja.

Mikään työn vaihe ei aiheuttanut erityisiä vaikeuksia. Kaiken kaikkiaan Spyder

IDE-, MySQL- ja Python-ohjelmistokehysten yhdistelmä on tuottanut hyviä ja

odotettuja tuloksia.

Tutkimukseen tarvittavien tietojen etsiminen oli melko vaikeaa. Tässä suh-

teessa Tilastokeskuksesta saadut tiedot auttoivat suuresti. MySQL:n valinta

osoittautui hyödylliseksi myös tämän ohjelmistoympäristön yksinkertaisuuden ja

nopeuden vuoksi. Insinöörityö näytti, että pandas-käsittelykirjasto on ihanteelli-

nen tällaisiin tutkimuksiin. Voidaan myös todeta Spyderin soveltuvan hyvin tä-

mänkaltaisiin tilanteisiin. Visualisointi suoritettiin onnistuneesti käyttämällä

matplotlib-käsittelykirjastoa. Spyderissä suoritettu lineaarinen regressiomalli

toimi hyvin ja antoi hyväksyttävän tuloksen.

Voidaan yleistää, että työssä käytettyjen työkalujen yhdistelmä osoittautui on-

nistuneeksi. Mallin testaamiseksi tehtiin residuaalikuvia ja ristinvalidointia. Täl-

laisen ensikosketuksen koneoppimisprojektin tulokset voidaan ekstrapoloida ko-

neoppimisprosessien tutkimuksen laajempaan käytäntöön kaikessa monimuo-

toisuudessaan. Insinöörityö on osoittanut, että Python on ihanteellinen koneop-

pimisen alalla työskentelyyn, myös ensikosketuksena.

8 Yhteenveto

Yhteenvetona edellä mainitusta voidaan todeta, että työssä asetetut tavoitteet

saavutettiin onnistuneesti. Ohjelma (sovellus), jonka avulla voidaan arvioida gini

Page 36: Python-kieli ensikosketuksena ko- neoppimiseen

32

-kertoimien välistä suhdetta, on luotu. Tämän ohjelman kehittämisen aikana

käytettyjä Python -työkaluja on kokeiltu ja arvioitu.

Tämän tutkimuksen perusteella voidaan luoda lähestymistapoja koneoppimisen

prosessien ymmärtämiseen sekä ratkaista ohjelmointitehtäviä lineaarisen reg-

ressiomenetelmän avulla ja suorittaa erilaisia sosioekonomisia laskelmia.

Page 37: Python-kieli ensikosketuksena ko- neoppimiseen

33

Lähteet

1 D. Pyle and C. San Jose. An executive’s guide to machine learning. / McKinsey Quarterly. June 2015.

2 M. Lutz. Learning Python. Published by O'Reilly Media. Canada, Sebasto-

pol, 2013.

3 F. Pedregosa, G. Varoquaux, A. Gramfort. Scikit-learn: Machine Learning

in Python. /Journal of Machine Learning Research 12 (2011).

4 M. Morhi, A. Rostamizadeh, A. Talwalker. Foundations of Machine Lear-

ning (second edition). The MIT Press. Cambridge, Massachusetts, Lon-don, 2018.

5 NASA, Google, FB, Netflix – What Do They Have In Common? Verkkoai-neisto. https://thelead.io/data-science/companies-that-uses-python Luettu 15.9.2021.

6 Burks A. W., Goldstine H. H., Neumann J. Preliminary Discussion of the

Logical Design of an Electronic Computing Instrument. — Institute for Ad-vanced Study, Princeton, N. J., July 1946.

7 S.B. Kotsiantis. Decision trees: a recent overview. Artificial Intelligence Re-view volume 39, 2013, pages 261–283.

8 F. Provost, B. Kohavi. Guest Editors’ Introduction: On Applied Research in Machine Learning. Machine Learning, 30, 127–132. Boston, Netherlands, 1998.

9 E. Alpaydin. Introduction to machin learning. Cambridge, Massachusetts.

The MIT Press, 2020.

10 P. Harrington. Machine Learning in Action. Manning Publications Co.3 Le-

wis Street Greenwich, CT, United States, 2012.

11 Koneoppiminen. Verkkoaineisto. https://fi.wikipedia.org/wiki/Koneoppimi-

nen Luettu 20.9.2021.

12 Tilastolliset menetelmät: Lineaarinen regressioanalyysi. Verkkoaineisto.

http://math.aalto.fi/opetus/sovtodb/oppikirja/Regranal.pdf Luettu 15.9.2021.

Page 38: Python-kieli ensikosketuksena ko- neoppimiseen

34

13 Käytettävissä olevat rahatulot. Verkkoaineisto.

https://www.stat.fi/meta/kas/kaytettavissa_o.html Luettu 30.9.2021.

14 Kock, N.; Lynn, G. S. (2012). "Lateral collinearity and misleading results in

variance-based SEM: An illustration and recommendations" (PDF). Jour-nal of the Association for Information Systems. 13 (7): 546–580.

15 Logistinen regressio. Verkkoaineisto. https://fi.wikipedia.org/wiki/Logisti-nen_regressio Luettu 1.10.2021.

16 A. L. Samuel. Some Studies in Machine Learning Using the Game of Checkers. IBM Journal of Research and Development ( Volume: 3, Issue: 3, July 1959). p. 210-229.

17 J. S. Raikwal, Kanak Saxena. Performance Evaluation of SVM and K-

Nearest Neighbor Algorithm over Medical Data set. / International Journal of Computer Applications (0975 – 8887). Volume 50 – No.14, July 2012.

18 S. Madeh Piryonesi, Tamer E. El-Diraby. Role of Data Analytics in Inf-rastructure Asset Management: Overcoming Data Size and Quality Prob-lems (англ.) // Journal of Transportation Engineering, Part B: Pavements. — 2020-06. — Vol. 146, iss. 2.

19 Bing Zhang, Zhiyang Liu, Yanguo Jia, Jiadong Ren and Xiaolin Zhao. Net-work Intrusion Detection Method Based on PCA and Bayes Algorithm. Re-search Article | Open Access. Volume 2018 |Article ID 1914980.

20 Best Relational Databases. Verkkoaineisto. https://www.g2.com/catego-

ries/relational-databases Luettu 3.10.2021.

21 Gini-kertoimet (%) Suomessa 1966–2018. Verkkoaineisto.

https://www.stat.fi/til/tjt/2018/01/tjt_2018_01_2020-03-10_tau_001_fi.html Luettu 16.9.2021.

22 "Gini Coefficient". United Nations Development Program. 2012. Archived from the original on 12 July 2014.

23 Hillebrand, Evan (June 2009). "Poverty, Growth, and Inequality over the Next 50 Years" (PDF). FAO, United Nations – Economic and Social Deve-lopment Department. Archived from the original (PDF) on 20 October 2017.

24 Varma, Sudhir; Simon, Richard (2006). "Bias in error estimation when using cross-validation for model selection". BMC Bioinformatics. 7: 91. doi:10.1186/1471-2105-7-91.

Page 39: Python-kieli ensikosketuksena ko- neoppimiseen

35

25 Philip Herron. Cython: Python to native code // Linux Format. — 2014. —

№ 12 / LXF191. — P. 84-87.

26 Matplotlib. Version 3.4.3. Verkkoaineisto. https://matplot-

lib.org/stable/thirdpartypackages/index.html Luettu 26.10.2021.

27 Microservices Series(Part 2) The predict salaries service. Verkkoaineisto.

https://medium.com/@cealer/microservices-series-part-2-the-predict-sala-ries-service-89c92bc763b0 Luettu 15.10.2021.

Page 40: Python-kieli ensikosketuksena ko- neoppimiseen

Liite 1

1 (1)

Page 41: Python-kieli ensikosketuksena ko- neoppimiseen

Liite 2

1 (1)