Makine Öğrenimi Felsefesi — 3

Volkan Yurtseven
5 min readOct 24, 2020

Öğrenmenin Püf Noktası

3.yazıdayız, hala kod yok, kodlar nerde?

Ben konuları anlatırken temeli derin kazmayı tercih ediyorum. O yüzden 2 belki 3 gönderide daha kod görmeyeceksiniz. Aksi halde kod yazarken bazı şeyler havada kalabiliyor. Bununla birlikte sadece teorik bilgi de birşey ifade etmeyebiliyor, bunun da farkındayım, ama yine de aklınızda bazı bilgi kırıntıları kalacağından da eminim. O yüzden buradaki bilgilere kodlama konusunda deneyim kazandıktan sonra tekrar gelip bakılmasında fayda var.

Cross-Validation(CV)

Özet

Bir önceki gönderimde belirttiğim gibi, modelimizin overfit edip etmediğini anlama yollarında biri de cross validation(cv) uygulamaktır. Buradaki amaç özetle şudur: Eğitim setini farklı kombinasyonlarla pure eğitim ve validasyon(aslında bu da bir nevi test setidir) setlerine ayırıp, her biri için test etmektir. Yani, tek bir eğitim seti verip şansa yüksek accuracy bulabiliriz diye, işi şansa bırakmamak adına farklı görünümlerdeki eğitim setleriyle eğitip yine farklı içerikteki test setlerle kontrol etmektir.

Detaylar

Küçük veri setimiz varsa, verimizin bir kısmını teste ayırmak eğitim için daha da az verimizin kalmasına sebep olur. Mesela 100 adet verimiz var, 80'i eğitim 20'sini test olarak ayırdık. 80'lik set eğitim için yeterli olmadığı gibi daha kötüsü 20'lik set de test için yeterli değil, şans eseri herhangi bir sonucu alabiliriz. Hele hele multiclass bir problemimiz varsa durum daha da kötüdür. Mesela 10 classlı bir veri setimiz varsa, class başına 2 adet test verisi var demektir. Buradaki çözüm önerisi, aynı set üzerinden modeli birkaç kez eğitmek ve bunları değerlendirmektir. İşte böyle az datamızın olduğu bir durumda overfitting olup olmadığını anlamak için eğitim setimizin de bir kısmını eğitmek, bir kısmını da test etmek için kullanırız.

En baştaki 100 birimlik seti 80–20 ayırmıştık. Şimdi 80'i de 64 ve 16 olarak ayıralım, ama bunu 8 farklı kombinasyonda yapalım(bu herhangi bir değer olabilir, genelde 5–10 arası seçilir, gridsearch sırasında 3 seçildiği de olur, bunları göreceğiz)

Bu arada biz burada sadece k-fold cv göreceğiz, ancak başka cv yöntemleri de var, aklınızda bulunsun, ileride bunları da araştırabilirsiniz. (NOT: Aslında train/test split ayrımı bile cross validation olarak geçmekte, ancak biz cross validation diye bahsettiğimizde genel olarak k-fold’u kastetmiş olacağız)

K-fold cv özetle aşağıdaki gibidir. Her iterasyonda eğitim verisinin 8’de biri tutulur(validation set), kalanı(training set) eğitilir, sonra bu validation set ile de test edilir. Gerçek test seti(yeşil) ise son ana kadar hiç kullanılmaz.

Bu cv süreci sonucunda accuracy oranları sırayla 92, 91.5, 92.4, 89.2, 91.3, 90.5, 91,6 ve 91.8 ise oldukça tutarlı ve sağlam bir modelimiz olduğuna, tüm eğitim seti üzerinde çalıştırırsak da benzer bir orana sahip olacağımız konusunda emin olabiliriz. Accuracy oranını ilerde göreceğiz ama şimdilik özetle modelimizin başarısını ölçen bir metrik olarak düşünebilirsiniz.

Ancak iterasyonlardan biri 44 gibi bir accuracy’e sahipse veya birbiriyle alakasız oranlar varsa modelimizde sorun var demektir. Model tam öğrenemiyordur veya verimiz çok karmaşıktır, bizim de modelimizdeki kompleksliği artırmamız gerekmektedir. Bu noktada gerçek test seti(yeşil) üzerinde denemeye geçmeyiz bile. Yapacağımız şey, modelimizi düzeltmek olmalıdır. Nasıl düzelteceğimize biraz aşağıda bakacağız.

Aklınıza şöyle bir soru gelmiş olabilir: Eğitim işleminden sonra zaten test setine bakıyorsak, cross validationa ne gerek var?

Cevap: Öncelikle, az önce belirttiğim gibi aslında train-test split işlemi de bir cross-validation işlemidir. Ancak veri seti az ise test setimiz yeterince temsil kabiliyetine sahip olmayabilir ve tesadüfen yüksek accuracy üretebilir. Veri seti oldukça büyük ve yeterliyse, gereksiz yere sistemi yormaya gerek yoktur, o zaman cv yapmayabilirsiniz.

Bu arada çok gariptir, birçok yerde cv’ı overfittinge çözüm olarak sunarlar. Aslında cv sadece durumun tespitini yapıyor, herhangi bir çözüm getirmiyor. Çözüm aksiyonları daha farklıdır, bunları az sonra göreceğiz.

NOT: Veri setini train/test diye ayırmanın da kendi içinde farklı yöntemleri var, biz burada random ayırma işlemi yaptığımızı varsaydık. Diğer yöntemler için şu gönderime bakabilirsiniz.

Cross validation için sklearn implementasyonları için de buraya bakabilirsiniz.

Final model

Şu sayfada diyor ki, “İster test/train ister k-fold cv yapın, model değerlendirme sonucundan memnun olduğunuz noktada ilgili modeli aynı parametrelerle tüm veri seti için tekrar çalıştırmalısınız”. Tümden kastı gerçekten tüm, yani train/test yaptıysan train+test, cv yaptıysan train+cv+test. Çeşitli sorulara da cevaplar verilmiş; “performansı aynı olur mu?”, “Bu son model test edilmemiş olmaz mı” v.s diye. Blog sahibi bunlara da cevap vermiş. Okumanızı tavsiye ederim.

Benim görüşüm ise şu: Veri setinizin küçük olduğu durumlarda, k-fold yapıyorduk ya, bu örnekte bu öneri mantıklı. Ancak veri seti zaten yeterliyse ve train/testi yeterli gördüysem bence tüm veri setini eğitmeye gerek yok, hele ki çok büyük setim vardıysa ve undersample(göreceğiz) yaptıysam hiç gerek yok.

Unutmamak lazım ki, cv’nin amacı final modeli elde etmek değil, modelin kendisini test etmektedir.

Konuyla ilgili (ileride) şu sitelere de bakmanızı tavsiye ederim:

Overifting/Underfiitting aksiyonları

Overfitting

Bunda, gereksiz detaylar ezberleniyor, aşırı genelleme yapılıyordu. Bundan kurtulmak için;

  • Model complexity’si(karmaşıklığı) azaltılabilir
  • Feature sayısı azaltılabilir(PCA, Feature Selection)
  • Daha basit model seçilebilir(Ör:Polinomial Regressionda polinomial yerine linear, veya polinom seviyesi 4'ten 3'e indirilebilir)
  • Regularization eklenebilir(Sonraki postlarımda göreceğiz)
  • Mümkünse eğitim datasının miktarı artırılmalıdır. Ne kadar artırılacağı Learning Curve’de görülebilir.(bu kavramı da sonra göreceğiz). Veri adedini artırmak neden önemli, bunu (https://machinelearningmastery.com/impact-of-veri seti-size-on-deep-learning-model-skill-and-performance-estimates/) sayfasındaki örnekten görsel olarak takip edebilirsiniz. Veride gürültü olmasına rağmen, veri sayısı arttıkça model güzelleşiyor.
  • Verideki gürültü azaltılabilir (hatalı veriyi düzeltmek, outlierları çıkarmak)
  • Continous değerler baremler ayırılabilir, ama tabiki bu durumda bilgi kaybı olmuş olur. Performans ile overfitting arasında bir ödünleşme(trade-off) söz konusudur. Belki barem sayısını biraz yüksek tutmak iyi olabilir. Categorcial kolonlarda ise çok daha güvenle uygulanabilir.

Algoritma türüne göre de değişen öneriler olabilmektedir.

  • Linear modelse regularization eklenmeli. Yani gürültü içeren datayı 0’a doğru aşağı baskılamak.
  • Decision Tree modellerinde arama derinliği düşürülebilir.
  • SVM classificationda C değeri düşürülerek regularizasyon uygulanabilir

Soru. Overfitting varsa, feature selection/PCA yaparak feature sayısını mı azaltmak lazım yoksa regularization mı? Hangisi tercih edilmeli? Veya outlierları mı kaldırmaya çözerek başlanmalı?

Cevap: Lambda(Göreceğiz) düşükse regularizasyona gerek yok. Outlier tek başına yeterli olmayabilir, regularizasyon yine de gerekebiliyor. Çözümleri tek tek dahil etmek ve beklentiye uygun hale gelince ötesine geçmeye gerek yok.

Underfitting

Bunda ise öğrenme zorluğu var. Bizim bu zorlanmayı kolaylaştırmamız lazım. Bunun için;

  • Daha güçlü bir model seçilebilir
  • Feature sayısı artırılabilir(feature extraction veya yeni attribute ekleme)
  • Regularization hyperparametreleri düşürülebilir(Bunu da ileride göreceğiz)

Sonuç

Farkındayım, hala kod yok ve bu kadar teorik bilgi sizi sıkıyor olabilir, ama inanın bana faydasını göreceksiniz. Bir de çok sık “ilerde göreceğiz” dediğimi de fark etmişsinizdir. Bunları, hem konuları derli toplu bir arada tutmak adına burada belirtmem gerekiyor, ki ileride zaten buralara tekrar gelip bakacağınızı düşünüyorum, hem de terimlere aşina olmanızı sağlamak için.

NOT: Buradaki konuların detayına ve kod örneklerine serinin 6.gönderisinde giriyor olacağız.

Sonraki yazımda görüşmek üzere…

--

--

Volkan Yurtseven

Once self-taught-Data Science Enthusiast,now graduate one