Ensemble Learning — Bagging ve Boosting

Şevket Ay
Deep Learning Türkiye
8 min readDec 16, 2019

Diyelim ki yeni bir telefon alacaksınız. Ama hangi model ve ya marka alacağınıza dair bir fikriniz yok. Mağazaya gittiniz ,mağazada çalışan görevlinin tavsiyesine uyarak hemen bir telefon satın alır mısınız? Muhtemelen çoğumuz hemen almayız.

Peki ne yaparız? Mesela internetten araştırma yapabiliriz, insanların fikirlerini okuruz, yapılan incelemeleri izleriz, farklı telefon modelleriyle karşılaştırma yaparız, arkadaşlarımızdan fikir alırız. Kısacası doğrudan bir seçim yapmayız. Son olarak tüm bu topladığımız bilgiler ışığında bir karar veririz.

Makine öğrenimindeki topluluk modelleri (ensemble models) yukarıda örneklediğimiz şekilde çalışır. Genel performansı iyileştirmek için birden fazla modelden alınan kararları birleştirirler.

Bu yazının amacı, topluluk öğrenimi (ensemble learning) kavramını tanıtmak ve bu tekniği kullanan algoritmaları anlamaktır. Yazımızda Bagging(Torbalama) ve Boosting(Yükseltme) üzerinde duracağız. Bu konu hakkındaki anlayışınızı güçlendirmek için, Python’daki gelişmiş algoritmaları gerçek yaşam problemi üzerine uygulamalı bir çalışma ile açıklayacağız.

Topluluk öğrenimi kavramını bir örnekle anlayalım. Mimar olduğunuzu düşünün. Bir bina tasarladınız. Birkaç gün sonra da firmaya sunum yapacaksınız ama bundan önce ön geri bildirim almak istiyorsunuz. Bunu nasıl yapabilirsiniz?

Mesela bir tane arkadaşınıza sorabilirsiniz. Sorduğunuz arkadaşınız sizi çok sevdiği ve hayal kırıklığına uğratmak istemediği için tasarımınıza iyi diyebilir.

Başka ne yapabilirsiniz? 10 tane arkadaşınıza sorabilirsiniz. Bu, tasarım hakkında daha iyi bir fikir sağlayacaktır. Bu yöntem, tasarımınız için dürüst derecelendirme sağlayabilir. Ancak bir sorun hala var. Bu 10 kişi tasarım konusunda ne kadar uzman? Yani ne kadar sağlıklı yorum yapabilirler?

Son olarak 50 kişiye sorabilirsiniz. Bu 50 kişiden tasarımı derecelendirmesini istersiniz. Bazıları arkadaşlarınız olabilir, bazıları meslektaşlarınız olabilir, hatta bazıları yabancı bile olabilir. Bu durumda verilen cevaplar daha genelleştirilmiş ve çeşitlendirilmiş olacak. Görünüşe göre dürüst puanlar almak için önceki yöntemlerden daha iyi bir yaklaşıma sahipsiniz.

Bu örnekle, farklı bir grup insanın, bireylere kıyasla daha iyi kararlar vermesinin muhtemel olduğu sonucuna varabilirsiniz. Makine öğrenmesinde benzer olan şudur, tekli modellere kıyasla farklı modellerde daha iyi ve sağlıklı sonuçlar alırsınız. Makine Öğrenimindeki bu çeşitlilik, Topluluk Öğrenimi adlı bir teknikle gerçekleştirilir.

Artık topluluk öğreniminin ne olduğuna dair bir fikir edindiğinize göre — Topluluk Öğrenimi konusundaki bagging ve boosting tekniklerine uygulamalarıyla birlikte bakalım.

Bu yazımızda öğreneceğimiz tekniklere geçmeden önce bahsetmeyeceğimiz diğer Topluluk Öğrenimi tekniklerini başlıklar halinde vermek istiyorum. Dilerseniz bu tekniklere de çalışabilirsiniz.

Maximum Oylama(Max Voting): Genellikle sınıflandırma problemlerinde kullanılır.

Ortalama(Averaging): Regresyon problemlerinde tahmin yapmak için veya sınıflandırma problemleri için olasılıkları hesaplarken kullanılabilir.

Ağırlıklı Ortalama(Weighted Averaging): Ortalama yönteminin uzantısıdır. Tüm modellerde, tahmin için her modelin önemini tanımlayan farklı ağırlıklar vardır. Örneğin, meslektaşlarınızın tasarımınız hakkındaki cevaplarına diğerlerinin cevaplarından daha fazla önem verilir.

Yığma(Stacking) : Yeni bir model oluşturmak için birden fazla modelden (örneğin karar ağacı(decision tree), KNN veya SVM) tahminleri kullanan bir topluluk öğrenimi tekniğidir. Bu model, test setinde öngörülerde bulunmak için kullanılır.

Harmanlama(Blending) : Yığma ile aynı yaklaşımı izler, ancak yalnızca tahmin yapmak için eğitim seti tarafından ayarlanan bir doğrulama kullanır.

Şimdi gelelim öğreneceğimiz asıl tekniklere. İlk olarak Torbalama(Bagging) tekniğini ele alalım. Daha sonra Yükseltme(Boosting) tekniği ile devam edelim ve uygulamamızı gerçekleştirelim. Son olarak bu iki teknik arasındaki farkları öğrenerek yazımızı bitirelim.

1. Torbalama(Bagging)

Torbalama (bootstrap aggregating — önyükleme toplaması) yöntemi 1996 yılında Breiman tarafından geliştirilmiştir. Orijinal veri setinden elde edilen önyükleme örneklerine tahminciler uygulanarak bir topluluk oluşturulur. Burada önyükleme uygulaması, iadeli rastgele seçim yapıp alt örneklemler oluşturmak için kullanılır.

Oluşturulan alt örneklemler orijinal veri setindeki sayı ile aynı olacaktır. Bu nedenle bazı gözlemler önyükleme sonucunda oluşturulan örneklemlerde yer almazken bazıları iki veya daha fazla defa görülebilir. Tahminlerin birleştirilmesi aşamasında regresyon ağaçları için ortalama alınırken sınıflandırma ağaçlarında sonuçlar oylama ile belirlenir.

Torbalama, tutarsız bir tahminci değişkenin tahmin geçerliliğini de arttırabilir. Düşük yanlılık miktarına sahip ama yüksek varyanslı olan değişkenleri kullanarak onları daha elverişli hale getirir. Ayrıca deneysel sonuçlara göre torbalama yöntemi, tekil ağaçlara göre daha etkin sonuçlar vermektedir.

  • Orijinal veri kümesinden çoklu alt kümeler oluşturulur.
  • Bu alt grupların her birinde bir temel model (zayıf model) oluşturulmuştur.
  • Modeller paralel olarak çalışır ve birbirinden bağımsızdır.
  • Nihai tahminler, tüm modellerden gelen tahminler birleştirilerek belirlenir.
kdnuggets.com’dan alınmıştır.

2. Yükseltme(Boosting)

Yükseltme yöntemindeki temel fikir, veri setine farklı ağırlıklar verilmesi sonucu elde edilen ağaçlar topluluğundan çıkarsamalar yapılmasıdır. Başlangıçta tüm gözlemler eşit ağırlığa sahiptir. Ağaç topluluğu büyümeye başladıkça, problem bilgisine kurulu olarak ağırlıklandırmalar düzenlenir. Yanlış sınıflandırılan gözlemlerin ağırlığı arttırılırken, nadiren yanlış sınıflandırılan gözlemlerin ağırlığı azaltılır. Bu sayede ağaçlar zor durumlar karşısında kendini düzenleyebilme yeteneği kazanır.

Yükseltme yönteminin nasıl çalıştığını aşağıdaki adımlarla anlayalım.

  • Orijinal veri kümesinden bir alt küme oluşturulur.
  • Başlangıçta, tüm veri noktalarına eşit ağırlık verilir.
  • Bu alt kümede bir temel model oluşturulur.
  • Bu model, tüm veri kümesi için tahminler yapmak için kullanılır.
  • Hatalar gerçek değerler ve öngörülen değerler kullanılarak hesaplanır.
  • Yanlış öngörülen gözlemlere daha fazla ağırlık verilir.
    (Burada, sınıflandırılmamış olan üç tane mavi artı noktaya daha fazla ağırlık verilecektir.)
  • Başka bir model oluşturulur ve veri setinde tahminler yapılır.
    (Bu model önceki modeldeki hataları düzeltmeye çalışır.)
  • Benzer şekilde, her biri önceki modelin hatalarını düzelten çoklu modeller oluşturulur.
  • Son model (güçlü öğrenen), tüm modellerin ağırlıklı ortalamasıdır.
kdnuggets.com’dan alınmıştır.

Torbalama ve Yükseltme Tekniklerine Dayalı Algoritmalar

Torbalama ve Yükseltme, makine öğrenmesinde en yaygın kullanılan tekniklerden ikisidir. Bu bölümde, onlara detaylı olarak bakacağız. Odaklanacağımız algoritmalar aşağıdadır:

Torbalama algoritmaları :

  • Bagging meta-estimator
  • Random Forest

Yükseltme algoritmaları :

  • AdaBoost
  • GBM
  • XGBM

Bu yazı için Kredi Tahmini Problemini kullandım. Şirket, çevrimiçi başvuru formunu doldururken verilen müşteri detaylarına dayalı olarak kredi uygunluk sürecini (gerçek zamanlı) otomatikleştirmek istemektedir. Bu detaylar Cinsiyet, Medeni Hal, Eğitim, Bağımlılık Sayısı, Gelir, Kredi Tutarı, Kredi Geçmişi ve diğerleridir. Burada kısmi bir veri seti sağladılar. Veri setini buradan indirebilirsiniz.

Kod yazımına başlayalım..

#Kullanacağımız paketleri import ediyoruz.
import numpy as np
import pandas as pd
#dataset
data=pd.read_csv("...\\Desktop\\ensemble.csv")
data.head(10)
#Datamızdaki kayıp değerleri görmek için ;data.isna() # True dönen değerler , kayıp olan değerlerdir.#Kayıp değerlerimizin yerini dolduralım ;
#fillna , eksiklikleri(Nan)istediğin bir değer ile doldurur.
data['Gender'].fillna('Male', inplace=True)
data['Dependents'].fillna('0', inplace=True)
data['Dependents'].fillna('0', inplace=True)
data['Self_Employed'].fillna('Yes', inplace=True)
data['LoanAmount'].fillna('0',inplace=True)
data['Loan_Amount_Term'].fillna('0',inplace=True)
# Dataset'imizi test ve train olarak bölelim.

from sklearn.model_selection import train_test_split #import
#test_size = 0.2 yani test=%20,train=%80 oranında böl.
#random_state=42 yazmamın sebebi kodumuzu yeniden çalıştırdığımızda
#aynı test ve train değerlerini bize getirmesi için.Siz 42 yazmak
#zorunda değilsiniz.
train, test = train_test_split(data, test_size=0.2, random_state=42)
#Şuan train ve test olarak data değerlerim ayrılmış durumda.
# train değerlerimden Loan Status'u(Kredi Durumu)siliyorum.(drop)
# ve bu haliyle x_train'e atıyorum.
# Şimdi y_train'e Loan Status değerlerimi atıyorum.
# Aynı işlemleri test değerlerim içinde yapıyorum.
x_train=train.drop('Loan_Status',axis=1)
y_train=train['Loan_Status']

x_test=test.drop('Loan_Status',axis=1)
y_test=test['Loan_Status']

#pd.get_dummies ne için kullanılır örnek üzerinde öğrenmeniz için ;
# https://pandas.pydata.org/pandas- docs/stable/reference/api/pandas.get_dummies.htmlx_train=pd.get_dummies(x_train)
x_test=pd.get_dummies(x_test)

Bagging meta-estimator

  • Bagging meta-estimator, hem sınıflandırma (BaggingClassifier) hem de regresyon (BaggingRegressor) problemleri için kullanılabilen bir algoritmadır. Tahmin yapmak için tipik torbalama tekniğini izler. Torbalama meta-estimator algoritması için adımlar şunlardır:
  • Rastgele alt kümeleri orijinal veri kümesinden oluşturulur.
  • Veri kümesinin alt kümesi tüm özellikleri içerir.
  • Bu küçük setlerin her birine kullanıcı tarafından belirlenen bir baz tahmincisi takılmıştır.
  • Nihai sonucu elde etmek için her modelden yapılan tahminler birleştirilir.
from sklearn.ensemble import BaggingClassifier
from sklearn import tree
model=BaggingClassifier(tree.DecisionTreeClassifier(random_state=1))
model.fit(x_train, y_train)
model.score(x_test,y_test)

Regresyon problemi için örnek kod:

from sklearn.ensemble import BaggingRegressor
model = BaggingRegressor(tree.DecisionTreeRegressor(random_state=1))
model.fit(x_train, y_train)
model.score(x_test,y_test)

AdaBoost

Adaptif Boosting veya AdaBoost, en basit yükseltme algoritmalarından biridir. Genellikle, karar ağaçları modelleme için kullanılır. Her biri son modeldeki hataları düzelten çoklu sıralı modeller oluşturulur. AdaBoost, yanlış tahmin edilen gözlemlere ağırlık atar ve sonraki model bu değerleri doğru şekilde tahmin etmek için çalışır.

AdaBoost algoritmasını gerçekleştirme adımları aşağıda verilmiştir:

  • Başlangıçta, veri kümesindeki tüm gözlemlere eşit ağırlık verilir.
  • Bir model, veri alt kümesine dayanır.
  • Bu model kullanılarak, tüm veri seti için tahminler yapılmıştır.
  • Hatalar tahminler ve gerçek değerler karşılaştırılarak hesaplanır.
  • Bir sonraki modeli oluştururken, yanlış tahmin edilen veri noktalarına daha fazla ağırlık verilir.
  • Ağırlıklar hata değeri kullanılarak belirlenebilir. Örneğin, hata ne kadar yüksekse, gözlem için tayin edilen ağırlıktır.
  • Bu işlem, hata fonksiyonu değişmeden veya tahmin edicilerin sayısının maksimum limitine ulaşılana kadar tekrarlanır.
from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(random_state=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)

Regresyon problemi için örnek kod:

from sklearn.ensemble import AdaBoostRegressor
model = AdaBoostRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)

Gradient Boosting (GBM)

Gradient Boosting veya GBM, hem regresyon hem de sınıflandırma problemleri için çalışan bir başka topluluk makine öğrenme algoritmasıdır. GBM, güçlü bir öğrenici oluşturmak için birtakım zayıf öğrenicileri birleştirerek, yükseltme tekniğini kullanır. Temel öğrenici olarak kullanılan regresyon ağaçları, her biri seri halinde olan bir ağaç önceki ağaç tarafından hesaplanan hatalar üzerine kuruludur.

from sklearn.ensemble import GradientBoostingClassifier#learning rate = öğrenme hızımodel= GradientBoostingClassifier(learning_rate=0.01,random_state=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)

Regresyon problemi için örnek kod:

from sklearn.ensemble import GradientBoostingRegressor
model= GradientBoostingRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)

XGBoost

XGBoost (extreme Gradient Boost), gradient boosting algoritmasının gelişmiş bir uygulamasıdır. XGBoost, yaygın olarak makine öğrenimi yarışmalarında kullanılan son derece etkili bir makine öğrenmesi algoritması olduğunu kanıtladı. XGBoost yüksek tahmin gücüne sahiptir ve diğer gradient boosting tekniklerinden neredeyse 10 kat daha hızlıdır. Ayrıca, fazla uyumu azaltan ve genel performansı artıran çeşitli düzenlemeler içerir. Bu nedenle “düzenli artırma” tekniği olarak da bilinir.

XGBoost’un diğer tekniklerden nispeten nasıl daha iyi olduğunu görelim:

Düzenlileştirme (Regularization):
Standart GBM uygulamasının XGBoost gibi bir düzenlemesi yoktur.
Bu nedenle, XGBoost ayrıca aşırı takılmayı azaltmaya da yardımcı olur.

Paralel İşleme (Parallel Processing):
XGBoost paralel işleme uygular ve GBM’den daha hızlıdır.

Yüksek Esneklik (High Flexibility):
XGBoost, kullanıcıların modele yepyeni bir boyut katan özel optimizasyon hedefleri ve değerlendirme kriterleri tanımlamasını sağlar.

Eksik Değerlerin Kullanılması (Handling Missing Values):
XGBoost, eksik değerleri işlemek için yerleşik bir rutine sahiptir.

Ağaç Budaması (Tree Pruning):
XGBoost, belirtilen max_depth değerine kadar bölmeleri oluşturur ve ardından ağacı geriye doğru budamaya başlar ve ötesinde pozitif kazanç olmayan bölmeleri kaldırır.

max_depth = Maksimum derinliği tanımlamak için kullanılır.
Daha yüksek derinlik, modelin belirli bir örneğe özel olan ilişkileri öğrenmesini sağlayacaktır.

Dahili Çapraz Doğrulama (Built-in Cross-Validation):
XGBoost, bir kullanıcının, yükseltme işleminin her bir yinelemesinde bir çapraz doğrulama yapmasına izin verir ve böylece tek bir işlemde tam olarak optimum sayıda yükseltme iterasyonu elde etmek kolaydır.

  • XGBoost, eksik değerlerin kendisiyle ilgilendiği için, eksik değerleri doldurmanız gerekmez. En başta uyguladığımız fillna komutunu atlayabilirsiniz.
import xgboost as xgb
model=xgb.XGBClassifier(random_state=1,learning_rate=0.01)
model.fit(x_train, y_train)
model.score(x_test,y_test)

Regresyon problemi için örnek kod:

import xgboost as xgb
model=xgb.XGBRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)

Neler öğrendik?

Bu yazımızda;

  • Neden böyle bir öğrenme kullandığımızı
  • Algoritmaların çalışma mantıklarını
  • Bu algoritmaların makine öğrenmesi algoritmalarında nasıl uygulandığını

öğrenmiş olduk.

Bu yazı umarım sizin bu konuyu güzel bir şekilde anlamanızı sağlayacaktır. Herhangi bir öneriniz veya sorunuz varsa, aşağıdaki yorum bölümünde paylaşabilirsiniz. Ayrıca, bu algoritmaları mutlaka kendinizin de denemesini tavsiye ediyorum.

Herkese iyi çalışmalar, sağlıcakla kalın.

--

--