Opdracht model-evaluatie

Opdracht model-evaluatie#

from sklearn.datasets import load_breast_cancer
import numpy as np

Opdracht 1#

Laad de borstkanker-dataset en maak gebruik van DESCR om een beeld te krijgen van de gegevens die in deze dataset zijn opgeslagen. zorg ervoor dat je de features in een variabele X krijgt en de targets in de variabele y (dit kan op minimaal twee manieren). Je hoeft voor deze opgave geen EDA te maken of de data helemaal op te schonen (mag natuurlijk wel).

Je hoeft het niet allemaal in één cel te doen; voel je vrij om meer cellen aan te maken wanneer je dat wilt.

# YOUR CODE HERE

Maak een Support Vector Classifier met de standaard-waarden voor alle parameters. Geef dit model mee aan plot_learning_curve die in helpers.py te vinden is. Behalve dit model verwacht die methode eveneens een titel, de X en de y. De volledige signature van die methode staat hieronder; bestudeer eventueel de code om de volledige implementatie te zien.

plot_learning_curve(
    estimator,
    title,
    X,
    y,
    axes=None,
    ylim=None,
    cv=None,
    n_jobs=None,
    scoring="accuracy",
    train_sizes=np.linspace(0.1, 1.0, 5),
)
from sklearn.svm import SVC
from helpers import plot_learning_curve
# YOUR CODE HERE

Als het goed is, heb je nu hierboven drie grafieken staan. Bedenk op basis van deze visualisatie hoe goed of hoe slecht je vindt dat je classifier werkt.

Experimenteer vervolgens met verschillende waarden voor de parameters van die SVC: verander de kernel en verhoog (als je kernel poly is) de degree. Welke verschillen zie je in de visualisatis? Kun je op basis hiervan een voorstel doen voor de beste waarden voor die parameters?

Maak gebruik van train_test_split om de data op te splitsen in tachtig procent trainingsdata en twintig procent testdata.

Train een SVC op basis van de beste parameters die je hierboven hebt geïdentificeerd. Maak vervolgens een confusion matrix en een classificatie-raport op basis van de testdata met dit model. Maak tenslotte een ROC-curve van dit getrainde model.

Geef op basis hiervan een analyse van de kwaliteit van het model en een advies over hoe het model eventueel te verbeteren zou zijn.

from sklearn.model_selection import train_test_split
# YOUR CODE HERE
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay, RocCurveDisplay
# YOUR CODE HERE
# Plot een confusion-matrix.
# Maak gebruik van de klasse ConfusionMatrixDisplay die hierboven is geïmporteerd
# YOUR CODE HERE
# Plot een ROC-curve.
# Maak gebruik van de klasse RocCurveDisplay die hierboven is geïmporteerd
# YOUR CODE HERE

Opdracht 2#

Maak en train nu verschillende andere typen classifiers (een aantal is hieronder gegeven, maar voel je vrij om een andere set te gebruiken). Let op: alle classifiers in sklearn implementeren dezelfde interface: maak hiervan gebruik in je realisatie.

In de cel hieronder wordt een DataFrame result_table gedefinieerd. Het is de bedoeling dat je van alle classifiers die je gebruikt en traint de fpr, de tpr en de auc in dit DataFrame opslaat. Je kunt hiervoor gebruik maken van de sklearn-methoden roc_curve en roc_auc_score.

import pandas as pd
import numpy as np
%matplotlib inline

from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import roc_curve, roc_auc_score

# DataFrame om de gevonden metrieken per classifier in op te slaan.
result_table = pd.DataFrame(columns=['classifiers', 'fpr','tpr','auc'])

# YOUR CODE HERE

In de cel hieronder wordt de variabele result_table gebruikt om de verschillende ROC’s in één figuur te plotten. Je hoeft hiervoor niks te programmeren; als je de cel runt krijgt je als het goed is direct de juiste visualisatie.

Kun je op basis van deze visualisatie een uitspraak doen over welk model de beste performance heeft voor deze dataset?

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,6))

for i in result_table.index:
    plt.plot(result_table.loc[i]['fpr'], 
             result_table.loc[i]['tpr'], 
             label=f"{i}, AUC={result_table.loc[i]['auc']:.3f}")
    
plt.plot([0,1], [0,1], color='orange', linestyle='--')

plt.xticks(np.arange(0.0, 1.1, step=0.1))
plt.xlabel("False Positive Rate", fontsize=15)

plt.yticks(np.arange(0.0, 1.1, step=0.1))
plt.ylabel("True Positive Rate", fontsize=15)

plt.title('ROC Curve Analysis', fontweight='bold', fontsize=15)
plt.legend(prop={'size':13}, loc='lower right')

plt.show()