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.
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.
"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.
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.
İyi bir makine öğrenmesi modeli hazırlamak istiyorsak aşağıdaki noktalara çok dikkat etmek gerekir:
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.
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.
Yukarıda bahsettiğimiz setleri ilk önce bir şekil haline getirelim.
Şekilde aslında anlatılmak istenen şu:
Ç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.
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:
Buraya kadar okuduğunuz için çok teşekkür ederim, şimdilik noktayı koyalım. Ama veri kullanımı konusu devam edecek haberiniz olsun :)