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.
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.
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.
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.
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.
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()
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://towardsdatascience.com/catboost-vs-light-gbm-vs-xgboost-5f93620723db
https://towardsdatascience.com/why-you-should-learn-catboost-now-390fb3895f76