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
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)
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 €')
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])