"Enter"a basıp içeriğe geçin

Python ile Model Komplekslik Grafiği, Doğrulama Seti ve Grid-Search

Bir önceki yazıda Model Komplekslik Grafiği (Model Complexity Graph), Doğrulama seti (Validation Set) ve Grid-Search konularını incelemiştik.

Bu yazımızda ise Jupyter Notebook üzerinde yapacağımız python uygulamaları ile bu bilgilerimizi pratiğe çevireceğiz.

Pratik uygulamamız için sklearn kütüphanesinin sağladığı breast_cancer veri setini kullanacağız.

from sklearn.datasets import load_breast_cancer
dataset = load_breast_cancer()

load_breast_cancer diğer sklearn veri setleri gibi bize Python dilinde sıkça kullanılan dictionary yapısına benzer bunch nesnesi döndürür.

dataset olarak adlandırdığımız bunch nesnesine ait .DESCR stringi veri setini tanımamıza yardımcı olacaktır:

print(dataset.DESCR)

Kısaca özetlemek gerekirse 569 hastaya ait 30 farklı numerik özellik ve bu kişilerdeki kitlenin iyi huylu (benign) ya da kötü huylu (malignant) olduğunu belirten etiketlerden oluşan küçük bir veri seti diyebiliriz.

Elbette veri bilimi uygulamalarında ilgili alana ait olan süreci anlamanın çok önemli olduğunu ve burada yapılacak örneğin hiç bir tıbbi maksat ile kullanılamayacağını hatırlatalım. Gerçek uygulamalar için yapılacak çalışmalarda uzman görüşleri ile ilerlemek ve süreci kavramak gerekmektedir.

Veri setine ilişkin keşifsel veri analizi yapmak pratik kazanmak ve veriyi anlamak açısından faydalı olacaktır.

Veri setine ilişkin özellik seti ile etiketleri için nesneleri tanımlayarak devam edelim:

features = dataset.data
labels = dataset.target

Veri setini elde ettiğimize göre, sırada eğitim (train) ve test setlerine ayrıştırmayı gerçekleştirebiliriz:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size = 0.20, shuffle = True)

X_train ve y_train eğitim (training) için, X_test ve y_test ise test için kullanılacak.

Model olarak Support Vector Machines (SVM) ile ilerleyelim:

from sklearn.svm import SVC
classifier = SVC()

Model komplekslik grafiği hatırlayacağımız üzere model parametre ya da hiperparametrelerinden en az birinin değişiminin eğitim (train) ve doğrulama (validation) setlerine etkisini ölçmek üzere kullanılıyordu. Bu sebeple Support Vector Machines’e ait parametreleri incelemek üzere sklearn’ün ilgili web adresini incelemekte fayda var.

SVM’e ait regularizasyon (regularization) için kullanılan ‘C’ parametresinindeki logaritmik artışın eğitim ve test setlerindeki skorlarını inceleyelim. Bunun için öncelikle Sklearn’e ait GridSearchCV fonksiyonunu kullanabilmek üzere dictionary formatında bir parametre seti tanımlayalım.

parameter_set = {'C' : [1e-2, 1e-1, 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8]}

Ardından Grid-Search sırasında optimize etmeye çalışacağımız metriği f1 skor olarak tanımlayalım:

from sklearn.metrics import make_scorer, f1_score

score_function = make_scorer(f1_score)

Sınıflandırma modeli olarak SVM’i belirlediğimize, parametre setini tanımladığımıza ve optimize etmek istediğimiz skoru belirlediğimize göre artık Grid-Search yapabilecek durumdayız:

from sklearn.model_selection import GridSearchCV

GridSearcher = GridSearchCV(classifier, param_grid=parameter_set, cv=10, scoring=score_function, return_train_score=True)

GridSearcher.fit(X_train, y_train)

Yukarıda görüleceği üzere classifier adını verdiğimiz sınıflandırma modelimizi, tanımladığımız parametre setini, kaç adet çapraz doğrulama (cross validation) seti kullanılmasını istediğimizi, performans metriği olarak f1 skorun kullanılmasını ve eğitim (train) skorlarının da döndürülmesini istediğimizi GridSearchCV fonksiyonu içerisinde belirttik. Bu hali ile GridSearchCV bizim için SVM kullanarak verilen parametre setindeki her bir parametre için verilen eğitim seti içerisinden 10 farklı eğitim seti ile modeli her seferinde sıfırdan başlayarak eğitecek, oluşan modele ilişkin her bir set için ayrı ayrı ve bunların ortalaması olarak eğitim ve doğrulama skorlarını döndürecek. Bunun yanında nitelik (attribute) olarak en iyi hiperparametre setine de bizim adımıza karar verip sonuçları döndürecek.

Aşağıdaki şekilde en iyi sonucu veren hiperparametre kombinasyonuna erişilebilinir.

GridSearcher.best_estimator_
Grid-Search sonucu

Model komplekslik grafiğini ek bir işleme gerek kalmadan basitçe çizdirebilmek adına sadece tek bir parametre seçildi. Ancak dilenirse birden fazla parametre için set oluşturularak bunların oluşturacağı kombinasyonlardan en iyi olanı da GridSearchCV ile elde etmek mümkün. Ancak her bir eklenen parametrenin kominasyon sayısındaki artışa etkisinin katlanarak olacağı unutulmamalı.

Görüldüğü üzere en iyi C değeri 1e4 olarak belirlenmiş. Bu değerin seçilmesinin nedenini model komplekslik grafiğini çizdirerek görebiliriz.

Aşağıdaki şekilde çapraz eğitim ve doğrulama setlerine ilişkin skorlarının ortalama değerlerini öğrenelim:

mean_train_scores = GridSearcher.cv_results_['mean_train_score']
mean_validation_scores = GridSearcher.cv_results_['mean_test_score']
print('mean train scores = '+str(mean_train_scores))
print('mean validation scores = '+str(mean_validation_scores))
Sırası ile her bir C değeri için ortalama Eğitim (train) ve Doğrulama (Validation) skorları

Bu skorları C değerlerine karşılık olarak çizdirmek için aşağıdaki kod parçasını kullanabiliriz:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

plt.figure()
plt.scatter(np.log10(parameter_set['C']), mean_train_scores, label = 'train')
plt.scatter(np.log10(parameter_set['C']), mean_validation_scores, label = 'validation')
plt.xlabel('C values (log scale)')
plt.ylabel('F1 score')
plt.title('Model Complexity Graph')
plt.legend()
plt.show()

Sonuç olarak ise aşağıdaki model komplekslik grafiğini elde etmiş oluruz:

Model Komplekslik Grafiği

Doğrulama ve eğitim seti skorları arasında C değeri yükseldikçe ortaya çıkan ayrışmaya dikkat edelim. Sklearn’e ait GridSearchCV fonksiyonu en yüksek skoru veren hiperparametre setini seçtiğinden ötürü C hiperparametresi için 1e4 değerini sub-optimal değer olarak seçmiş görünüyor. Eğitim seti skorundaki artış devam ederken doğrulama skorunda C = 1e4’ten sonra kayda değer bir artış olmadığı görülüyor. Bu sebeple daha iyi bir genelleme için C değerini 1e4 olarak seçmenin daha isabetli olduğunu görüyoruz.

Uygulamanın github repo’suna erişmek için tıklayın.

Keyifli öğrenmeler 🙂

İlk Yorumu Siz Yapın

Bir Cevap Yazın

Translate »
%d blogcu bunu beğendi: