CatBoost Nedir? Diğer Boosting Algoritmalarından Farkı Nelerdir?

Catboost, Yandex şirketi tarafından geliştirilmiş olan Gradient Boosting tabanlı açık kaynak kodlu bir makine öğrenmesi algoritmasıdır. Gradient Boosting’in performansını arttırmak amacıyla geliştirilen XGBoost ve LightGBM’e alternatif olarak Nisan 2017 tarihinde “CatBoost: unbiased boosting with categorical features” makalesiyle tanıtılmıştır. Adı “Category” ve “Boosting” kelimelerinin birleşiminden gelmektedir.

Şekil-1: Algoritmalar ile İlgili Makale Tarihleri

Yüksek öğrenme hızı, hem sayısal hem kategorik hem de metin verileri ile çalışılabilmesi, GPU desteği ve görselleştirme seçenekleri sunması diğer algoritmalardan en çok ayrılan özellikleridir.

Ancak bunların yanında sayılabilecek birçok özelliği daha vardır.

Bu yazıda Catboost’un nasıl çalıştığından ziyade diğer boosting algoritmalarından farkları, güçlü ve zayıf yönleri anlatılacaktır. Bu nedenle yazıyı daha iyi anlamak için öncelikle Gradient Boosting, XGBoost ve LightGBM yazılarımı okumanızı tavsiye ederim. Yazılara link’ten erişebilirsiniz.

DİĞER BOOSTING ALGORİTMALARINDAN FARKI NELERDİR?

CatBoost, veri hazırlığı evresini kısaltması ile önemli bir konuma sahiptir. Boş veriler ile başa çıkabilir, kategorik verilere kodlama(encoding) uygular.

Kategorik veriler ile yüksek performanslı çalışabilmesinin nedeni kendine has bir kodlama metoduna sahip olmasıdır. Yani veri hazırlığı yaparken ayrıca bir kodlama işlemi yapılmasına gerek duyulmamaktadır. Hatta kodlama yapılmaması özellikle tavsiye edilir. Bu hem öğrenme hızını hem de sonuçların kalitesini etkileyecektir. (Algoritmanın kategorik veriler ile nasıl çalıştığı ile ilgili detaylara link‘ten erişilebilir.)

Ayrıca Catboost simetrik ağaçlar kurar. Bu sayede çok derin ağaçlar kurmadan yüksek tahmin oranı yakalar ve aşırı öğrenme sorununu aşar.

Şekil-2: Simetrik Olmayan – Simetrik Ağaç Örneği

Eğer aşırı öğrenme meydana gelirse algoritma parametrelerde belirtilen özelliklere(örneğin belirtilen ağaç sayısına) ulaşmadan önce öğrenmeyi durdurur. Bu seçenek başlangıç parametrelerinden ayarlanmaktadır.

Algoritma GPU ile öğrenim (training) yapabilmektedir. Bu sayede öğrenim süresi kısalmaktadır. Algoritmanın GPU üzerinde çalışabilmesi için NVIDIA Driver version 418 ya da üstü ekran kartına sahip olunması gerekmektedir.

Öğrenme sırasında CatBoost bellek kopyaları alır. Eğer bilgisayarın bir anda kapanması gibi beklenmedik bir sorun yaşanırsa öğrenme aşaması kaldığı yerden devam eder. Bellek kopyası alınması durumu parametrelerle kontrol edilebilir. Bu özellik kullanılabilir ya da kapatılabilir. Bu özellik büyük hacimli verilerle çalışırken öğrenim süresi çok uzun olacağı için oldukça önemlidir.

Kaydedilen modelin tekrar başlaması için sadece çalışmanın aynı dosyada tekrar başlatılması ve aynı parametrelerin kullanılması gerekmektedir.

Veri bilimi çalışmalarında doğru tahmin oranı kadar önemli olan bir diğer konu da modelin açıklanabilmesidir. Ipywidgets kütüphanesinin yüklenmesi sonrası Jupyter Notebook’ta CatBoost’a özel bir grafik gösterimi yapılabilr. Aşağıda örnek grafikler görülmektedir.

Şekil-3: CatBoost Grafik Örneği
Şekil-4: CatBoost Grafik Örneği

Bu grafikler ile modelin öğrenim durumu veya parametrelerin modele etkisi gibi bilgiler edinilerek hem optimizasyon aşaması kolaylaşır hem de model daha rahat açıklanabilir.

Grafikleri elde etmek için aşağıdaki kod parçacığında da görülebileceği gibi “eval_set=(X_test, y_test), plot=True” parametrelerinin eklenmesi gerekmektedir.

cat_model.fit(X_train, y_train, eval_set=(X_test, y_test), plot=True)

Ayrıca aşağıdaki grafik ile değişkenlerin önemleri ve hangi değerde bağımlı değişkene nasıl etki ettiği ile ilgili fikir sahibi olunabilir, tahminlemenin yanı sıra iş birimlerine aksiyon alabilmeleri için çıktılar sağlanabilir.

Şekil-5: CatBoost Grafik Örneği

Grafikte yeşil renk verilerin dağılımı, mavi renkte her bölmedeki ortalama hedef değer, turuncu renkte her bölmedeki ortalama tahmini değer, kırmızıda kısmi bağlılık (partial dependency)’tır.

Model kurulduktan sonra performans ölçümü için CatBoost 3 farklı yöntem sunar. Bunlar orjinal isimleri ile PredictionValuesChange, LossFunctionChange and InternalFeatureImportance’dır.

PredictionValuesChange, her bağımsız değişken için değişken değeri değişirse tahminin ortalama ne kadar değiştiğini gösterir.

LossFunctionChange, her bağımsız değişken için bu özelliğe sahip olan ve olmayan modelin kayıp değeri arasındaki farkı temsil eder. Bu değişkene sahip olmayan model, bu değişkenin veri kümesinden çıkarılması durumunda eğitilecek olan model anlamına gelir.

MODEL PARAMETRELERİ

Yukarıda anlatıldığı gibi CatBoost algoritmasının birçok özelliği bulunmaktadır. Bu özellikleri kullanmak için çeşitli parametre tanımları yapılmalıdır. Sıklıklar kullanılan parametrelerin açıklamaları aşağıdadır. Daha fazlasına link‘ten ulaşabilirsiniz.

Max_Depth: Ağacın dallarının aşağı doğru uzamasının değeridir. Diğer bir anlatımla ağacın derinliğidir. Aşırı öğrenmeden kaçınmak için optimum seviyeye getirilmelidir. Çok dallanma aşırı öğrenmeye, az dallanma eksik öğrenmeye sebep olacaktır.

Learning_rate: Kurulan ağaçları ölçeklendirmek için 0-1 arasında verilen bir değerdir. Bu değerin küçük olması daha iyi tahmin gücüne yardımcı olacaktır. Ancak öğrenim süresini ve aşırı öğrenme ihtimalini arttıracaktır.

Iterations: Oluşturulacak ağaç sayısıdır. Farklı algoritmalarda “num_boost_round”, “n_estimators”, “num_trees” isimleri ile de kullanılır. Az olması eksik öğrenmeye, fazla olması aşırı öğrenmeye neden olabilir. Ayrıca sayının artması eğitim süresini de arttıracaktır.

Eval_set: Aşırı öğrenme tespiti için kullanılacak veri setlerinin tanımlandığı parametredir.

Eval_metric: Aşırı öğrenmeyi tespit etmek için kullanılan bir parametredir.

Cat_features: Algoritmanın kategorik veriler ile çalışabilmesi için modeli kurmadan önce kategorik verilerin tanıtılması gerekmektedir. Bu parametrede kategorik verilerin index’leri belirtilmelidir.

Early_stopping_rounds: Aşırı öğrenmeyi engellemek için kullanılan parametredir. En uygun adımı bulduktan sonra kaç kez deneme yapacağı belirtilmelidir. Örneğin bu değer 100 ile model en uygun olduğu andan sonra 100 iterasyon daha yapar ve hedef parametreler yakalanmasa bile model öğrenmeyi durdurur. Örneğin başlangıç parametresinde iterasyon sayısı 2000 verilmiş olsun, en uygun ana 1000. iterasyonda ulaştıysa model burada duracaktır.

Save_snapshot: Modelin öğrenme aşamasında bellek kopyasının oluşmasını sağlayan parametredir. Etkinleşirse her 600 saniyede 1 kayıt alır. Bu süreyi değiştirmek için “snapshot_interval” parametresi kullanılabilir.

Snapshot_file: Bellek kopyasının saklanacağı dosyanın belirtildiği parametredir.

Verbose: Her iterasyonda çıktısı olarak modelin öğrenim durumu, toplam süre ve kalan süre bilgisi gelmektedir. Bu çıktı çok iterasyonun olduğu durumda ekranda çok fazla alan kaplamakta ve buna değecek kadar bilgi vermemektedir. Verbose parametresi ile bu çıktıların sayısı azaltılabilmektedir ya da tamamen kaldırılabilir. Örneğin verbose=50 olan durumda, model her 50 iterasyon için 1 çıktı verecektir. verbose=False diyerek ise çıktıların görünmesini engelleyebilirsiniz.

Şekil-6: Verbose ayarı yapılmadığında çıkan ekran

UYGULAMA

Uygulamada daha önceki boosting inceleme yazılarımda da kullanılmış olan, Kaggle web sitesinden erişilebilen “Human Activity Recognition” veri seti kullanılmıştır. 30 gönüllü denek ile oluşturulan bu veri setinde, gönüllülere akıllı telefonlar üzerlerindeyken yürüme, merdiven çıkma, merdiven inme, oturma, kalkma ve uzanma hareketleri yaptırılmıştır. Veri setinin amacı elde edilen verilerle insan davranışlarının tahminlenmesidir. Veri setine link‘ten ulaşabilirsiniz.

Uygulama Windows 10 işletim sisteminde, Python ile Jupyter Notebook kullanılarak yapılmıştır.

Veri hazırlığı ve incelemesi aşaması diğer yazılar ile aynıdır. Bu yazıları okuyanlar bir sonraki başlığa geçebilirler.

#Uygulamada kullanılacak kütüphaneler tanımlanmıştır.
import os
import pandas as pd
import numpy as np
from warnings import filterwarnings
filterwarnings('ignore')
df = pd.read_csv('Simplified_Human_Activity_Recognition.csv')
df = df.drop(labels=['rn'], axis=1)
df.head()
Şekil-7: Veri seti ilk beş satır görünümü
df.shape
(3609, 562)

Datada 3.609 satır ve 562 sütun bulunmaktadır.

#bağımlı ve bağımsız değişkenler belirlenmiştir.
y = df[['activity']]
X = df.iloc[:,1:]

Uygulamada tahmini biraz daha zorlaştırmak için bağımlı değişken sayısı 561’den 20’ye düşürülmüştür.

X=X.sample(n=20, axis=1, random_state=1)
X.shape
(3609, 20)
#Veri seti %70 train, %30 test olarak bölünmüştür.
from sklearn.model_selection import train_test_split, GridSearchCV
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state = 42)

Algoritmaların çalışma sürelerini ölçmek için “time” kütüphanesinden yaralanılmıştır.

#Gradient Boosting Uygulaması
from sklearn.ensemble import GradientBoostingClassifier
from time import time
t0 = time()
gbm_model = GradientBoostingClassifier()
gbm_model.fit(X_train, y_train)
gbm_time = time() - t0
gbm_acc = accuracy_score(y_test, gbm_model.predict(X_test))
#XGBoost Uygulaması
from xgboost import XGBClassifier
t0 = time()
xgb_model = XGBClassifier()
xgb_model.fit(X_train, y_train)
XGBoost_time = time() - t0
XGBoost_acc = accuracy_score(y_test, xgb_model.predict(X_test))
#LightGBM Uygulaması
import lightgbm as lgb
t0 = time()
lgb_model = lgb.LGBMClassifier()
lgb_model.fit(X_train, y_train)
lgb_time = time() - t0
lgb_acc = accuracy_score(y_test, lgb_model.predict(X_test))
#Catboost Uygulaması
from catboost import CatBoostClassifier
from time import time
t0 = time()
cat_model=CatBoostClassifier()
cat_model.fit(X_train, y_train)
cat_time = time() - t0
cat_acc = accuracy_score(y_test, cat_model.predict(X_test))
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots()
objects = ['GBM', 'XGBoost', 'LightGBM', 'Catboost']
y_pos = np.arange(len(objects))
performance_time = [gbm_time, xgboost_time, lgb_time, cat_time]
performance_acc = [gbm_acc, xgboost_acc, lgb_acc, cat_acc]
ax1.set_ylabel('Saniye')
ax1.bar(y_pos, performance_time, color='forestgreen')
ax1.tick_params(axis='y')
ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis
ax2.set_ylabel('Doğru Tahmin Oranı')  # we already handled the x-label with ax1
ax2.plot(y_pos, performance_acc, color='red')
plt.xticks(y_pos, objects)
fig.tight_layout()  # otherwise the right y-label is slightly clipped
plt.title('Model Performansları')
plt.show()

SONUÇ

“Human Activity Recognition” veri seti ile kurulan modellerde CatBoost en uzun öğrenme süresine ve en kötü 2. tahmin oranına sahip model olmuştur.

Bu çalışmada performansının kötü çıkması başarısız bir algoritma anlamına gelmemektedir. CatBoost’un tercih edilmesinin en önemli nedenleri kolay uygulanabilirliği ve görselleştirme avantajıdır. Algoritmayı kullanmaya karar verirken kategorik verilerin yoğun olduğu durumda yüksek performans iddia ettiği göz önünde bulundurulmalıdır.

Unutulmamalıdır ki parametre optimizasyonu modellemenin en önemli aşamalarından biridir. Hangi algoritma olursa olsun optimize edilmeden yüksek performans beklemek inandırıcı olmayacaktır. Şu ana kadar GBM, XGBoost, LightGBM ve Catboost algoritmalarının incelendiği yazılarında varsayılan değerler ile kurulan modellerin performans karşılaştırılması yapılmıştır.

Bir sonraki yazıda daha büyük ve veri türleri açısından daha çeşitli bir veri setinde uçtun uca uygulama yapılacaktır. Uygulamada parametre optimizasyonuna da yer verilecektir. Bu yazıdan sonra performans karşılaştırması için daha iyi fikir sahibi olunabilir. Takipte kalın 🙂

KAYNAKLAR

CatBoost: unbiased boosting with categorical features – Liudmila Prokhorenkova, Gleb Gusev, Aleksandr Vorobev, Anna Veronika Dorogush, Andrey Gulin (https://papers.nips.cc/paper/7898-catboost-unbiased-boosting-with-categorical-features)

CatBoost: gradient boosting with categorical features support – Dorogush, A. V., Ershov, V., & Gulin, A. (2018)

Simplifying Balance Sheet Adjustment Process In Commercial Loan Applications Using Machine Learning Methods – İbrahim Tozlu

Human Activity Prediction Using Lifelogging Data – Gizem Sariarslan

https://github.com/catboost/catboost

https://catboost.ai/

https://towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db

https://towardsdatascience.com/why-you-should-learn-catboost-now-390fb3895f76

Yazar Hakkında
Toplam 9 yazı
Emre Rıdvan Muratlar
Emre Rıdvan Muratlar
2016 yılından bu yana finans sektöründe veri bilimi üzerine çalışmaktadır. Yıldız Teknik Üniversitesi İstatistik bölümü doktora öğrencisidir.
Yorumlar (Yorum yapılmamış)

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara