Bu yazımda, Makine Öğrenmesi algoritmalarından birinin anlatımından farklı olarak, ML modelimizi verdiği sonuçlar itibariyle nasıl daha iyi hale getirebileceğimizi anlatacağım. Bildiğiniz gibi, ML modelleri veriyi uygun halde işledikten ve kullandıktan sonra, eğitim sürecine geçer ve daha sonra tahminlerde bulunur. Tahminlerimizi daha iyi hale getirmek için de parametrelerle oynarız. Bu arada, parametre demişken, ML modellerinde parametreler için kısa bir ayrım yapmak istiyorum. Genel olarak, iki tür parametre çeşidi bulunur: Model Parametreleri ve Hiperparametreler. Model parametreleri eğitim esnasında oluşur ve bunlara direkt müdahele edemeyiz. Verinin kalitesine göre kendisi şekillenir. Hiperparametreler ise eğitimden önce manuel olarak ayarlanır.
Hiperparametrelere farklı ML/DL modelleri için örnek verecek olursak;
Neurol Networks: Learning rate, Epoch sayısı, katman sayısı…
Suppor Vector Machine: C, Kernel, Gamma…
Linear Regression: L1, L2 regulasyonu
Random Forest: Tree sayısı ve derinliği
Kendi yaptığım ML modellerinde de her zaman karşıma çıkan Hiperparametre ayarlamaları beni bir zamanlar çok uğraştırmıştı. Hiperparametreleri neden ayarlamamız gerektiğini söyleyecek olursak; kısaca, model performansını arttırmak, overfitting denen belayı engellemek ve eğitim süresini kısaltmak olarak özetleyebiliriz.
Hiperparametreleri optimize etmek için aslında bir takım algoritmalar mevcut. GridSearchCV, RandomizedSearchCV, Bayesian Optimization gibi. Fakat bu yazımda, optimizasyonu halletmek için farklı bir algoritmadan, PSO‘dan (Particle Swarm Optimization) bahsedeğim.
PSO algoritması aslında, optimizasyon algoritmalarından bir tanesi. Optimizasyon kısaca nedir diye hatırlayacak olursak; elimizdeki input değerleriyle, problemin çözümüne en iyi katkı sağlayan değerleri bulmaya optimizasyon diyoruz. Optimizasyon problemlerinde genelde belirli kısıtlar olur ve o kısıtlar içerisinde problemin çözümü için en iyi değeri bulmaya çalışırız.
Peki PSO algoritması optimizasyonu nasıl yapıyor? PSO algoritması aslında, adından da anlaşılabileceği gibi (Parçacık Sürü Optimizasyonu), doğada sürü halinde olan hayvanların, örneğin kuşların, hareketlerini inceleyerek, belirli bir hedefe nasıl ulaştıklarını inceler ve bir kısım matematiksel işlemlerle en iyi çözümü bulmaya çalışır. Kuş sürüsü örneğinden devam edecek olursak, kuş sürüsünün yiyecek bulmak için beraber hareket etmesini ve sürüdeki kuşların kendi aralarında konuştuğunu hayal edebiliriz. Burada her bir kuşu parçacık olarak düşünebiliriz. Peki PSO optimizasyonunun matematiksel formülündeki terimleri nasıl anlamamız gerekir? Şimdi buna bakalım. İlk önce formüle bakarsak;
Bu formüldeki terimler;
v: parçacık hızı
x: parçacık değeri, pozisyonu
c1,c2: Sabit değerler
rand1,rand2: rasgele değerler
pbest: parçacığın çözüme en çok yaklaştığı durum
gbest: tüm parçacıklar arasında çözüme en çok yaklaşılan durum
Peki PSO algoritması adım olarak nasıl çalışıyor, kısaca ondan da bahsedersek;
1- Sabit değerleri belirle
2- İlk hız ve pozisyonlarla çözümü başlat
3- Her bir parçacığın problemin çözümüne uygunluğuna bakarsak
4- pbest ve gbest değerlerini hesapla
5- Her bir parçacığın hız ve pozisyonunu güncelle
6- 3. adıma geri dön ve uygun çözüm bulunana kadar iterasyona devam et.
Her bir optimizasyon probleminde olduğu gibi, PSO algoritmasını kullanmak için elimizde problemi belirleyen bir amaç fonksiyonu olması gerekir. ML modellerinde de hiperparametreleri optimize etmek için ilk önce bir amaç fonksiyonu belirleriz. Ardından hiperparametrelerin alt ve üst kısıtlarını belirleyerek PSO algoritmasını modelimizde kullanabiliriz.
Aşağıda PSO algoritmasının Support Vector Regression modelinde hiperparametreleri optimize etmek için Python ile nasıl kullanıldığını bulabilirsiniz.
Aslında PSO algoritmasını daha geniş örneklerle anlatmak istiyordum. Şimdilik bununla yetinelim.
Bir dahaki yazımda buluşmak üzere!!
Kolay gelsin!
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error
# Boston Housing datasetini yükle
boston = datasets.load_boston()
X = boston.data
y = boston.target
# Veriyi test ve eğitim için ikiye ayır
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Amaç fonksiyonunu belirle
def objective_function(params):
c, gamma, epsilon = params
svr = SVR(C=c, gamma=gamma, epsilon=epsilon)
svr.fit(X_train, y_train)
y_pred = svr.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
return mse
# Hiperparametreler için kısıtları belirle
lower_bound = [1e-3, 1e-3, 1e-3]
upper_bound = [10, 10, 10]
# PSO algoritması için değerleri belirle
n_particles = 10
n_dimensions = 3
max_iter = 50
w = 0.9
c1 = 0.5
c2 = 0.3
# PSO fonksiyonunu belirle
def pso(objective_function, lower_bound, upper_bound, n_particles, n_dimensions, max_iter, w, c1, c2):
# Arama uzayında parçacıkları rasgele başlat
particles = np.random.uniform(low=lower_bound, high=upper_bound, size=(n_particles, n_dimensions))
# pbest ve gbest değerlerini başlat
personal_best_positions = particles
global_best_position = particles[np.argmin([objective_function(p) for p in particles])]
# Hız değerlerini başlat
velocities = np.zeros((n_particles, n_dimensions))
# Optimizasyona başla
for i in range(max_iter):
# Hızları güncelle
r1 = np.random.rand(n_particles, n_dimensions)
r2 = np.random.rand(n_particles, n_dimensions)
velocities = w * velocities + c1 * r1 * (personal_best_positions - particles) + c2 * r2 * (global_best_position - particles)
# Pozisyonları güncelle
particles = particles + velocities
# Kısıtlara dikkat et
particles = np.clip(particles, lower_bound, upper_bound)
# pbest ve gbest değerlerini güncelle
for j in range(n_particles):
if objective_function(particles[j]) < objective_function(personal_best_positions[j]):
personal_best_positions[j] = particles[j]
if objective_function(personal_best_positions[j]) < objective_function(global_best_position):
global_best_position = personal_best_positions[j]
return global_best_position
# Hiperparametreler için PSO fonksiyonunu çalıştır
hyperparameters = pso(objective_function, lower_bound, upper_bound, n_particles, n_dimensions, max_iter, w, c1, c2)
# En iyi hiperparametre değerleriyle SVR eğitimini başlat
c, gamma, epsilon = hyperparameters
svr = SVR(C=c, gamma=gamma, epsilon=epsilon)
svr.fit(X_train, y_train)
# Performansı test verisi üzerinde değerlendir
y_pred = svr.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)