Cross-Validation nedir ? Neden ihtiyaç duyarız ? Nasıl kullanırız ?

Berkedilekoglu
5 min readJun 13, 2021
Photo by Ryoji Iwata on Unsplash

Merhabalar, bu yazıda Cross-Validation’a neden ihtiyaç duyduğumuzu, Cross-Validation yöntemlerinden biri olan K-Fold Cross Validation’ın çalışma prensiplerini ve nasıl kullanıp/yorumlamamız gerektiğini anlatacağım. Cross-Validation’ı anlayabilmek için öncelikle test ve validation datalarının ne için kullanıldıklarını ve farklarını öğrenmemiz gerekiyor.

  1. Test Data’sı Nedir ? Ne için Kullanılır ?

Basitçe ifade etmek gerekirse, makine öğrenmesi, belli bir data üzerinde eğitilen modelin, o datadan öğrendikleriyle tahminler yapmasıdır. Peki modelin yaptığı tahminlerin ne denli doğru olduğunu veya kısaca bu modelin nasıl bir başarıyla çalıştığını nereden anlayabiliriz ?

İşte tam bu noktada modelin eğitimi sırasında asla kullanılmamış olan data örneklerine ihtiyacımız var. Bunu daha iyi anlamak için geçen senenin çıkmış sorularıyla hazırlandığınız bir sınavı düşünebilirsiniz. Burada siz makine öğrenmesi modeli, çıkmış sorular eğitim datanız ve sınav da test datanız oluyor. Eğer hocanız sınavda çıkmış soruları sorarsa zaten onlara çalıştığınız için bu soruları doğru yapacaksınız ve yüksek başarıyla sınavdan geçip konuyu bildiğiniz düşünülecek. Ancak hocanız sınavda başka sorular sorarsa bu konuyla ilgili neler öğrendiğinizi, çalıştıklarınızdan genellemeler yapıp yapamadığınızı ölçebilir. İşte bu sebeple test datası dediğimiz bu örneklerin tek bir tanesi bile model tarafından modelin başarısını ölçme kısmına gelene kadar hiç görülmemiş olmalı.

Peki test datası nasıl elde ediliyor ?

Data Split

Kurslarda ya da internette bulacağınız makine öğrenmesi problemlerinde çoğunlukla data, training(eğitim) ve test datası olmak üzere bölünerek size sunulur. Burada size sunulan datalar daha önceden toplanan ve modelin eğitilmesinin düşünüldüğü tek bir datanın bölünmesiyle elde edilen datalardır. Bazen katıldığınız yarışmalarda bu test datalarının labelları silinerek bunlar üzerinde yapacağınız tahminler sizden istenir ve o sonuçlara göre sıralamaya girersiniz. Çünkü yukarıda da belirttiğim gibi datanın belli bir bölümünün eğitim sürecinde hiç görülmemesi gerekir. Bu görülmeyen data sizin başarınızı ölçmek için kullanılır.

2. Validation Data’sı Nedir ? Ne İçin Kullanılır ?

Makine Öğrenmesi ve Derin Öğrenme konularında yukarıda da bahsettiğim, kesinlikle uyulması gereken altın bir kural vardır: Test Datası ve Training Datasını Asla Birleştirme! Bir başka değişle, test datasına modelinizin başarısını ölçene kadar hiç dokunmayın.

O zaman modelimizle alakalı ayarlamaları, iyileştirmeleri nasıl yapacağız ? Modelinizdeki parametreleri ayarlamak için bir yandan modelinizin başarısını ölçmeniz gerekir ki bu da modeli test etmeyi gerektirir. İşte tam da bu amaçla elimizdeki eğitim datamızı random bir şekilde bölerek bu özel kısım için kendi test datamızı oluşturabiliriz. Bu dataya Validation Data’sı adı verilir. İşlevi basitçe modelimizi test datasını kullanmadan test etmektir.

Buradaki önemli nokta validation datasının modelimizin test edilmesi için kullanılan bir data oluşu. Bazen validation datasının sadece model ayarlamaları için gerekli bir data olduğu düşünülür, ancak esas nokta modelin hiç görmediği bir data üzerinde (Test Datası) nasıl bir başarı göstereceğinin hesaplanabilmesini sağlamasıdır.

3. Değişken Model Başarısı

Elimizde bir problem olduğunu düşünelim ve eğittiğimiz modelin başarısını raporlamamız gerekiyor. Basitçe elimizdeki datayı Train ve Test datası olarak bölüp eğitimimizi yapıp test datamız üzerinde test edebilir ve başarı yüzdemizi raporlayabiliriz. Peki bu başarı yüzdesi gerçekten tutarlı mı ? Burada datamızı nasıl böldüğümüzü hatırlamamız gerekiyor. Elimizde bulunan bir sürü örneği random olarak bölüp bir kısmında modelimizi test ettik. Peki ya başka bir bölümünün üzerinde test etmiş olsaydık ne olurdu ? Şunu unutmamalıyız: random gerçekleşen olaylarda her şey mümkündür.

Aldığımız test datası modelin çok kolay şekilde tahminler yürüteceği örneklerden oluşuyor olabilir. Böyle bir durumda başarı yüzdemiz yüksek değerler çıkacaktır. Ancak test datamız tam aksine tahmin etmesi çok zor örneklerden de oluşabilir ve bu durum model başarımızı düşürebilir.

Kodda datayı bölerken kullandığımız random_state değeri kısaca datanın hangi bölümünü test datası olarak seçtiğimize etki ediyor. Bu örnekten de net bir şekilde görüleceği gibi datanın farklı kısımlarını seçmek bize farklı başarı sonuçları verebiliyor. Peki bu durumu önlemek için ne yapabiliriz ? Modelimizin başarısını nasıl ölçersek gerçekten de hiç görmediği örnekler üzerinde nasıl çalışacağı hakkında bize doğru bir fikir verebilir ?

4. Cross-Validation

5-Fold Cross-Validation

Öncelikle altın kuralımıza uymamız gerekiyor. Test datamızı bir kenara ayırıp yolumuza eğitim datamızla devam ediyoruz. Eğer elimizdeki eğitim datamızla modelimizin nasıl çalışacağını görmek istiyorsak bu noktada validation datasına ihtiyacımız olacak. Ancak yukarıdaki kod örneğinde de gördüğümüz gibi datamızı random olarak bölersek, validation datamız üzerindeki tahminlerimiz bizi yanıltacaktır.

Peki ya datamızı eşit parçalara bölersek ve her bir parçayı bir kez validation datası olarak kullanırsak ne olur ? Böylece datanın farklı kısımlarını modelimizi test etmek için kullanabiliriz. Yukarıdaki resimde datamız 5'e bölünmüş ama 3, 5 ve 10'a bölme yöntemleri de genellikle kullanılan yöntemler arasındadır. Bunu datamızın büyüklüğüne göre belirlemeliyiz. Küçük bir datamız varsa 10-fold Cross-Validation kullanmak datamızı 10'a böleceği için validation kısmını çok küçültecektir ve sağlıklı bir ölçüm yapmamızı engelleyecektir.

Özetle K-Fold Cross Validation, elimizdeki datayı K’ya bölmemize ve modelimizi K kere eğitmemize yarar. Böylece modeli datanın farklı kısımlarında test etme şansı buluruz. Elimizde bulunan sınırlı datayı en efektif biçimde kullanıp, K kere hiç görmediğimiz datalar ile test edebiliriz. Bunun sonucunda elde ettiğimiz başarı oranlarının ortalamasını alıp, standart sapmayı da kullanarak modelimizin ileride tahminler yapacağı datalar üzerindeki başarısını belli bir aralıkta gösterebiliriz.

5. CV Sonuç Değerlendirmesi

Bir önceki kod örneğinde datamızı bölerken random_state değerini değiştirdiğimizde test datamız üzerindeki ölçümlerin sağlıksız olduğunu görmüştük. Şimdi test datamızı bir kenara koyarak 5-Fold CV ile modelimizi değerlendirmeye çalışacağız.

Örnekte de gördüğünüz gibi test datamızı ayırdıktan sonra eğitim datamız üzerinde 5-fold cv uyguladığımızda toplamda 5 farklı accuracy değeri alıyoruz. Bunlar her fold için modelimizin başarı yüzdeleri. Net bir şekilde görüyoruz ki farklı foldlar bize farklı başarı yüzdeleri veriyor. Çünkü her fold datanın farklı bir bölümünü test ediyor.

Eğer modelimizin hiç görmediğimiz bir data üzerindeki başarısını öngörmek istiyorsak yapabileceğimiz en iyi şeylerden biri cross-validation sonuçlarımızın ortalamasını almak olacaktır. Ayrıca bu değerler arasındaki standart sapmayı hesaplarsak modelimizin başarısının hangi aralıkta olacağını tahmin edebiliriz.

Örneğimizde bulduğumuz başarı yüzdelerinin ortalaması %78 ve standart sapmamız %7. Standart sapmayı da işin içine katarsak modelimizin başarısının 0.71–0.85 arasında olacağını öngörebiliriz. Modelimizi tekrar eğitip test datamızda başarısını ölçtüğümüzde %83 oranında başarı olduğunu ve doğru bir tahminde bulunduğumuzu görebiliriz.

Ancak bu örnekte dikkat etmemiz gereken bir yer var. Random_state değerini 50 yaptığımızda test datamız üzerinde 0.86 değerini almıştık. Kullandığımız dataset küçük bir dataset olduğu için yaptığımız hesaplamalar çok da tutarlı olmayabilir. Bunu her zaman göz önüne almakta fayda vardır. Çünkü gerçek hayatta eğittiğiniz model insanların canını kurtarabilecek bir modelse yaptığımız %1'lik hata hiç istenmeyecek bir hata olacaktır. Bu sebeple ne kadar çok data o kadar iyi modeller ve o kadar tutarlı sonuçlar anlamına gelir.

Sonuç

Makine öğrenmesi alanında en dikkat edilmesi gereken husus modelinizin başarısını doğru bir biçimde ölçmektir. Geleceğe yönelik tahmin yapan bir mekanizmayı değerlendirmek de hassas ve dikkatli ölçümler gerektirir. Bu sebeple datayı seçerken oluşabilecek ihtimalleri en aza indirmek için K-Fold Cross-Validation yöntemi kullanılabilir.

Elde ettiğimiz sonuçların ortalaması sunulabilecek tutarlı sonuçlardan biridir. Daha detaylı bir bilgi vermek istersek standart sapmayı da kullanarak modelimizin başarı kıstasını belirtebiliriz.

Yazıyı okuduğunuz için çok teşekkürler, umarım kafanızda bazı kavramların oturmasına yardım edebilmişimdir. Benimle LinkedIn üzerinden iletişime geçebilirsiniz.

--

--

Berkedilekoglu

NLP Research Engineer, Teaching Assistant, Research Assistant in Bioinformatics