Jos koneoppiminen ja sklearn (scikit-learn) -kirjasto ovat sinulle täysin uusia, niin lue ennen tätä artikkelia Lineaarinen regressio 1
Tämän artikkelin ohjelmakoodin ja tulosteet löydät GitHubista:
https://github.com/taanila/tilastoapu/blob/master/linreg2.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 datoja http://taanila.fi/mokki.xlsx ja http://taanila.fi/mokkinew.xlsx
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 oppii mallin parametrit olemassa olevan datan perusteella.
Tarkastelen esimerkkinä kuvitteellista aineistoa kesämökkien hinnoista. Hintaa selittävinä muuttujina ovat rantaviivan pituus metreinä, mökin pinta-ala neliömetreinä ja dikitominen muuttuja sähköliittymästä (1 = sähköliittymä, 0 = ei sähköliittymää).
Ohjelmakirjastojen tuonti
Tuon kuvailevasta analyysista tutut kirjastot (numpy-kirjastoa en tällä kertaa tarvitse):
import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
Datan valmistelu
Luen datan Excel-tiedostosta dataframeen:
df=pd.read_excel('http://taanila.fi/mokki.xlsx') df
Muodostan feature-matriisin selittävistä muuttujista ranta, pinta-ala ja sähkö. Selitettäväksi muuttujaksi (target) tulee hinta.
X=df[['ranta', 'pinta-ala','sähkö']] y=df['hinta']
Mallin sovitus
Tuon lineaaristen mallien kirjastosta LinearRegression-mallin. Mukavuussyistä annan mallille nimeksi malli.
Sovitan mallin dataan fit-funktiolla.
from sklearn.linear_model import LinearRegression malli=LinearRegression() malli.fit(X,y)
Tuloksesta näen mallin lähtötiedot, joita olisin halutessani voinut säätää:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
Mallin vakiotermi:
malli.intercept_
-96.94145434036429
Selittävien muuttujien kertoimet:
malli.coef_
array([ 1.9750098 , 2.77578415, 20.29877373])
Mallin sopivuuden arviointi
Mallin selityskerroin:
malli.score(X,y)
0.9819136190845801
Selityskertoimen mukaan 98,2 % hinnan varianssista voidaan selittää selittävien muuttujien avulla.
Mallin sopivuutta voin arvioida myös virhetermejä (ennusteen ero toteutuneeseen hintaan) tarkastelemalla:
plt.scatter(malli.predict(X), malli.predict(X)-y) plt.hlines(y=0,xmin=50,xmax=250) plt.xlabel('Ennuste') plt.ylabel('Poikkeama todellisesta')
Virhetermit ovat melko satunnaisesti jakautuneet, mikä on hyvä asia.
Seuraavassa tarkastelen vielä pistekuviona toteutunutta hintaa ja mallin ennustamaa hintaa:
plt.scatter(df['hinta'], malli.predict(X)) plt.xlabel('Todellinen hinta') plt.ylabel('Ennuste')
Ennustaminen
Mallin perusteella voin laskea hintaennusteita uudelle datalle, jota ei käytetty mallin laatimiseen:
Xuudet=pd.read_excel('http://taanila.fi/mokkinew.xlsx') Xuudet['Hintaennuste']=malli.predict(Xuudet) Xuudet
Perinteisempi regressiotuloste
Halutessani saan perinteisemmän regressiotulosteen statsmodels-kirjaston toiminnoilla:
import statsmodels.api as sm X = sm.add_constant(X) malli_sm = sm.OLS(y, X) results = malli_sm.fit() print(results.summary())