• Yapay zeka soru ve sorunlarınızı uygun olan kategorilere açıp yanıt alabilirsiniz...

Scikit-learn ile Naive Bayes sınıflandırıcısı nasıl kullanılır?

Garfield

YZF Admin
Yaş
40
Konum
YurtDışı
Katılım
27 Eki 2026
Konular
664
Mesajlar
689
AI Seviyesi
Yeni
Naive Bayes sınıflandırıcısını scikit-learn ile kullanmak için veriyi eğitim ve test kümelerine ayırıp uygun Naive Bayes modelini seçmeniz, modeli fit() ile eğitmeniz ve predict() ile tahmin almanız yeterlidir. Metin sınıflandırmada en pratik başlangıç, TfidfVectorizer ile metni sayısal özelliklere dönüştürüp MultinomialNB kullanmaktır. Aşağıdaki örnek, kısa metinleri "olumlu" ve "olumsuz" olarak sınıflandırır; çalıştırıldığında yeni bir cümlenin sınıfını ve sınıf olasılıklarını üretir.

Hangi Naive Bayes modeli seçilmeli?​


Naive Bayes, özelliklerin sınıfa göre koşullu olarak bağımsız olduğu varsayımıyla olasılık hesaplayan hızlı bir sınıflandırma yaklaşımıdır. Gerçek veriler bu varsayımı tam olarak karşılamasa bile özellikle küçük veri kümelerinde ve metin sınıflandırmada iyi bir başlangıç modeli olabilir.
  • MultinomialNB: Kelime sayıları veya TF-IDF gibi negatif olmayan metin özellikleri için uygundur.
  • BernoulliNB: Bir özelliğin var/yok olması gibi ikili göstergelerle çalışır.
  • GaussianNB: Sürekli sayısal özelliklerin yaklaşık normal dağıldığı durumlarda kullanılır.
  • ComplementNB: Özellikle sınıfların dengesiz olduğu bazı metin sınıflandırma görevlerinde alternatif olarak denenebilir.
Metin verisini doğrudan MultinomialNB modeline veremezsiniz; önce kelimeleri sayısal özelliklere dönüştürmeniz gerekir. Bu dönüşümü modelle birlikte Pipeline içine almak, eğitim ve tahmin sırasında aynı işlemlerin uygulanmasını sağlar.

Metin sınıflandırma için çalışan örnek​


Ön koşul olarak Python ve scikit-learn kurulmalıdır. Kurulum yapacaksanız terminalde şu komutu çalıştırın:

Python:
python -m pip install scikit-learn

Ardından aşağıdaki örneği bir Python dosyasına kaydedip çalıştırabilirsiniz. Veriler öğretici olması için varsayımsaldır; gerçek bir modelin başarısını temsil eden test sonucu değildir.

Python:
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report

metinler = [
    "ürün çok kaliteli ve kullanışlı",
    "hızlı teslimat ve başarılı hizmet",
    "uygulama oldukça pratik",
    "üründen memnun kaldım",
    "kalitesiz ve kullanışsız ürün",
    "teslimat çok gecikti",
    "uygulama sürekli hata veriyor",
    "üründen memnun kalmadım",
    "hizmet beklediğimden kötüydü",
    "ürün fiyatına göre başarılı"
]

etiketler = [
    "olumlu", "olumlu", "olumlu", "olumlu", "olumsuz",
    "olumsuz", "olumsuz", "olumsuz", "olumsuz", "olumlu"
]

X_egitim, X_test, y_egitim, y_test = train_test_split(
    metinler,
    etiketler,
    test_size=0.3,
    random_state=42,
    stratify=etiketler
)

model = Pipeline([
    ("vektor", TfidfVectorizer()),
    ("siniflandirici", MultinomialNB())
])

model.fit(X_egitim, y_egitim)

tahminler = model.predict(X_test)
print("Doğruluk:", accuracy_score(y_test, tahminler))
print(classification_report(y_test, tahminler, zero_division=0))

yeni_metinler = [
    "teslimat hızlı ve ürün çok başarılı",
    "uygulama kullanışsız ve sürekli hata veriyor"
]

siniflar = model.predict(yeni_metinler)
olasiliklar = model.predict_proba(yeni_metinler)

for metin, sinif, olasilik in zip(yeni_metinler, siniflar, olasiliklar):
    print("Metin:", metin)
    print("Tahmin:", sinif)
    print("Olasılıklar:", dict(zip(model.classes_, olasilik)))

Kod bloğundaki tahminler satırının başında boşluk olmamalıdır. Doğru satır şöyledir:

Python:
tahminler = model.predict(X_test)

Kodun çalışma sırası​

  1. Veriyi hazırlayın. metinler giriş cümlelerini, etiketler ise her cümlenin doğru sınıfını içerir. İki listenin uzunluğu aynı olmalıdır.
  2. Veriyi ayırın. train_test_split(), modelin görmediği test örnekleri oluşturur. stratify=etiketler, küçük veri kümelerinde sınıf dağılımının mümkün olduğunca korunmasına yardımcı olur.
  3. Dönüşüm ve sınıflandırıcıyı birleştirin. TfidfVectorizer metinleri sayısal vektörlere çevirir; MultinomialNB bu vektörlerden sınıf tahmini yapar.
  4. Modeli eğitin. model.fit(X_egitim, y_egitim) çağrısı vektörleştiriciyi yalnızca eğitim metinleriyle öğrenir ve sınıflandırıcıyı bu özelliklerle eğitir.
  5. Test sonucunu ölçün. accuracy_score doğru tahmin oranını verir. classification_report ise her sınıf için precision, recall ve F1-score değerlerini gösterir.
  6. Yeni metinleri sınıflandırın. predict() en olası sınıfı, predict_proba() ise modelin öğrendiği sınıflara ait olasılık tahminlerini döndürür.
Test kümesi çok küçük olduğunda doğruluk değeri tek başına yanıltıcı olabilir. Örneğin iki test örneğinin ikisini doğru tahmin etmek yüzde 100 doğruluk gösterir; bu, modelin yeni verilerde kesin olarak başarılı olacağını kanıtlamaz. Daha güvenilir değerlendirme için daha fazla etiketli veri, sınıf bazlı ölçümler ve gerektiğinde çapraz doğrulama kullanılmalıdır.

Model seçimi ve sonuçların yorumu​


Naive Bayes modelini veri türüne göre seçmek, algoritmanın adından daha önemlidir. Aşağıdaki ayrım, başlangıç kararını kolaylaştırır.
Veri türüBaşlangıç modeliDikkat edilmesi gereken nokta
Kelime sayısı veya TF-IDF özellikleriMultinomialNBÖzellik değerleri negatif olmamalıdır.
Kelime var/yok bilgisiBernoulliNBİkili özellik temsili kullanılmalıdır.
Sürekli sayısal ölçümlerGaussianNBÖzelliklerin dağılımı ve ölçeği incelenmelidir.
Dengesiz metin sınıflarıComplementNBSonuçlar sınıf bazında ayrıca değerlendirilmelidir.
Tablodaki seçimler başlangıç noktasıdır; en iyi model veri kümesine göre değişir. Özellikle etiketlerden biri çok daha sık görülüyorsa yalnızca accuracy değerine bakmayın. Az görülen sınıfın recall ve F1-score değerlerini de inceleyin. Modelin bir sınıfı sürekli tahmin etmesi, yüksek doğruluk görülse bile veriyi iyi öğrendiği anlamına gelmez.

Yeni veriyi tahmin etmeden önce eğitim sırasında kullanılan metin temizleme ve vektörleştirme işlemlerinin aynı biçimde uygulanması gerekir. Pipeline bunu otomatik yaptığı için, eğitimde kullanılan TfidfVectorizer nesnesinden ayrı bir vektörleştiriciyle tahmin yapmak yerine doğrudan model.predict() kullanın. Ayrıca test verisini eğitim sırasında modele vermeyin; aksi durumda ölçüm verisi modele sızar ve sonuç gerçekte olduğundan iyi görünebilir.

Yeni sayısal verilerde kullanım​


Girdi metin değil, örneğin yaş, gelir ve işlem sayısı gibi sayısal sütunlardan oluşuyorsa GaussianNB ile benzer bir akış kullanabilirsiniz:

Python:
from sklearn.naive_bayes import GaussianNB

X = [
    [25, 30000, 2],
    [42, 85000, 8],
    [31, 50000, 4],
    [55, 120000, 10]
]
y = ["dusuk", "yuksek", "orta", "yuksek"]

model = GaussianNB()
model.fit(X, y)

sonuc = model.predict([[35, 60000, 5]])
print(sonuc)

Buradaki çıktı, modelin eğitim örneklerinden öğrendiği sınıflardan biri olur. Bu küçük örnek yalnızca API kullanımını gösterir; dört satırlık veriyle anlamlı bir gerçek dünya kararı verilemez. Gerçek kullanımda eksik değerleri, sınıf dengesini, ölçüm hatalarını ve bağımsız bir test kümesindeki performansı ayrıca kontrol etmelisiniz.

Naive Bayes hızlı ve anlaşılır bir temel modeldir; ancak özellikler arasındaki ilişkiler güçlü olduğunda veya karar sınırları karmaşıklaştığında başka sınıflandırıcılarla karşılaştırılması gerekebilir. İlk sonraki adım, aynı veri bölünmesini koruyarak uygun birkaç modeli aynı ölçütlerle değerlendirmek ve yalnızca doğruluk değil sınıf bazlı sonuçlara göre seçim yapmaktır.
 
Son düzenleme:

Sen de şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic
Geri
Üst