Lineaarinen regressio 1

Tämän artikkelin ohjelmakoodin ja tulosteet löydät GitHubista:

https://github.com/taanila/tilastoapu/blob/master/linreg1.ipynb

Jos kopioit koodia itsellesi, niin kannattaa käyttää GitHubia. Tästä artikkelista kopioidut koodit eivät välttämättä toimi oikein.

Tämän artikkelin esimerkeissä käytän dataa http://taanila.fi/linreg1.xlsx

Yleistä koneoppimisen malleista

Tästä artikkelista opit sklearn (scikit-learn) -ohjelmakirjaston koneoppimisen mallien käyttöliittymän pelkistetyn esimerkin avulla. Käyttöliittymä sklearn-kirjaston malleihin on yksinkertainen sisältäen seuraavat vaiheet:

Valmistele data

Ohjatun (supervised) oppimisen malleissa datasta täytyy erottaa selittävät muuttujat (feature-matriisi , x-muuttujat) ja selitettävä muuttuja (label, target, y-muuttuja).

Ohjaamattomissa (unsupervised) malleissa tarvitaan ainoastaan feature-matriisi.

Tuo malli ja säädä lähtötiedot

Esimerkiksi tässä artikkelissa käytettävä lineaarinen regressiomalli tuodaan seuraavasti:

from sklearn.linear_model import LinearRegression

Lineaaristen mallien kirjastosta siis tuodaan LinearRegression-malli. Mallin lähtötietojen säätäminen edellyttää käytettävän mallin tuntemusta. Jos et ole perehtynyt malliin, niin voit tyytyä lähtötietojen oletusarvoihin.

Sovita malli (fit)

Tässä vaiheessa suoritetaan varsinainen laskenta. Onneksi valmiit algoritmit hoitavat laskennan.

Arvioi mallin sopivuutta

Sopivuuden arviointiin on monia menetelmiä, esimerkiksi selityskertoimen laskeminen, visuaalinen tarkastelu tai mallin toimivuuden testaaminen testidatalla.

Ennusta (predict)

Ennakoivassa analytiikassa keskeisin vaihe on tietysti ennusteiden laskeminen uudelle datalle.

Lineaarinen regressio

Lineaarisella regressiomallilla voidaan ennustaa jatkuvaluonteisen muuttujan arvoja selittävien muuttujien avulla, jos selittävien muuttujien ja ennustettavan muuttujan välillä on likimain lineaarinen (suoraviivainen) riippuvuus.

Lineaarista regressiomallia voidaan pitää koneoppimisen mallina, jos kone määrittää (oppii) mallin parametrit olemassa olevan datan (training data) perusteella.

Ohjelmakirjastojen tuonti

Kuvailevasta analyysistä tutut peruskirjastot ovat tarpeen:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

Datan valmistelu

Tässä esimerkissä luen datan Excel-tiedostosta dataframeen:

df = pd.read_excel('linreg1.xlsx')
df

linreg1

Yritän selittää myyntiä mainoskuluilla, joten määritän mainoskulut selittäväksi muuttujaksi (x) ja myynnin selitettäväksi muuttujaksi (y). Feature-matriisin täytyy olla mallia sovitettaessa dataframe-muodossa, joten teen muunnoksen to_frame-funktiolla.

x=df['Mainoskulut 1000 €']
X=df['Mainoskulut 1000 €'].to_frame() #feature-matriisi
y=df['Myynti 1000 €'] #target
plt.scatter(x,y)

linreg2

Pistekaavion perusteella riippuvuus mainoskulujen ja myynnin välillä näyttää likimain lineaariselta (suoraviivaiselta).

Mallin sovitus

Tuon LinearRegression-mallin lineaaristen mallien kirjastosta ja nimeän sen yksinkertaisuuden vuoksi nimellä malli.

from sklearn.linear_model import LinearRegression
malli=LinearRegression()
malli.fit(X,y)

Tulosteena saan mallin lähtötiedot (joita olisin voinut halutessani säätää):

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

Mallin sovittamisen jälkeen voin katsoa mallin parametreja. Yksinkertaisen lineaarisen regression tapauksessa mallin parametrit ovat suoran kulmakerroin ja vakiotermi.

malli.coef_ #kulmakerroin

array([52.56756757])

Kulmakerroin tulee listamuodossa (array), koska mallissa voisi olla useampia selittäviä muuttujia ja näin ollen myös useampia kulmakertoimia.

malli.intercept_ #vakiotermi

46.486486486486505

Mallina on siis suora, jonka yhtälö: y = 52,568x + 46,486

Mallin sopivuuden arviointi

Mallin selityskertoimen saan:

malli.score(X,y)

0.7663982928521625

Voin siis todeta: 76,6 % myynnin varianssista voidaan selittää mainoskuluilla.

Voin tarkastella mallin sopivuutta myös graafisesti:

xfit=np.linspace(0.4,1.4) #50 arvoa tasavälein väliltä 0.4 - 1.4
Xfit=pd.DataFrame(xfit)
yfit=malli.predict(Xfit)
plt.scatter(x,y)
plt.plot(xfit,yfit)
plt.xlabel('Mainoskulut 1000 €')
plt.ylabel('Myynti 1000 €')

linreg3

Ennustaminen

Jos mainoskuluihin suunnitellaan käytettäväksi 700, 800 tai 900 euroa, niin mallin mukaiset myyntiennusteet:

malli.predict([0.7, 0.8, 0.9])

array([83.28378378, 88.54054054, 93.7972973 ])

Yhteenveto

Yksinkertaisimmillaan tuodaan ja määritellään malli, sovitetaan malli ja ennustetaan:

from sklearn.linear_model import LinearRegression 

malli=LinearRegression() 

malli.fit(X,y)

malli.predict([0.7, 0.8, 0.9])