Meme Kanseri Teşhisinde Makine Öğrenmesi: KNN ve SVM Algoritmalarının Karşılaştırmalı Analizi
Hücre çekirdeği ölçümlerinden yola çıkarak bir tümörün iyi huylu mu yoksa kötü huylu mu olduğunu tahmin eden, K-En Yakın Komşu (KNN) ve Destek Vektör Makineleri (SVM) algoritmalarını hiperparametre optimizasyonu ve detaylı performans karşılaştırmasıyla ele alan bir makine öğrenmesi projesi. Huawei Student Developers x Türkiye Yapay Zeka Akademisi Veri Bilimi ve Makine Öğrenmesi Bootcamp final projesi olarak geliştirilmiştir.

Meme Kanseri Teşhisinde Makine Öğrenmesi: KNN vs SVM
Meme kanseri, dünya genelinde kadınlarda en sık görülen kanser türlerinden biri ve erken teşhis, tedavi sürecinin başarısını doğrudan etkileyen en kritik faktörlerden biri. Bu yazıda, Huawei Student Developers ve Türkiye Yapay Zeka Akademisi iş birliğiyle yürütülen Veri Bilimi ve Makine Öğrenmesi Bootcamp'inin final projesi kapsamında geliştirdiğim bir makine öğrenmesi çalışmasını paylaşacağım.
Projenin amacı basit ama gerçek dünyada karşılığı olan bir soruyu cevaplamak: hücre çekirdeği ölçümlerinden yola çıkarak bir tümörün iyi huylu mu yoksa kötü huylu mu olduğunu tahmin edebilir miyiz?
Bu soruyu cevaplamak için iki farklı sınıflandırma algoritmasını — K-En Yakın Komşu (KNN) ve Destek Vektör Makineleri (SVM) — eğitip, hiperparametrelerini optimize edip, performanslarını çeşitli metriklerle karşılaştırdım.
Proje Amacı ve Problem Tanımı
Bu bir ikili sınıflandırma (binary classification) problemi. Elimizde, biyopsi sonucu elde edilmiş hücre çekirdeklerine ait 30 farklı sayısal ölçüm var ve her gözlem için bu tümörün iyi huylu (Benign) mu yoksa kötü huylu (Malignant) mu olduğu etiketlenmiş durumda.
Amacım sadece yüksek bir doğruluk skoru elde etmek değildi. Aynı zamanda farklı algoritma ailelerinin (mesafe tabanlı KNN vs margin tabanlı SVM) aynı problem üzerinde nasıl farklı davrandığını gözlemlemek, hiperparametre optimizasyonunun model performansına etkisini somut olarak görmek ve sağlık verisi gibi hassas bir alanda sadece accuracy değil precision/recall gibi metriklerin neden önemli olduğunu anlamak istedim.
Kullanılan Veri Seti
Bu projede Breast Cancer Wisconsin (Diagnostic) Dataset kullanıldı — 569 gözlem, 30 sayısal özellik. Her özellik, hücre çekirdeğinin bir karakteristiğini (yarıçap, doku, çevre, alan, pürüzsüzlük, kompaktlık, konkavlık, simetri, fraktal boyut) üç farklı istatistik üzerinden ifade ediyor: ortalama (mean), standart hata (se), ve en kötü/en büyük değer (worst).
Bu veri setini seçmemin birkaç nedeni vardı: Kaggle'da yüz binlerce kez indirilmiş, güvenilirliği kanıtlanmış bir veri seti olması, tamamen sayısal olması ve gerçek dünyada anlamlı bir problem çözmesi.
Veri Hazırlama ve Keşifsel Analiz
İlk adım her zaman veriyi tanımak. Kaggle'dan indirdiğim CSV dosyasını inceledikten sonra iki gereksiz sütun fark ettim: id (hasta kimlik numarası) ve Unnamed: 32 (tamamen boş bir sütun). Bu ikisini veri setinden çıkardım. Kalan 30 özellik sütununun hiçbirinde eksik değer yoktu — bu, veri temizleme adımlarını önemli ölçüde kısalttı.
Hedef değişken dağılımı: Sınıf dengesizliği, sınıflandırma problemlerinde göz ardı edilirse modelin yanıltıcı derecede yüksek accuracy göstermesine neden olabilir. İncelediğimde: 357 vaka iyi huylu (%62.7), 212 vaka kötü huylu (%37.3). Ciddi bir dengesizlik yoktu, bu yüzden ek bir dengeleme tekniğine ihtiyaç duymadım.

Korelasyon analizi: Özellikler arasındaki ilişkileri görmek için bir korelasyon matrisi oluşturdum. radius_mean, perimeter_mean ve area_mean gibi büyüklük odaklı özellikler birbiriyle neredeyse mükemmel korelasyon gösterdi (0.99'a kadar) — bu matematiksel olarak da mantıklı, çünkü yarıçap arttıkça çevre ve alan da doğal olarak artıyor. Buna karşılık texture_mean, diğer özelliklerle çok daha zayıf bir ilişki gösterdi — yani hücrenin dokusu, büyüklüğünden bağımsız bir bilgi taşıyor.

Sınıflara göre özellik dağılımları: Boxplot'larla, hangi özelliklerin iki sınıf arasında en belirgin farkı gösterdiğine baktım. radius_mean ve area_mean gibi özelliklerde, kötü huylu ve iyi huylu vakaların kutuları neredeyse hiç örtüşmüyordu — özellikle area_mean'de kötü huylu grubunun medyanı, iyi huylu grubunun medyanının yaklaşık iki katıydı. Buna karşılık texture_mean'de iki grubun dağılımı daha fazla örtüşüyordu.

Ölçeklendirme: KNN ve SVM, ikisi de mesafe/margin tabanlı algoritmalar olduğu için, StandardScaler kullanarak tüm özellikleri ortalaması 0, standart sapması 1 olacak şekilde standartlaştırdım. Veriyi ayrıca %80 eğitim (455 örnek) / %20 test (114 örnek) olarak, sınıf oranlarını koruyarak böldüm.
Model 1: K-En Yakın Komşu (KNN)
KNN'in mantığı oldukça sezgisel: yeni bir gözlem geldiğinde, ona en yakın K komşuya bakar ve bu komşuların çoğunluk oyuna göre sınıf tahmini yapar. En kritik hiperparametre K değeri — bu değeri bulmak için K=1'den K=30'a kadar her değeri 5-fold cross-validation ile test ettim. (KNN algoritmasının mantığını çok net anlatan bir video)

Bu analiz sonucunda en iyi K değeri 3 olarak bulundu (cross-validation accuracy: %96.9). K=1'de model çok "hassas" davranıp düşük başarı gösterirken, K arttıkça model daha "genelleyici" hale gelip performansı kademeli olarak düşüyordu.
Model 2: Destek Vektör Makineleri (SVM)
SVM ise farklı bir mantıkla çalışır: iki sınıfı birbirinden ayıran, aralarında mümkün olan en geniş boşluğu (margin) bırakan bir sınır bulmaya çalışır. Doğrusal olarak ayrılamayan veriler için kernel trick adı verilen bir teknikle veriyi daha yüksek boyutlu bir uzaya taşıyabilir. (SVM'in çalışma mantığını ve kernel trick kavramını anlatan bir video)
Bu hiperparametreleri (C, kernel, gamma) optimize etmek için GridSearchCV kullandım. Sonuç: en iyi parametreler C=1, kernel=rbf, gamma=scale (cross-validation accuracy: %97.6) olarak belirlendi. rbf kernel'in en iyi sonucu vermesi, sınıflar arasındaki sınırın tamamen doğrusal olmadığına işaret ediyor.
Model Sonuçları ve Karşılaştırma
Her iki modeli test seti üzerinde accuracy, precision, recall ve F1-score metrikleriyle değerlendirdim:
| Model | Accuracy | Precision | Recall | F1-Score | AUC |
|---|---|---|---|---|---|
| KNN (K=3) | %93.9 | %97.3 | %85.7 | 0.911 | 0.982 |
| SVM (rbf, C=1) | %97.4 | %100.0 | %92.9 | 0.963 | 0.995 |

SVM, KNN'e kıyasla tüm metriklerde daha başarılı oldu. En dikkat çekici fark recall'da: KNN kötü huylu vakaların sadece %85.7'sini doğru yakalarken, SVM %92.9'unu yakaladı.
Confusion matrix karşılaştırması bu farkı çok daha somut hale getiriyor: test setindeki 42 kötü huylu vakadan, KNN 6'sını kaçırırken, SVM sadece 3'ünü kaçırdı. SVM ayrıca 72 iyi huylu vakanın hepsini doğru sınıflandırdı, hiç yanlış alarm vermedi.

ROC eğrisi ve AUC: Her iki model de mükemmele çok yakın AUC skorları elde etti (KNN: 0.982, SVM: 0.995). AUC'yi günlük dile çevirirsek: rastgele bir kötü huylu ve bir iyi huylu vaka seçildiğinde, SVM bu ikisini doğru sırayla ayırt edebilme olasılığı %99.5 — neredeyse kusursuz bir ayrım gücü.

Karar sınırı görselleştirmesi: Modellerin "nasıl düşündüğünü" daha somut görebilmek için, en ayırt edici iki özelliği kullanarak 2 boyutlu bir karar sınırı görselleştirmesi yaptım. Bu görsel, iki algoritma arasındaki temel felsefe farkını çok net gösteriyor: KNN, verinin lokal yoğunluğuna göre daha "düzensiz/kıvrımlı" bir sınır çiziyor, SVM ise daha "pürüzsüz ve genel" bir sınır çiziyor.

Elde Edilen Çıkarımlar
Bu projeden çıkardığım en önemli sonuçlar:
-
Ölçeklendirme, mesafe/margin tabanlı algoritmalar için kesinlikle atlanmaması gereken bir adım. StandardScaler kullanmadan önceki hızlı denemelerimde, ölçeklendirilmemiş veriyle modellerin performansının belirgin şekilde düştüğünü gözlemledim.
-
Hiperparametre optimizasyonu gerçekten fark yaratıyor. K=1'den K=30'a kadar tüm değerleri test ederek bulduğum K=3, varsayılan bir K değerinden çok daha iyi bir cross-validation performansı verdi. Aynı şekilde, GridSearchCV ile SVM için doğru kernel ve C değerini bulmak modelin genelleme başarısını yükseltti.
-
"En iyi" algoritma, veri setine bağlı. Bu projede SVM tüm metriklerde önde çıktı çünkü veri sınıfları arasında hafif doğrusal olmayan bir yapı vardı. Ancak bu, SVM'in her zaman KNN'den daha iyi olduğu anlamına gelmiyor — farklı bir veri yapısında sonuç tersine dönebilirdi.
-
Accuracy tek başına yeterli bir metrik değil. Özellikle sağlık gibi hassas alanlarda, precision, recall ve confusion matrix'e bakmak, modelin gerçekte ne tür hatalar yaptığını anlamak için şart. İki modelin accuracy farkı (%93.9 vs %97.4) küçük görünse de, confusion matrix'e indiğimizde bunun "3 hasta daha az kaçırma" gibi somut ve anlamlı bir farka karşılık geldiğini gördüm.
Geliştirme Fikirleri
Bu proje zaman kısıtlı bir bootcamp finali kapsamında hazırlandı, ancak ileride geliştirilebilecek birkaç yön görüyorum: Random Forest veya Gradient Boosting gibi ensemble yöntemleriyle karşılaştırmayı genişletmek, özellik seçimi (feature selection) teknikleriyle modelin yorumlanabilirliğini artırmak, daha geniş/çeşitli verilerle genellenebilirliği test etmek, ve SHAP veya LIME gibi açıklanabilirlik teknikleriyle modelin bireysel tahminlerini derinlemesine incelemek.
Kapanış
Bu proje, Huawei Student Developers ve Türkiye Yapay Zeka Akademisi iş birliğiyle yürütülen Veri Bilimi ve Makine Öğrenmesi Bootcamp'inin final projesi olarak hazırlandı. Süreç boyunca hem klasik makine öğrenmesi algoritmalarının pratik uygulamasını hem de bir veri bilimi projesinin uçtan uca nasıl yürütüldüğünü deneyimleme fırsatı buldum. Sağlık verisiyle çalışmak, makine öğrenmesi modellerinin gerçek dünyada ne kadar dikkatli ve sorumlu bir şekilde geliştirilmesi gerektiğini bir kez daha hatırlattı.
Projenin tüm koduna, görselleştirmelerine ve detaylı analizine GitHub, Kaggle ve Medium bağlantılarından ulaşabilirsiniz.
Bu proje, Huawei Student Developers ve Türkiye Yapay Zeka Akademisi iş birliğiyle yürütülen Veri Bilimi ve Makine Öğrenmesi Bootcamp'i kapsamında final projesi olarak hazırlanmıştır.
