Makine Öğrenmesi - II. Doğrusal Olmayan İlişkiler (Non-Linear Relationships)

Gradient Boosting

Yayın tarihi :10-Oca-22
Bölüm kodlarını ve/veya veri setlerini indir.

Gradient Boosting, zayıf tahmin modellerini birleştirerek bir topluluk modeli oluşturmak için kullanılır. Hem regresyon hem de sınıflandırma modellerini eğitmek için kullanılabilir. 

Kullanabilmek için "GradientBoostingRegressor" kütüphanesinin içe aktarılması gerekmektedir.

from sklearn.ensemble import GradientBoostingRegressor

Söz dizimi: GradientBoostingRegressor(loss='squared_error', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, init=None, random_state=None, max_features=None, alpha=0.9, verbose=0, max_leaf_nodes=None, warm_start=False, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0)

  • loss, optimize edilecek kayıp fonksiyonu temsil eder. 4 farklı değer alabilir; 'squared_error', 'absolute_error', 'huber', 'quantile'. Varsayılan olarak squared_error değerini alır. squared_error:karesi alınmış hatayı ifade eder, absolute_error:mutlak regresyon hatasını ifade eder, huber: squared_error ve absolute_error'un birleşimini ifade eder, quantile:niceliksel regresyona izin verir.
  • learning_rate, öğrenme oranını temsil eder.
  • n_estimators, güçlendirilecek aşama sayısını temsil eder.
  • criterion, bir bölünmenin kalitesini ölçme işlemini temsil eder. 4 farklı değer alabilir:'friedman_mse', 'squared_error', 'mse', 'mae'. Varsayılan olarak friedman_mse'dir. 
  • max_depth, regresyon tahminleyicilerinin maksiumum derinliğini temsil eder.
  • max_features, en iyi bölünmeyi ararken göz önünde bulundurulması gereken özelliklerin sayısını temsil eder. 3 farklı değer alabilir, “auto”, “sqrt”, “log2”. Varsayılan olarak auto'dur. auto ise max_features=n_features, sqrt ise max_features=sqrt(n_features) ve log2 ise de max_features=log2(n_features).

Örnek-1: Sklearn paketi altında bulunan diabets veri setine "Gradient Boosting" algoritması uygulayalım.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error
from sklearn import datasets

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.datasets import make_regression

Diabets setinin hikayesi: diyabet hastalarınının on temel değişkeni: yaş, cinsiyet, vücut kitle indeksi, ortalama kan basıncı ve altı kan serumu ölçümü ve ayrıca başlangıçtan bir yıl sonra hastalık ilerlemesinin yanıt değerlerini içerren bir veri setidir.

Diabets veri setini yukarda import etmiş olduğumuz "datesets" altından yükleyelim ve x ve y değerlerine eşitleyelim.

dataset=datasets.load_diabetes()
#dataset data(x) değerleri ve target(y) değerlerinden oluşmaktadır.
x,y=dataset.data,dataset.target
print("x'in 1. satırı={}".format(x[0:1]))
print("y'in 1. satırı={}".format(y[0:1]))

Çıktı:

x'in 1. satırı=[[ 0.03807591  0.05068012  0.06169621  0.02187235 -0.0442235  -0.03482076
  -0.04340085 -0.00259226  0.01990842 -0.01764613]]
y'in 1. satırı=[151.]
GB=GradientBoostingRegressor()
#Öğrenme işlemi
GB.fit(x_train,y_train)
#Gradient Boosting listesi(n_estimators=100) toplamda 100 olarak(varsayılan değer) seçilmişti, ilk 4 satır listelendi.
GB.estimators_[0:4]

Çıktı:

array([[DecisionTreeRegressor(criterion='friedman_mse', max_depth=3,
                              random_state=RandomState(MT19937) at 0x214DDD0B840)],
       [DecisionTreeRegressor(criterion='friedman_mse', max_depth=3,
                              random_state=RandomState(MT19937) at 0x214DDD0B840)],
       [DecisionTreeRegressor(criterion='friedman_mse', max_depth=3,
                              random_state=RandomState(MT19937) at 0x214DDD0B840)],
       [DecisionTreeRegressor(criterion='friedman_mse', max_depth=3,
                              random_state=RandomState(MT19937) at 0x214DDD0B840)]],
      dtype=object)
#Tahminleme işlemi
predict_GB=GB.predict(x_test)
#MSE değeri
mean_squared_error(y_test, predict_GB)

Çıktı:

3389.373015714363
#Doğruluk yüzdesi
r2_score(y_test,predict_GB)*100

Çıktı:

30.886104334227994

En optimum değerleri nelerdir?

**Parametreler test amaçlı rasgele değerlerden girildiğinden önceki sonuçtan daha düşük değerler de elde edilebilir.

#GridSearchCV kütüphanesi import işlemi
from sklearn.model_selection import GridSearchCV
#param_grid değerleri sözlüğü
parameters={
    "learning_rate":[0.1,0.05],
    "n_estimators":[100,150],
    "max_depth":[3,4,5],
    "max_features":["auto", "sqrt", "log2"]
}
#GridSearchCV tanımlama
gsc=GridSearchCV(GB,param_grid=parameters)
#GridSearchCV model eğitimi
gsc.fit(x_train,y_train)
#girilen en iyi parametre değerleri
gsc.best_params_

Çıktı:

{'learning_rate': 0.05,
 'max_depth': 3,
 'max_features': 'sqrt',
 'n_estimators': 100}
#En iyi parametreleri GradientBoostingRegressor'de tanımlayalım
GB=GradientBoostingRegressor(
    learning_rate=0.05,
    max_depth=3,
    max_features="sqrt",
    n_estimators=100)
#Model eğitimi
GB.fit(x_train,y_train)
#Model tahminlemesi
predict_GB=GB.predict(x_test)
#yeni MSE değeri
mean_squared_error(y_test, predict_GB)

Çıktı:

3033.470714501523
#Doğruluk yüzdesi
r2_score(y_test,predict_GB)*100

Çıktı:

38.14343316737444

Tahmin edilen x_test değerlerinin gerçek değerleri ve tahmin değerlerinin grafikselleştirilmesi.

#0 değerlerinden oluşan uzunluğu 100 olan bir liste oluşturalım
lost_list = np.zeros(100)

#GB modelimizdeki n_estimators değerini atayalım
n_estimators=100

#GB.staged_predict(x_test) her iterasyonun sonuçlarını döndürmek için kullanılır.
for i, predict_ in enumerate(GB.staged_predict(x_test)):
    lost_list[i]=GB.loss_(y_test,predict_)

#grafik çizme işlemleri
#fig değerini tanımlayalım
fig=plt.figure(figsize=(6,6))
#1 satırda 1 tane grafik olacaktır
ax1=fig.add_subplot(111)
#tahmin edilen değerlerin çizgisel grafiği
ax1.plot(
    np.arange(100)+1, 
    lost_list,
    "r-",
    label="Tahmin değerleri sapması")

ax1.plot(
    np.arange(100) + 1,
    GB.train_score_,
    "b-",
    label="Gerçek değerlerin sapması",
)

plt.xlabel("İterasyon(Yineleme) Değerleri")
plt.ylabel("Sapma Değerleri")
plt.show()

Çıktı:

Paylaş:

Yorum Yap (*Yorumunuza kod eklemek isterseniz Kod Parçacığı Ekle butonuna tıklayarak ekleyebilirsiniz.)

Yorumlar

Henüz hiç yorum yapılmamış, ilk yorum yapan sen ol.