Introductie Jupyter Notebook en Scikit-learn#

Zoals tijdens het theoriecollege is toegelicht, maken we in deze cursus vaak gebruik van Jupyter Notebooks, een feitelijke standaard voor het rapid prototyping van machine learning projecten. Het grote voordeel van notebooks is dat je de documentatie (in markdown) direct tussen je runbare code hebt staan. Hoewel oorspronkelijk ontwikkeld voor Python zijn er inmiddels voor de meeste talen kernels ontwikkeld, zodat je ook Java, Go of PHP in notebooks kunt schrijven.

Een tweede stap die we gaan zetten is het gebruikmaken van een bibliotheek om het zware werk voor ons over te nemen: scikit learn. In de volgende twee opgaven gaan we alle code zelf uitprogrammeren (met python en numpyr), maar in het echt maak je gebruik van deze bibliotheek: die is sneller en makkelijker en stelt je in staat om je te richten op het maken en beoordelen van modellen in plaats van het goed laten werken van feitelijk vrij triviale programmacode.

Eén van de voordelen van sklearn is dat de meest gebruikte datasets standaard in deze bibliotheek zitten. Veel van de voorbeelden waar we de komende weken mee gaan werken, zul je hierin terugvinden.

In deze opgave maken we gebruik van de California Housing dataset. Run de volgende cel om de methode te importeren die deze dataset kan laden. Bestudeer de documentatie om te weten te komen wat er in deze dataset is opgeslagen en hoe je vervolgens de data daadwerkelijk laadt.

# https://stackoverflow.com/a/49174340
# Haal de onderstaande regels uit het commentaar als je SSL-errors krijgt:
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
from sklearn.datasets import fetch_california_housing
import matplotlib.pyplot as plt
import numpy as np

Opdracht 1: data laden en inspecteren#

Gebruik de onderstaande cel om de methode fetch_california_housing aan te roepen. Mocht je bij het laden SSL-errors krijgen, probeer dan de eerste regel in de bovenstaande cel uit het commentaar te halen en run die cel nogmaals. Gebruik feature_names om de namen van de eigenschappen van de dataset te weten te komen. Zorg ervoor dat je de data van het resultaat in een variabele X zet, en de target in een variabele y.

# YOUR CODE HERE

Zoals altijd maken we ook een paar visualisaties van de data om een beeld te krijgen van wat er zoal in zit. We beginnen met een scatter-plot; alleen dit keer plotten we niet de \(y\)-vector tegen een eigenschap uit de \(X\)-matrix; omdat we weten dat we te maken hebben met geografische data, is het leuker om de lengte- en breedtegraden tegenover elkaar te plotten. Maar gebruik van matplotlib.pyplot.scatter om deze twee gegevens (Longitude en Latitude, respectievelijk) te plotten. Als je het goed hebt gedaan, kun je in de resulterende plot de kustlijn van Californië herkennen.

#YOUR CODE HERE

Zoals je in de documentatie hebt gelezen, is de target-value de gemiddelde waarde van de huizen in die omgeving, uitgedrukt in honderdduizend dollar. Natuurlijk moeten we wat statistieken uit deze target-vector halen. Vul onderstaande cel aan, zodat de juiste waarden worden afgedrukt. Vervolgens ga je gebruikmaken van pyplot.hist om een histogram van deze data te plotten. Beargumenteer op basis van de statistische gegevens in hoeveel bins je dit histogram zou willen onderverdelen.

# YOUR CODE HERE
# Vervang '0' door de juiste code. Tip: numpy (np) biedt hiervoor de juiste mogelijkheden
min_value = 0
max_value = 0
stdev = 0
gemiddelde = 0

print ('==== DATA UIT DE TARGET-VECTOR ====')
print (f'Gemiddelde: {gemiddelde:>10.2f}')
print (f'Minimum: {min_value:>10.2f}')
print (f'Maximum: {max_value:>10.2f}')
print (f'StdDev: {stdev:>10.2f}')

Een belangrijke stap om een beeld te krijgen van de data in de set is door gebruik te maken van een histogram. Eén van de belangrijke vragen daarbij is in hoeveel bins je de data moet verdelen. Daarvoor zijn grofweg twee methoden: Sturge’s Rule en Freedman-Diaconis rule. Bestudeer deze blog hierover maak beide histogrammen. Let op dat het aantal bins een geheel getal moet zijn.

Als het goed is, kom je in het eerste geval op 16 bins en in het tweede geval op 46. Welke van beide histogrammen vind je beter en waarom?

# histogram met Sturge's Rule
m,n = X.shape

# YOUR CODE HERE
# histogram met Freedman-Diaconis rule
m,n = X.shape

# YOUR CODE HERE

Opdracht 2: Lineaire regressie#

Nu gaan we de features van deze dataset gebruiken om een voorspelling te doen van de waarde van een huis. We gaan in de volgende opgave de wiskunde helemaal zelf uitprogrammeren, zodat je weet wat er exact gebeurt. Vooralsnog maken we gebruik van ‘sklearn.linear_model.linear_regression’.

Verdeel de data in 20% testdata en 80% trainingsdata. Maak hiervoor gebruik van train_test_split. Laad de data opnieuw in met de parameter return_X_y op True, zodat je direct de features en de corresponderende targets hebt. Waarom is deze split ook al weer nodig?

Gebruik vervolgens de methode fit om het model te trainen.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
#YOUR CODE HERE

Gebruik nu de methode predict om op basis van de test-data een uitspraak te doen over hoe goed het model presteert. Gebruik hiervoor de methode mean_square_error uit sklearn.metrics. Hoe vind je dat het model presteert? Wat zou je kunnen doen om het model te verbeteren?

from sklearn.metrics import mean_squared_error
#YOUR CODE HERE

Bestudeer tenslotte met behulp van het coef_-attribuut van het getrainde model om te weten te komen wat de formule is die het model gebruikt. Welke features zijn het belangrijkst en welke minder?

#YOUR CODE HERE