← Back to list

Sahte Haberlerin Peşinde: Makine Öğrenmesiyle Güvenilirlik Tahmini

Bu çalışma, Türkiye Yapay Zeka Akademisi ve Huawei Student Developers iş birliğiyle düzenlenen Veri Bilimi ve Makine Öğrenmesi Bootcamp…

Mehmet Köşetaş · 2026-08-08 19:50 · 0 claps · 7.9 min read
#machine-learning #data-science #python #random-forest #tf-idf
Open on Medium ↗
Wiki topics: ML · Machine Learning EDU · Education & Learning 🔬 · Science · General 🧘 · Spirituality

Sahte Haberlerin Peşinde: Makine Öğrenmesiyle Güvenilirlik Tahmini

Bu çalışma, Türkiye Yapay Zeka Akademisi ve Huawei Student Developers iş birliğiyle düzenlenen Veri Bilimi ve Makine Öğrenmesi Bootcamp kapsamında hazırladığım final projesidir.

Sosyal medyada birkaç dakika geçirdiğimizde onlarca farklı haber, yorum ve iddiayla karşılaşıyoruz. Birinin doğru olup olmadığını anlamak ise çoğu zaman o kadar kolay değil. Özellikle siyaset, sağlık ve ekonomi gibi konularda yanlış bir bilgi çok kısa sürede binlerce kişiye ulaşabiliyor.

Ben de bu projeye başlarken kendime oldukça basit bir soru sordum:

Bir makine, karşısına çıkan bir içeriğin doğru ya da yanlış olma ihtimalini tahmin edebilir mi?

Bu soruya cevap ararken yalnızca bir sınıflandırma modeli eğitmek istemedim. Aynı zamanda bir içeriğin ne kadar güvenilir olduğuna dair sürekli bir skor üretmeyi de denedim. Böylece projeyi iki farklı makine öğrenmesi problemi üzerinden ele aldım: sınıflandırma ve regresyon.

Bu süreçte model kurmaktan çok daha önemli bir şey öğrendim: Bir modelin yüksek skor vermesi, onun gerçekten doğru şeyi öğrendiği anlamına gelmiyor.

Önce veriyi tanımam gerekiyordu

Projede iki farklı kaynağı bir araya getirdim.

İlk ve ana kaynağım LIAR veri setiydi. LIAR, Amerikan siyaseti üzerine oluşturulmuş ve iddiaları konuşmacı bazında doğruluk etiketleriyle sınıflandırılmış bir veri seti. Her kayıt false, barely-true, half-true, mostly-true, true ve pants-fire olmak üzere altı etiketten birine sahip.

İkinci kaynak ise daha önce toplanmış 1.248 sosyal medya içeriğinden oluşan scraped veri oldu. Bu verileri de LIAR’daki etiket yapısıyla uyumlu hale getirerek ana veri setine dahil ettim.

Sonuçta elimde:

  • 12.784 LIAR kaydı
  • 1.248 scraped sosyal medya kaydı
  • 14.032 toplam içerik

oluştu.

Burada önemli bir nokta var: İki kaynağın doğrudan aynı yapıda olmadığını gördüm. Bu nedenle modelleme aşamasından önce verileri ortak bir formata getirmem ve temizlemem gerekti.

Grafikteki dağılıma baktığımda altı sınıfın tamamen eşit olmadığını, ancak sınıfların tek bir kategori etrafında aşırı şekilde toplanmadığını gördüm. Daha sonra problemi iki sınıfa indirdiğimde dağılım daha da dengeli hale geldi:

  • Yanlış: false, barely-true, pants-fire
  • Doğru: half-true, mostly-true, true

Bu dönüşümün ardından 6.455 içerik yanlış, 7.577 içerik doğru sınıfında yer aldı. Yani yaklaşık %46 yanlış — %54 doğru şeklinde bir dağılım elde ettim.

Veriyi modele vermeden önce ne yaptım?

Makine öğrenmesinde model seçmek genellikle en çok konuşulan kısım. Benim için ise asıl iş veriyi hazırlarken başladı.

İlk olarak eksik değerleri kontrol ettim, metinleri standartlaştırdım ve tekrar eden kayıtları temizledim. Metinlerin tamamını küçük harfe çevirdim.

Bir de konuşmacı bilgisini göz ardı etmek istemedim.

Özellikle LIAR veri setindeki politikacıların geçmişteki iddialarının doğruluk eğilimlerini inceleyerek bir speaker credibility skoru hesapladım. Fikir oldukça basitti: geçmişte daha yüksek oranda doğru etiketlere sahip olan bir konuşmacının yeni iddiası için daha yüksek bir ön güven skoru oluşuyordu.

Ancak burada önemli bir karar verdim. Bu kredibilite skorunu analiz etmek için kullansam da final modelinin doğrudan girdilerinden biri haline getirmedim. Böylece modelin yalnızca metinsel özelliklerden ne öğrenebildiğini daha net görmek istedim.

Metni modelin anlayabileceği hale getirmek

Elimdeki veri sonuçta metinlerden oluşuyordu. Bir makine öğrenmesi modeli için "The president announced..." gibi bir cümlenin kendisini doğrudan kullanamam.

Bu nedenle metinleri sayısal özelliklere dönüştürmek için TF-IDF kullandım.

Burada yalnızca tek tek kelimeleri kullanmak yerine bigram özelliğini de kullandım. Bunun nedeni bazı kelimelerin yan yana geldiğinde tek başlarına olduğundan çok daha anlamlı hale gelmesi.

Örneğin:

healthve care ayrı ayrı ele alındığında başka anlamlara sahip olabilirken,

health careifadesi belirli bir konuya işaret ediyor.

Kullandığım temel yapı şu şekildeydi:

from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer(
    max_features=3000,
    ngram_range=(1,2),
    stop_words="english"
)
X_metin = vec.fit_transform(df["text"])

Bu işlem sonunda metinleri modelin kullanabileceği sayısal bir özellik matrisine dönüştürdüm. Burada amacım mümkün olduğunca karmaşık bir yapı kurmak değildi. Önce basit, anlaşılabilir ve yorumlanabilir bir yöntemle başlamak istedim.

İlk model: Lojistik Regresyon

İlk denediğim model Lojistik Regresyon oldu.

Bunun özel bir nedeni vardı. Daha karmaşık modellere geçmeden önce basit bir baseline oluşturmak istiyordum. Böylece daha sonra kullandığım modellerin gerçekten bir iyileşme sağlayıp sağlamadığını görebilecektim.

Veriyi %80 eğitim ve %20 test olacak şekilde ayırdım. Model eğitim sırasında test verisini görmedi ve performansını daha önce karşılaşmadığı veriler üzerinde ölçtüm.

Sonuç:

Accuracy: %67,55

Detaylara baktığımda ise daha ilginç bir durum ortaya çıktı:

Model doğru sınıfını yakalamada daha başarılıydı. Ancak yanlış içerikleri yakalama konusunda recall değeri 0,59 seviyesinde kaldı.

Bu sonuç bana önemli bir şey söyledi:

Yanlış içerikler, yalnızca metnin kendisine bakıldığında doğru içeriklere oldukça fazla benzeyebiliyor.

Bir içerikte belirli kelimelerin geçmesi, o içeriğin doğru ya da yanlış olduğunu tek başına garanti etmiyor.

Random Forest ile biraz daha ileri gittim

İkinci model olarak Random Forest kullandım.

Buradaki amacım yalnızca accuracy değerini artırmak değildi. Farklı bir model yaklaşımının aynı veri üzerinde nasıl davranacağını görmek istiyordum.

Sonuçlar şöyle oldu:

Lojistik Regresyon ile Random Forest arasında devasa bir fark oluşmadı. Random Forest biraz daha iyi sonuç verdi ancak iki model de yaklaşık %68 bandında kaldı.

Bu benim için aslında kötü bir sonuç değildi.

Çünkü burada amacım “en yüksek accuracy’yi bulmak”tan çok, verinin ve seçtiğim özelliklerin probleme ne kadar bilgi taşıdığını anlamaktı.

Random Forest’ın confusion matrix’ine baktığımda modelin doğru sınıfını daha rahat yakaladığını gördüm.

Model yanlış olarak tahmin ettiği içeriklerin yaklaşık üçte ikisinde gerçekten yanlış sınıfını seçiyordu. Ancak yanlış içeriklerin tamamını yakalayamıyordu.

Yani modelin davranışını tek bir accuracy sayısıyla açıklamak mümkün değildi. Precision ve recall gibi metriklere bakmak bu yüzden önemliydi.

Sonra aklıma başka bir fikir geldi: Güvenilirlik skoru

Buraya kadar yaptığım şey aslında klasik bir sınıflandırma problemiydi:

“Bu içerik yanlış mı, doğru mu?”

Fakat gerçek hayatta durum biraz daha farklı.

“Bu içerikten ne kadar eminiz?” sorusunu da sormak daha kullanışlı olabilirdi.

Bu nedenle bir güvenilirlik skoru üretmeyi denedim.

Modelin ürettiği True_Prob ve False_Prob değerlerinden yararlanarak:

Trustworthiness Score
= True_Prob - False_Prob

şeklinde sürekli bir skor oluşturdum.

Skor pozitif oldukça içerik doğru sınıfına, negatif oldukça yanlış sınıfına yaklaşıyordu.

Bu noktada projenin benim için en öğretici kısmı başladı.

Model fazla mı iyiydi?

Regresyon modelini ilk çalıştırdığımda sonuçları görünce açıkçası şüphelendim.

R² değeri neredeyse 1'e yakındı.

İlk bakışta bu harika bir sonuç gibi görünüyor.

Ama veri bilimi tarafında bazen en güzel görünen sonuç, aslında sanıldığı kadar güzel olmayabiliyor.

Özellikleri tekrar kontrol etmeye başladım.

Ve problemi buldum.

Tahmin etmeye çalıştığım ML_Trustworthiness_Score zaten:

True_Prob - False_Prob

şeklinde hesaplanıyordu.

Ama ben regresyon modeline bu skorun bileşenlerini de özellik olarak vermiştim.

Yani modelin önünde kabaca şöyle bir ilişki vardı:

True_Prob - False_Prob = Target

Modelin çok yüksek R² vermesi artık o kadar şaşırtıcı değildi.

Model gerçekten yeni bir ilişki öğrenmek yerine, hedef değişkeni oluştururken kullandığım bilgiyi tekrar kullanıyordu.

Data leakage.

Bu noktada projeyi bırakıp “sonuçlarım çok iyi çıktı” diyebilirdim.

Ama bence projenin asıl değeri burada ortaya çıktı.

Sızıntıyı temizledim

Sorunlu iki özelliği regresyon modelinin girişinden çıkardım ve modeli yeniden eğittim.

Sonuçlar bir anda değişti:

  • MAE: 0,1172
  • R²: 0,6015
  • Pearson correlation: 0,778

İlk sonuç kadar iyi görünmüyordu.

Ama artık sonuç daha anlamlıydı.

Çünkü modelin hedef değişkenin doğrudan bileşenlerini kullanarak hedefi kopyalamasının önüne geçmiştim.

Benim için bu noktadaki en önemli ders şuydu:

“Bir modelin yüksek skor vermesi ile gerçekten öğrenmesi aynı şey değil.”

Makine öğrenmesi projelerinde modelin performansına bakmak kadar, o performansın nasıl oluştuğunu sorgulamak da gerekiyor.

Peki model gerçekten ne öğreniyordu?

Model sonuçlarını aldıktan sonra yalnızca metriklere bakıp projeyi bitirmek istemedim.

Verinin içinde başka hangi örüntüler olduğunu da incelemeye başladım.

Özellikle konu bazında yanlış içerik oranlarını karşılaştırdım.

Burada en dikkat çekici sonuçlardan biri science-and-tech kategorisinde yanlış içerik oranının yaklaşık %72 seviyesine çıkmasıydı. Bunun yanında media ve sports kategorilerinde de daha yüksek yanlış içerik oranları gözlemledim.

Metinlerdeki sık geçen kalıplara baktığımda ise:

  • health care
  • barack obama
  • social security
  • president obama

gibi ifadelerin yanlış sınıftaki içeriklerde sık tekrarlandığını gördüm.

Burada dikkat edilmesi gereken bir nokta var: Bir kelimenin veya ifadenin sık geçmesi onun yanlış bilgi ürettiği anlamına gelmiyor.

Benim için bu analiz daha çok dezenformasyonun belirli temalar ve ifadeler çevresinde kümelenebileceğine dair bir ders niteliğindeydi.

Bu projeden ne öğrendim?

1. Veri, modelden önce geliyor

İyi bir model seçmek önemli ama modelin beslendiği veri problemliyse sonuç da problemli oluyor.

İki farklı kaynağı birleştirirken veri formatlarını, etiketleri ve dağılımları anlamanın model seçmek kadar önemli olduğunu gördüm.

2. Basit bir baseline oluşturmak çok önemli

İlk olarak Lojistik Regresyon ile başladım.

Daha sonra Random Forest’a geçtim.

Sonuçların birbirine oldukça yakın çıkması bana şunu gösterdi:

Her projede daha karmaşık modele geçmek otomatik olarak daha iyi sonuç anlamına gelmiyor.

Önce basit bir modelle problemin kendisini anlamak gerekiyor.

3. Accuracy tek başına yeterli değil

%68,65 accuracy kulağa güzel gelebilir.

Ama model yanlış içerikleri ne kadar yakalıyor?

Recall ne durumda?

Precision nasıl?

F1-score ne söylüyor?

Bu sorulara bakmadan sadece accuracy üzerinden model hakkında karar vermek yanıltıcı olabilir.

4. Data leakage gerçekten tehlikeli

Projenin benim için en değerli kısmı buydu.

Modelin performansı ilk başta çok iyiydi.

Sonra neden bu kadar iyi olduğunu araştırdım ve modelin hedef değişkeni oluştururken kullandığım bilgiyi tekrar feature olarak kullandığımı fark ettim.

Bu deneyim bana veri biliminin sadece model eğitmek olmadığını gösterdi.

Veriyi, feature’ları, target’ı ve bütün pipeline’ı sürekli sorgulamak gerekiyor.

5. Sonucu abartmamak da bir proje çıktısıdır

Bu çalışmanın sonucu %100 doğruluk değil.

Hatta %68,65 accuracy de kusursuz bir sonuç değil.

Ama benim için değerli olan, modelin neyi yapabildiğini ve neyi yapamadığını daha net görebilmekti.

Sonuç: Bir sonraki adım ne olabilir?

Bu projede TF-IDF, Lojistik Regresyon ve Random Forest gibi görece klasik yöntemlerle yanlış ve doğru içerikleri ayırmayı denedim.

En iyi sınıflandırma sonucum Random Forest ile:

%68,65 Accuracy ve 0,683 Weighted F1 oldu.

Güvenilirlik skorunu tahmin eden regresyon tarafında ise leakage temizlendikten sonra:

MAE = 0,1172 ve R² = 0,6015 elde ettim.

Bu sonuçlar bana bir şeyin mümkün olduğunu gösterdi: yalnızca metin özelliklerinden bile içeriklerin doğruluk sınıfına dair belirli bir sinyal yakalanabiliyor.

Ama aynı zamanda bunun gerçek dünyada kullanılabilecek kusursuz bir “yalan haber dedektörü” olmadığını da biliyorum.

Bir sonraki aşamada modele daha fazla metadata eklemek, daha gelişmiş doğal dil işleme yöntemleri kullanmak ve özellikle veri sızıntısı risklerini azaltacak şekilde tüm preprocessing pipeline’ını yalnızca eğitim verisi üzerinden fit etmek isterdim.

Transformer tabanlı modeller, daha gelişmiş metin temsilleri ve kaynak güvenilirliği gibi ek bilgilerin de performansı artırabileceğini düşünüyorum.

Kapanış

Bu projeye başlarken amacım bir makine öğrenmesi modeli eğitmekti.

Proje bittiğinde ise bundan biraz daha fazlasını öğrendiğimi düşünüyorum.

Bir veri setini anlamayı, iki farklı kaynağı birleştirirken dikkat edilmesi gereken noktaları, basit modellerle başlamanın önemini, farklı metrikleri birlikte değerlendirmeyi ve en önemlisi bir modelin neden iyi sonuç verdiğini sorgulamayı deneyimledim.

Özellikle data leakage problemi benim için teoride okuduğum bir kavram olmaktan çıkıp gerçek bir proje problemi haline geldi.

Ve sanırım veri bilimi öğrenme sürecindeki en değerli deneyimlerden biri de bu:

Bazen projeden aldığımız en iyi sonuç, en yüksek skor değil; o skorun neden yüksek olduğunu keşfetmektir.

Bu çalışma, benim için makine öğrenmesi yöntemlerini uyguladığım bir bootcamp projesinden daha fazlası oldu. Veriye bakma, sonuçları sorgulama ve yaptığım hatalardan geri dönerek modeli yeniden kurma konusunda önemli bir deneyim kazandım.

Bu yazı, Türkiye Yapay Zeka Akademisi ve Huawei Student Developers iş birliğiyle gerçekleştirilen Veri Bilimi ve Makine Öğrenmesi Bootcamp kapsamında hazırlanmıştır.


메타데이터
post_id
c4602f496cd8
slug
sahte-haberlerin-peşinde-makine-öğrenmesiyle-güvenilirlik-tahmini-c4602f496cd8
url
https://medium.com/@mehmetkosetas/sahte-haberlerin-pe%C5%9Finde-makine-%C3%B6%C4%9Frenmesiyle-g%C3%BCvenilirlik-tahmini-c4602f496cd8
canonical_url
https://medium.com/@mehmetkosetas/sahte-haberlerin-pe%C5%9Finde-makine-%C3%B6%C4%9Frenmesiyle-g%C3%BCvenilirlik-tahmini-c4602f496cd8
author_url
https://medium.com/@mehmetkosetas
status
ok
fetched_at
2026-08-09 05:12:45