Topluluk Yöntemleri: Gelişmiş Makine Öğrenimi Sonuçları Üretmek için Zarif Teknikler
Yayınlanan: 2022-03-11Topluluk yöntemleri, birden çok model oluşturan ve daha sonra bunları iyileştirilmiş sonuçlar üretmek için birleştiren tekniklerdir. Topluluk yöntemleri genellikle tek bir modelden daha doğru çözümler üretir. Kazanan çözümlerin topluluk yöntemlerini kullandığı bir dizi makine öğrenimi yarışmasında durum böyle olmuştur. Popüler Netflix Yarışmasında kazanan, güçlü bir ortak filtreleme algoritması uygulamak için bir topluluk yöntemi kullandı. Diğer bir örnek ise kazananın topluluk yöntemlerini de kullandığı KDD 2009'dur. Kaggle yarışmalarında bu yöntemleri kullanan kazananları da bulabilirsiniz, örneğin burada CrowdFlower yarışmasının kazananı ile röportaj.
Bu makaleye devam etmeden önce birkaç terminolojiyi anlamamız önemlidir. Makale boyunca, verilerle eğitilen algoritmanın çıktısını tanımlamak için “model” terimini kullandım. Bu model daha sonra tahmin yapmak için kullanılır. Bu algoritma, lojistik regresyon, karar ağacı vb. herhangi bir makine öğrenme algoritması olabilir. Bu modeller, topluluk yöntemlerinin girdileri olarak kullanıldığında “temel modeller” olarak adlandırılır.
Bu blog yazısında, sınıflandırma için topluluk yöntemlerini ele alacağım ve yaygın olarak bilinen bazı topluluk yöntemlerini açıklayacağım: oylama, istifleme, torbalama ve artırma.
Oylama ve Ortalamaya Dayalı Ensemble Yöntemleri
Oylama ve ortalama alma, en kolay topluluk yöntemlerinden ikisidir. Hem anlaşılması hem de uygulanması kolaydır. Sınıflandırma için oylama, regresyon için ortalama alma kullanılır.
Her iki yöntemde de ilk adım, bazı eğitim veri setlerini kullanarak çoklu sınıflandırma/regresyon modelleri oluşturmaktır. Her bir temel model, aynı eğitim veri kümesinin ve aynı algoritmanın farklı bölümleri kullanılarak veya aynı veri kümesini farklı algoritmalarla veya başka herhangi bir yöntemle kullanarak oluşturulabilir. Aşağıdaki Python benzeri sözde kod, aynı eğitim veri kümesinin farklı algoritmalarla kullanımını gösterir.
train = load_csv("train.csv") target = train["target"] train = train.drop("target") test = load_csv("test.csv") algorithms = [logistic_regression, decision_tree_classification, ...] #for classification algorithms = [linear_regression, decision_tree_regressor, ...] #for regression predictions = matrix(row_length=len(target), column_length=len(algorithms)) for i,algorithm in enumerate(algorithms): predictions[,i] = algorithm.fit(train, target).predict(test)Yukarıdaki sözde koda göre, her model için tahminler oluşturduk ve bunları, her sütunun bir modelden tahminleri içerdiği tahminler adı verilen bir matrise kaydettik.
Çoğunluk Oyu
Her model, her test örneği için bir tahmin (oy) yapar ve nihai çıktı tahmini, oyların yarısından fazlasını alan tahmindir. Tahminlerin hiçbiri oyların yarısından fazlasını alamazsa, topluluk yönteminin bu örnek için istikrarlı bir tahmin yapamayacağını söyleyebiliriz. Bu yaygın olarak kullanılan bir teknik olmasına rağmen, en çok oy alan tahmini (oyların yarısından az olsa bile) nihai tahmin olarak deneyebilirsiniz. Bazı makalelerde bu yöntemin “çoğulcu oylama” olarak adlandırıldığını görebilirsiniz.
Ağırlıklı Oylama
Her modelin aynı haklara sahip olduğu çoğunluk oylamasından farklı olarak, bir veya daha fazla modelin önemini artırabiliriz. Ağırlıklı oylamada, daha iyi modellerin tahminini birden çok kez sayarsınız. Makul bir ağırlık seti bulmak size kalmış.
Basit Ortalama
Basit ortalama alma yönteminde, test veri kümesinin her bir örneği için ortalama tahminler hesaplanır. Bu yöntem genellikle fazla uyumu azaltır ve daha düzgün bir regresyon modeli oluşturur. Aşağıdaki sözde kod kodu, bu basit ortalama alma yöntemini gösterir:
final_predictions = [] for row_number in len(predictions): final_predictions.append( mean(prediction[row_number, ]) )Ağırlıklı Ortalama
Ağırlıklı ortalama, her modelin tahmininin ağırlıkla çarpıldığı ve ardından ortalamalarının hesaplandığı basit ortalamanın biraz değiştirilmiş bir versiyonudur. Aşağıdaki sözde kod kodu, ağırlıklı ortalamayı gösterir:
weights = [..., ..., ...] #length is equal to len(algorithms) final_predictions = [] for row_number in len(predictions): final_predictions.append( mean(prediction[row_number, ]*weights) )Birden Çok Makine Öğrenimi Modelini Yığınlama
Yığınlanmış genelleme olarak da bilinen yığınlama, modellerin başka bir makine öğrenimi algoritması kullanılarak birleştirildiği bir topluluk yöntemidir. Temel fikir, makine öğrenmesi algoritmalarını eğitim veri seti ile eğitmek ve ardından bu modellerle yeni bir veri seti oluşturmaktır. Daha sonra bu yeni veri seti, birleştirici makine öğrenme algoritması için girdi olarak kullanılır.
Bir yığınlama prosedürünün sözde kodu aşağıdaki gibi özetlenir:
base_algorithms = [logistic_regression, decision_tree_classification, ...] #for classification stacking_train_dataset = matrix(row_length=len(target), column_length=len(algorithms)) stacking_test_dataset = matrix(row_length=len(test), column_length=len(algorithms)) for i,base_algorithm in enumerate(base_algorithms): stacking_train_dataset[,i] = base_algorithm.fit(train, target).predict(train) stacking_test_dataset[,i] = base_algorithm.predict(test) final_predictions = combiner_algorithm.fit(stacking_train_dataset, target).predict(stacking_test_dataset)Yukarıdaki sözde kodda görebileceğiniz gibi, birleştirici algoritma için eğitim veri seti, temel algoritmaların çıktıları kullanılarak oluşturulur. Sözde kodda, eğitim veri kümesi kullanılarak temel algoritma oluşturulur ve daha sonra tahmin yapmak için aynı veri kümesi tekrar kullanılır. Ancak bildiğimiz gibi, gerçek dünyada tahmin için aynı eğitim veri setini kullanmıyoruz, bu nedenle bu sorunun üstesinden gelmek için eğitim veri setinin bölündüğü bazı yığınlama uygulamaları görebilirsiniz. Aşağıda, temel algoritmaları eğitmeden önce eğitim veri kümesinin bölündüğü bir sözde kod görebilirsiniz:

base_algorithms = [logistic_regression, decision_tree_classification, ...] #for classification stacking_train_dataset = matrix(row_length=len(target), column_length=len(algorithms)) stacking_test_dataset = matrix(row_length=len(test), column_length=len(algorithms)) for i,base_algorithm in enumerate(base_algorithms): for trainix, testix in split(train, k=10): #you may use sklearn.cross_validation.KFold of sklearn library stacking_train_dataset[testcv,i] = base_algorithm.fit(train[trainix], target[trainix]).predict(train[testix]) stacking_test_dataset[,i] = base_algorithm.fit(train).predict(test) final_predictions = combiner_algorithm.fit(stacking_train_dataset, target).predict(stacking_test_dataset)Önyükleme Toplama
“Bagging” olarak da bilinen Bootstrap Aggregating adı, bu stratejinin temel unsurlarını özetler. Torbalama algoritmasında ilk adım, birden fazla model oluşturmayı içerir. Bu modeller, orijinal veri kümesinden rastgele seçilen veri kümesinin rastgele alt örnekleri ile aynı algoritma kullanılarak, önyükleme örnekleme yöntemi ile oluşturulur. Bootstrap örneklemede, bazı orijinal örnekler birden çok kez karşımıza çıkmakta ve bazı orijinal örnekler örnekte bulunmamaktadır. m elemanlı bir alt veri kümesi oluşturmak istiyorsanız, orijinal veri kümesinden m kez rastgele bir eleman seçmelisiniz. Ve eğer amaç n tane veri seti oluşturmaksa, bu adımı n defa takip edersiniz.
Sonunda, her veri kümesindeki eleman sayısının m olduğu n tane veri kümemiz var. Aşağıdaki Python-esque sözde kodu, önyükleme örneklemesini gösterir:
def bootstrap_sample(original_dataset, m): sub_dataset = [] for i in range(m): sub_dataset.append( random_one_element(original_dataset) ) return sub_datasetTorbalamadaki ikinci adım, üretilen modelleri bir araya getirmektir. Bu amaçla oylama ve ortalama alma gibi iyi bilinen yöntemler kullanılır.
Genel sözde kod şöyle görünür:
def bagging(n, m, base_algorithm, train_dataset, target, test_dataset): predictions = matrix(row_length=len(target), column_length=n) for i in range(n): sub_dataset = bootstrap_sample(train_dataset, m) predictions[,i] = base_algorithm.fit(original_dataset, target).predict(test_dataset) final_predictions = voting(predictions) # for classification final_predictions = averaging(predictions) # for regression return final_predictionsTorbalamada her bir alt numune birbirinden bağımsız olarak üretilebilir. Böylece üretim ve eğitim paralel olarak yapılabilir.
Torbalama stratejisinin uygulamasını bazı algoritmalarda da bulabilirsiniz. Örneğin Random Forest algoritması bazı farklılıklarla torbalama tekniğini kullanır. Rastgele Orman, rastgele özellik seçimi kullanır ve bunun temel algoritması bir karar ağacı algoritmasıdır.
Güçlendirme: Zayıf Modelleri Güçlü Modellere Dönüştürme
"Güçlendirme" terimi, zayıf modelleri güçlü modellere dönüştürebilen bir algoritma ailesini tanımlamak için kullanılır. Model, önemli bir hata oranına sahipse zayıftır, ancak performans rastgele değildir (ikili sınıflandırma için 0,5 hata oranıyla sonuçlanır). Artımlı olarak artırma, her modeli aynı veri kümesiyle eğiterek ancak örneklerin ağırlıklarının son tahminin hatasına göre ayarlandığı bir topluluk oluşturur. Ana fikir, modelleri zor olan durumlara odaklanmaya zorlamak. Torbalamadan farklı olarak boosting sıralı bir yöntemdir ve bu nedenle burada paralel işlemleri kullanamazsınız.
Yükseltme algoritmasının genel prosedürü aşağıdaki gibi tanımlanır:
def adjust_dataset(_train, errors): #create a new dataset by using the hardest instances ix = get_highest_errors_index(train) return concat(_train[ix], random_select(train)) models = [] _train = random_select(train) for i in range(n): #n rounds model = base_algorithm.fit(_train) predictions = model.predict(_train) models.append(model) errors = calculate_error(predictions) _train = adjust_dataset(_train, errors) final_predictions = combine(models, test)Adjust_dataset işlevi, daha sonra temel algoritmayı öğrenmeye zorlamak için kullanılabilecek en zor örnekleri içeren yeni bir veri kümesi döndürür.
Adaboost, boosting yöntemi olan yaygın olarak bilinen bir algoritmadır. Adaboost'un kurucuları, çalışmaları nedeniyle Gödel Ödülü'nü kazandı. Adaboost için temel algoritma olarak çoğunlukla karar ağacı algoritması tercih edilir ve sklearn kitaplığında Adaboost için varsayılan temel algoritma karar ağacıdır (AdaBoostRegressor ve AdaBoostClassifier). Önceki paragrafta tartıştığımız gibi, aynı artımlı yöntem Adaboost için de geçerlidir. AdaBoost algoritmasının her adımında, her eğitim örneğinin 'sertliği' hakkında toplanan bilgiler modele beslenir. 'Veri kümesini ayarlama' adımı yukarıda açıklanandan farklıdır ve 'modelleri birleştirme' adımı ağırlıklı oylama kullanılarak hesaplanır.
Çözüm
Ensemble yöntemleri, karmaşık algoritmalar geliştirerek ve yüksek doğrulukta sonuçlar üreterek makine öğrenimi yarışmalarını kazanmanıza yardımcı olsa da, yorumlanabilirliğin daha önemli olduğu endüstrilerde genellikle tercih edilmez. Bununla birlikte, bu yöntemlerin etkinliği yadsınamaz ve uygun uygulamalardaki faydaları muazzam olabilir. Sağlık gibi alanlarda, makine öğrenimi algoritmalarının doğruluğundaki en küçük iyileştirme bile gerçekten değerli bir şey olabilir.
- Makine Öğrenimi Teorisine Giriş ve Uygulamaları: Örneklerle Görsel Bir Eğitim
- Makineler ve Güven: Yapay Zeka Önyargısını Azaltma
