import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn import svm
from sklearn import model_selection
from sklearn import metrics
from sklearn import datasets
from sklearn import preprocessing
data = datasets.load_breast_cancer()
X = data.data
y = data.target
Kada želimo da odredimo optimalne vrednosti hiperparametara, iz skupa za treniranje izdvajamo jedan manji skup podataka koji zovemo validacionim skupom. Nad njime dalje proveravamo kako se ponaša model koji razvijamo za različite vrednosti hiperparameta i biramo one hiperparametre koji daju najbolje rezultate u nekom smislu. Pogrešili bismo da za ovaj zadatak iskoristimo skup sa testiranje jer bi ocena koju bismo dobili kasnije prilikom testiranja modela sa odabranim vrednostima hiperparametara bila pristrasna.
Trening, validacioni i test skup ćemo u ovom primeru podeliti u odnosu 56:14:30.
X_train_and_val, X_test, y_train_and_val, y_test = model_selection.train_test_split(
X, y, test_size = 0.3, random_state = 42, stratify = y)
X_train, X_val, y_train, y_val = model_selection.train_test_split(
X_train_and_val, y_train_and_val, train_size = 0.8,
random_state = 42, stratify = y_train_and_val)
scaler = preprocessing.StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_validation = scaler.transform(X_val)
X_test = scaler.transform(X_test)
Hiperparametri SVM modela koje ćemo podešavati su $C$ i $\gamma$. $C$ kontroliše jačinu regularizacije, a $\gamma$ širinu Gausovog radijalnog jezgra (RBF kernela).
# jačina regularizacije je inverzno proporcionalna parametru C
# C mora biti strogo pozitivan broj
# podrazumevano se koristi kvadrat l2 regularizacije
Cs = [0.0001, 0.001, 0.01, 0.05, 0.1, 0.5, 1, 5, 10, 100, 1000]
gammas = [0.0001, 0.001, 0.01, 0.05, 0.1, 0.5, 1, 5, 10, 100, 1000]
Inicijalizujemo promenljive u kojima ćemo čuvati najbolje ocene i optimalne vrednosti hiperparametara.
best_f1_score = 0
best_C = None
best_gamma = None
Za svaki par vrednosti $C$ i $\gamma$ treniramo model na trening skupu i pratimo njegovu ocenu na validacionom skupu.
for C in Cs:
for gamma in gammas:
model = svm.SVC(kernel='rbf', gamma=gamma, C = C)
model.fit(X_train, y_train)
f1_score = metrics.f1_score(y_val, model.predict(X_val))
if f1_score > best_f1_score:
best_f1_score = f1_score
best_C = C
best_gamma = gamma
print('Najbolji f1-score na validacionom skupu je: ', best_f1_score)
Najbolji f1-score na validacionom skupu je: 0.7692307692307693
print('Najbolji hiperparametri modela su: ', best_C, best_gamma)
Najbolji hiperparametri modela su: 0.0001 0.0001
Kreiramo konačni model, koristeći trening skup:
best_model = svm.SVC(kernel='rbf', gamma=best_gamma, C=best_C)
best_model.fit(X_train, y_train)
SVC(C=0.0001, gamma=0.0001)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
SVC(C=0.0001, gamma=0.0001)
I na kraju testiramo model koristeći test skup:
f1_score = metrics.f1_score(y_test, best_model.predict(X_test))
print('f1-score na test skupu je: ', f1_score)
f1-score na test skupu je: 0.7697841726618705