Regressie

Bij regressie kijken we naar de relatie tussen één of meerdere onafhankelijke variabelen (x) en de afhankelijke variabele (y). De meest simpele vorm van regressie is een rechte lijn, waarbij er sprake is van 1 x, en de vorm kan worden geschreven als y = a + bx.

y : de afhankelijke variabele, of de uitkomst

b : helling (of stijging)

a : de intercept (daar waar de lijn de y-as kruist waar x = 0)

x : de onafhankelijke variable (de input)

Je kunt hiervoor gebruik maken van een tabel:

Voor elke toename van x + 1, neemt y met 1.5 af.

Daar waar x = 0 is y: 3, de intercept is hier 3; de helling is dan -1.5

Kijk nu naar de volgende tabel:

#ENGINESIZECYLINDERSFUELCONSUMPTION_COMBCO2EMISSIONS
1248.5196
22.449.6221
31.545.9136
43.5611.1255
53.5610.6244
63.5610230
73.5610.1232
83.7611.1255
93.7611.6?

De vraag is of we voor # 9 de uitstoot kunnen berekenen [y] aan de hand van de gegevens in de kolommen: EngineSize, Cylinders en FuelConsumption_Comb [x].

We maken hiervoor gebruik van multiple linear regression, met als gegeven input [x], en we zoeken de voorspelling van y, ŷ (uitgesproken als y-hat).

Laten we eerst kijken naar simple linear regression, waarbij gebruik gemaakt wordt van 1 input variabele, bijvoorbeeld de grootte van de motor. Als we dit plotten in een grafiek, zien we al snel dat de grootte van de motor samenhangt met de uitstoot.

Als we nu meer variabelen toevoegen aan de berekening, dan wordt al snel zichtbaar dat ook hier verbanden bestaan:

Hierdoor ziet de berekening er als volgt uit:

CO2EM = Ɵ0 + Ɵ1x1 + Ɵ2x2 + … + Ɵnxn

Of als vector:

Ŷ = ƟTx

Waarbij ƟT = [Ɵ0 , Ɵ1 , Ɵ2 , …] de parameters zijn en x de featureset (in dit geval de auto met zijn eigenschappen).

Download hier de dataset voor deze oefening.

De python code voor dit voorbeeld:

import matplotlib.pyplot as plt

import pandas as pd

import pylab as pl

import numpy as np

from sklearn.preprocessing import PolynomialFeatures

from sklearn import linear_model

 

#zorg er voor dat de data in de juiste directory staat

df = pd.read_csv(“FuelConsumptionCo2.csv”)

 

# bekijk de dataset

print(df.head())

 

# neem de gegevens die je kunt gebruiken als input (merk en model maakt hiervoor niet uit)

# en de verwachte output: CO2EMISSIONS

cdf = df[[‘ENGINESIZE’,’CYLINDERS’,’FUELCONSUMPTION_COMB’,’CO2EMISSIONS’]]

print(cdf.head(9))

 

# maak hiervan een diagram

plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS,  color=’blue’)

plt.xlabel(“Engine size”)

plt.ylabel(“Emission”)

plt.show()

 

msk = np.random.rand(len(df)) < 0.8

train = cdf[msk]

test = cdf[~msk]

train_x = np.asanyarray(train[[‘ENGINESIZE’]])

train_y = np.asanyarray(train[[‘CO2EMISSIONS’]])

test_x = np.asanyarray(test[[‘ENGINESIZE’]])

test_y = np.asanyarray(test[[‘CO2EMISSIONS’]])

poly = PolynomialFeatures(degree=2)

train_x_poly = poly.fit_transform(train_x)

train_x_poly

clf = linear_model.LinearRegression()

train_y_ = clf.fit(train_x_poly, train_y)

 

# De coefficienten

print (‘Coefficients: ‘, clf.coef_)

print (‘Intercept: ‘,clf.intercept_)

 

plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color=’blue’)

XX = np.arange(0.0, 10.0, 0.1)

yy = clf.intercept_[0] + clf.coef_[0][1]*XX + clf.coef_[0][2]*np.power(XX, 2)

plt.plot(XX, yy, ‘-r’ )

plt.xlabel(“Engine size, Cylinders and Fuel Consumption”)

plt.ylabel(“Emission”)

plt.show()

 

from sklearn.metrics import r2_score

 

test_x_poly = poly.fit_transform(test_x)

test_y_ = clf.predict(test_x_poly)

print(“Mean absolute error: %.2f” % np.mean(np.absolute(test_y_ – test_y)))

print(“Residual sum of squares (MSE): %.2f” % np.mean((test_y_ – test_y) ** 2))

print(“R2-score: %.2f” % r2_score(test_y,test_y_ ) )

 

poly3 = PolynomialFeatures(degree=3)

train_x_poly3 = poly3.fit_transform(train_x)

clf3 = linear_model.LinearRegression()

train_y3_ = clf3.fit(train_x_poly3, train_y)

 

print (‘Coefficients: ‘, clf3.coef_)

print (‘Intercept: ‘,clf3.intercept_)

plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS,  color=’blue’)

XX = np.arange(0.0, 10.0, 0.1)

yy = clf3.intercept_[0]+ clf3.coef_[0][1]*XX + clf3.coef_[0][2]*np.power(XX, 2) + clf3.coef_[0][3]*np.power(XX, 3)

plt.plot(XX, yy, ‘-r’ )

plt.xlabel(“Engine size”)

plt.ylabel(“Emission”)

plt.show()

test_x_poly3 = poly3.fit_transform(test_x)

test_y3_ = clf3.predict(test_x_poly3)

print(“Mean absolute error: %.2f” % np.mean(np.absolute(test_y3_ – test_y)))

print(“Residual sum of squares (MSE): %.2f” % np.mean((test_y3_ – test_y) ** 2))

print(“R2-score: %.2f” % r2_score(test_y,test_y3_ ) )

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.