Python ile NLP’ye adım adım #1

Oğuzhan Arı
4 min readAug 3, 2020

Merhabalar, bir süredir, Doğal Dil İşlemeye olan ilgimden ötürü, bu konuyla ilgili çalışmalar yapıyorum. Hem bildiklerimi pekiştirmek için, hem bir şeyleri anlatabilmenin, o şeyi biliyor olmanın göstergesi olduğuna düşündüğümden hem de benim gibi, minik kavramları merak edenlerin erişebileceği bir kaynak olmasını istediğimden böyle bir yazı serisi hazırlamak istiyorum.

Makine Öğrenmesi, bildiğiniz gibi derya deniz ve her yerden “bir şeyler” çıkıyor. Bazı kütüphanelerin ve sınıflandırma tekniklerinin gelişi güzel isimlendirildiğini zannederken aslında isimlerinin arkasında yatan teoriler olduğunu da fark ettim. O yüzden, bugün anlatacağımız iki sınıflandırma algoritması var:

Naive Bayes ve Adaboost

Daha net anlatabilmek için, minik bir örnek ile ilerlemek istiyorum. İlgili adresten ulaşabileceğiniz spambase.data dosyası ile bir çalışma yapma ve bu iki sınıflandırıcıyı aynı veri seti üzerinde gözlemlemek istiyorum. Hazırsak;

Kodlama

Çok temel ve makine öğrenmesine giriş yaptığınızda karşınıza ilk çıkan kodlar kullanacağız. Öncelikle, gerekli kütüphanelerimizi eklememiz gerekiyor.

import pandas as pdfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import AdaBoostClassifier

Kullanacağımız kütüphaneleri en başta eklediğimize göre, veri setimizi ekleyebilir ve onun üzerinde işlemlerimize başlayabiliriz. Veri seti uzantımız .data olarak geçiyor ancak pandas sayesinde .csv uzantılıymış gibi işlem yapabiliyoruz.

dataset = pd.read_csv('spambase.data')

Bu yazıyı yazarken veri setimizin içinde 58 sütun ve 4600 satır veri var. Yani, ilerleyen zamanda sütun sayısı azalmış veya artmış olabilir, bu sizden kaynaklanan bir hata değil.

Verimize genel olarak bir göz atalım.

print("Bütün Veri Seti")print(dataset.info)
Tüm Veri Setimiz

En sağda görmüş olduğumuz 0 ve 1'den oluşan sütun, o satırın spam veya spam olmadığını ifade eden, diğer bir değişle “target” sütunumuz.

Yani, ilk 57 sütunumuz bizim “feature” sütunumuz olurken, son sütunumuz “target” olacak. Şu şekilde ayırabiliriz:

feature = dataset.iloc[:,:57]target = dataset.iloc[:,-1:]print("Feature")print(feature)print("Target")print(target)
Feature ve Target Veri Setlerimiz.

Veri setimiz homojen rastgele değil, yani ilk satırlar “spam” iken geri kalan satırlarımız “spam değil”. Bu yüzden veri setimizi bölerken bir de random_state eklememiz gerekecek.

x_train, x_test, y_train, y_test = train_test_split(feature,target, test_size=0.025, random_state=1)#0.025 yaklaşık 125 veri yapıyor.

İlk modelimizi belirleyelim ve çalıştıralım.

model = MultinomialNB()model.fit(x_train,y_train.values.ravel())print("Modelin Sınıflandırma Skoru:", model.score(x_test, y_test))
Naive Bayse Sınıflandırma Skoru.

Aynı şeyi AdaBoost için de deneyelim.

model = AdaBoostClassifier()model.fit(x_train,y_train.values.ravel())print("Modelin Sınıflandırma Skoru:", model.score(x_test, y_test))
AdaBoost Sınıflandırma Skoru.

Dikkatimi çeken bir nokta da, iki farklı model denememize rağmen değişen tek şey bir satır kod. Bu da, makine öğrenmesi alanına giren herkesin kafasında doğan “hangi model daha iyi” sorusunun dolaylı cevaplarından birisi. Bu soruyu, her sorduğunuzda, karşınızdaki kişi “ne için?” diye soracaktır. Çünkü, başka bir veri seti üzerinde Naive Bayse harikalar yaratırken, AdaBoost çok kötü sonuçlar verebilir. Bu alanda çalışan insanların hep söylediği şey “hangi modeli seçeceğine yardımcı olacak birkaç olgu olsa da, bu, alanda çalışırken edindiğin tecrübeyle ve veri setinin seni yönlendirmesiyle alınacak bir karar.”.

Basit bir şekilde, modellerimizi eğitim skorlarını aldığımıza göre biraz bu iki sınıflandırma algoritması hakkında konuşabiliriz.

Naive Bayse

Öncelikle “Bayse”in ne olduğunu inceleyelim.

Bayse Teoremi

Eşitliğin sol tarafı, B biliniyorken A’nın koşullu olasılığını ifade eder. P(A) ve P(B) ise olayların bağımsız olasılıklarını ifade etmektedir.

Örneğin;

P(A=spam) ve P(A=spam değil).

P(A=spam) = 0.4 ve buna bağlı olarak P(A=spam değil) = 0.6 olduğunu varsayarsak,

ve buradaki B’nin, yani aslında Feature’larımızın şunlar olduğunu var sayalım.

Feature #1 = uyuşturucu

Feature #2 = hisse sigorta

Bu durumda 4 adet parametreye ihtiyacımız var.

  1. P(uyuşturucu = 1 | y = spam) = 0.8
  2. P(sigorta= 1 | y = spam) = 0.9
  3. P(uyuşturucu= 1 | y = spam değil) = 0.1
  4. P(sigorta= 1 | y = spam değil) = 0.2

Son olarak değerlerini Bayes Teoremine oturttuğumuzda, karşımıza çıkan değerler;

Spam için;

P(uyuşturucu = 1 | y = spam) * P(sigorta= 1 | y = spam) *P(A=spam) = 0.9*0.2*0.4 = 0,072

Spam değil için;

P(uyuşturucu = 1 | y = spam değil) * P(sigorta= 1 | y = spam değil) *P(A=spam değil) =

0.2*0.9*0.6 = 0,108

Spam değil, daha yüksek olduğu için, bu durumda bu maili “spam değil” olarak etiketleriz.

AdaBoost

AdaBoost’u, daha matematikten uzak olarak basit bir şekilde açıklamaya çalışacağım.

AdaBoost, öncelikle bütün Feature’larımızı tahmin için tek tek sınar.

AdaBoost

D1, D2 ve D3 bizim Feature’larımızdır. Her Feature’ı, tahmin için sınar ve ne kadar hata yaptıklarını hesaplar. En çok hata yapan Feature, ağırlığı en fazla olan Feature olarak seçer ve modeli bu şekilde şekillendirir.

Buraya kadar okuduysanız (okuyabildiyseniz!) teşekkür ederim!

Bir sonraki yazımda “şundan bahsedeceğim” diyemiyorum çünkü konunun ne olacağını ben de bilmiyorum. Ama bir sonraki yazının olacağının garantisini veriyorum. O yüzden, görüşmek üzere!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Oğuzhan Arı
Oğuzhan Arı

No responses yet

Write a response