MAKİNE ÖĞRENMESİ PROBLEMLERİNDE VERİ KULLANIMI

Bu yazıyı okuduğunuza göre hepiniz bir makine öğrenmesi sistemi tasarlamaya çalışmışsınızdır veya en azından bir "tutorial" vasıtası ile bu tip bir problemin nasıl çözüldüğünü incelemişsinizdir. Bu yazımızda bu tasarım sürecinin belki de en önemli unsuru olan veri kullanımına giriş yapacağız.

"Response variables" ve "Predictors" kavramları

Makine öğrenmesi algoritmalarını incelediğimiz zaman büyük çoğunluğunun optimizasyon tabanlı algoritmalar olduğunu görürüz. Bu problemlerin özünde bir fonksiyon oluşturmaya çalışırız. Bu fonksiyon "response variable" (tepki değişkeni) ile "predictors" (tahmin ediciler) arasında bir bağlantı kurar.

"Predictor" ve "response variable" kavramlarını biraz daha açıklayabilmek için örnekler verelim.

  • Ürünün satışlarının (response variable) radyo, televizyon ve gazete reklamlarına (predictors) bağlı olarak artışı
  • Bir kişinin gelirinin (response variable) eğitim seviyesine (predictor) bağlı olarak nasıl arttığı
  • Ev fiyatlarının (response variable) evin özelliklerine bağlı olarak (predictor) nasıl arttığı

Makine öğrenmesinin tek bir fonksiyon olarak ifade edilmesi

"Predictor"lar ve "response variable"lar arasında aşağıdaki gibi bir genelleme kurabiliriz.

$Y$ "response variable" ve $X = [X_1, X_2, ..., X_p]$ "predictor"larımız olsun. Rasgele hataları da temsil edebilmesi adına denklemin sağ tarafına $\epsilon$ terimini de ekleyelim.

$$Y=f(X)+\epsilon$$

Bu fonksiyonu sınıflandırıcı olarak adlandırmak pek yanlış olmaz.

Peki bu sınıflandırıcıyı elimizdeki veriyi temsil eder hale nasıl getiririz? Bunun için genellikle elimizde bir "maliyet fonksiyonu" (cost function) vardır.

Bu maliyet fonksiyonunu, çeşitli nümerik optimizasyon metotlarını kullanarak elimizdeki veri setine göre minimize etmeye, tüm veri setine göre hatanın en düşük olduğu yeri bulmaya çalışırız. Bu aşamayı sınıflandırıcının eğitimi olarak tanımlayabiiriz.

\Konu ile ilgili daha ayrıntılı bilgi için An Introduction to Statistical Learning kitabına bakmanızı tavsiye ederim.*

Tabi gerçek yaşam problemlerinde en düşük hatayı veren fonksiyon her zaman en iyi fonksiyon olmayabilir. Ortaya çıkaracağımız sınıflandırıcının performansını ölçebilmek için genellikle veri setini "akıllı" bir şekilde parçalamak önerilir.

Eğitim Seti, Test Seti ve Validasyon Seti

İyi bir makine öğrenmesi modeli hazırlamak istiyorsak aşağıdaki noktalara çok dikkat etmek gerekir:

  • Modelin parametrelerini düzgün bir şekilde ayarlamak (hyper parameter tuning)
  • Modelin hiç görmediği veriler üzerinde iyi bir performans sergilemesini sağlamak

Bu temel uyarıları göz önünde bulundurduğumuzda en iyi stratejinin veri setini bölmek olduğu ortaya çıkmaktadır. Veri setinin bölümleri genellikle aşağıdaki şekilde tanımlanır.

  • Eğitim Seti (Train Set): Makine öğrenmesi algoritmasını eğitmek için kullandığımız set olarak tanımlanabilir.
  • Validasyon Seti (Validation Set): Bu seti makine öğrenmesi algoritmasının parametrelerini ayarlamak, özniteliklerini seçmek, özetle algoritma hakkında vereceğimiz kararlar hakkında kullanabiliriz. Bu sete bazı kaynaklar yakın zamanda geliştirme seti (development set) de demeye başladılar.
  • Test Seti (Test Set): Bu set, makine öğrenmesi modelimizin performansının ölçüleceği settir. Bu sete algoritmanın eğitimi ve parametrelerinin ayarlanması sırasında hiçbir şekilde dokunmamak gerekir.

Test seti ve validasyon seti ile ilgili olarak Andrew N.G.'nin çok güzel bir görüşü mevcut. Kendisi diyor ki: "Test ve validasyon setini gelecekte sistemin maruz kalması muhtemel verileri kullanarak oluşturun". Yani bu setleri hazırlarken biraz dikkatli davranmak gerekiyor.

Eğer ticari olarak faaliyet gösterecek bir makine öğrenmesi sistemi tasarlıyorsanız sistemin kullanacağı olası gerçek verileri de bu setlerin içine dahil etmekte fayda var. Bir başka deyişle bu setleri rasgele bölerek hazırlamak her zaman için en iyi strateji olmayabilir, biraz işin içine veri mühendisliğini de katmanız gerekebilir.


Bazı problemlerde sadece eğitim ve test seti olarak ayrım yapıldığına rastlamanız mümkündür. Bu metota dışarıda bırakma "hold-out" metodu denilmektedir. Metot oldukça basittir, modelin eğitimi için eğitim seti kullanılır, modelin performansı test seti üzerinde ölçülür. Fakat bu yöntem model parametrelerinin ayarlanması aşamasında sıkıntı yaratabilir. Yani model parametrelerini istemeden de olsa test setini iyileştirecek şekilde ayarlamaya başlayabiliriz. Bu sebeple daha gürbüz olan "k-fold cross validation" metodu önerilmektedir.

"k-fold cross validation" (k-katmanlı çapraz validasyon)

Yukarıda bahsettiğimiz setleri ilk önce bir şekil haline getirelim.

k-fold

Şekilde aslında anlatılmak istenen şu:

  • Elimizde bir veri seti mevcut.
  • Biz bu veri setinin bir kısmını test seti olarak ayırıyoruz ve buna en son değerlendirme aşamasına kadar hiç bakmıyoruz.
  • Geriye kalan kısmı k sayısı kadar eşit parçaya bölüyoruz. (Şekilde k=4 olarak alınmıştır.)
    • Bu parçaladığımız k parçanın her seferinde 1 parçasını dışarıda bırakıyoruz (validasyon seti) ve kalan k-1 parça (test seti) ile modelimizi eğitiriyoruz.
    • Dışarda bıraktığımız parça (validasyon seti) ile eğittimiz modelin performansını değerlendiriyoruz.
    • Her adımda oluşturduğumuz performans değerlerinin ortalamasını alarak yeni bir hata değeri oluşturuyoruz.
  • Eğer sonuçtan memnun değilsek hiper-parametreleri yani makine öğrenmesi algoritmasının parametrelerini değiştirerek bu işlemi tekrar ediyoruz.
  • k-fold sonucundan memnun olduğumuzda test setinde nihai modelimizin performansını ölçüyoruz ve bu bize modelin genelleştirmesi ile ilgili bir metrik vermiş oluyor.

Çok küçük veri setlerinde k saysını arttırmak daha iyi sonuçlar elde etmemize fayda sağlayabilir. Bunun en uç örneği "leave one out cross validation" metodudur. Bu metotta k-fold validasyon sırasında her seferde bir örnek dışarıda bırakılarak işlem tekrarlanır.

Neden bu kadar zahmete girip veriyi "parça pinçik" ediyoruz?

Gerçekten çok yerinde bir soru, ben de çoğu zaman sorgulamıyor değilim bu konuyu :) Gerekçelerini aşağıya yazayım belki sizi ikna ederim:

  • Hazırladığımız sınıflandırıcının / modelin genelleştirme performansı hakkında güvenilir bir tahmin elde edebilmek
    • Genelleştirme bir sınıflandırıcının daha önce görmediği veriler üzerinde iyi bir performans sergilemesi olarak tanımlanmaktadır.
    • Binbir zorlukla hazırladığımız modelimizin gerçek yaşam problemleri karşısında çuvallamasını istemeyiz
  • Modelin hiper-parametrelerini ayarlayabilmek
  • Eğitim sırasında modeli birden fazla kez eğiterek modeldeki varyansı azaltmak
  • Modeli ve parametrelerini değerlendirebilmek için sistematik bir yöntem kullanmak

Buraya kadar okuduğunuz için çok teşekkür ederim, şimdilik noktayı koyalım. Ama veri kullanımı konusu devam edecek haberiniz olsun :)