Bu proje, Türkçe köşe yazarlarının yazılarını sınıflandırmayı hedeflemektedir. Beş farklı köşe yazarının en az 20 köşe yazısı kullanılarak bir mannequin oluşturulmuş ve bu mannequin, yeni köşe yazılarının hangi yazarlara ait olduğunu tahmin etmek için kullanılmıştır. Bu amaçla, veri madenciliği teknikleri ve doğal dil işleme yöntemleri uygulanmıştır. Türkçe köşe yazarlarının yazılarını sınıflandırmak, metin içeriklerini analiz etmek ve farklı yazarların yazım tarzlarını belirlemek açısından büyük önem taşımaktadır. Bu tür bir sınıflandırma, haber siteleri veya medya kuruluşları gibi platformlarda içerik yönetimi ve kullanıcı deneyimini iyileştirmek için kullanılabilmektedir.
Kullanılan Kütüphaneler ve Modüller
Proje Python programlama dili ile kodlanmıştır. Kullanılan kütüphane ve modüller aşağıda listelenmiştir:
- collections: Veri yapıları için
- os: Dosya işlemleri için
- re: Common expressions için (pip set up regex)
- numpy: Sayısal işlemler için (pip set up numpy)
- snowballstemmer: Türkçe kök bulma işlemleri için (pip set up snowballstemmer)
- sklearn: Mannequin oluşturma, metrikler ve sınıflandırma algoritmaları için (pip set up scikit-learn)
- seaborn: Görselleştirme için
- matplotlib.pyplot: Görselleştirme için (pip set up matplotlib)
Tüm kütüphaneleri yüklemek için:
pip set up regex numpy snowballstemmer scikit-learn seaborn matplotlib
Projede kullanılan ana algoritma Destek Vektör Makineleri (Help Vector Machines — SVM) algoritmasıdır. SVM, sınıflandırma problemleri için kullanılan bir makine öğrenimi algoritmasıdır. Veri noktalarını sınıflandırmak için bir hiperdüzlem oluşturarak çalışır. SVM, belirli bir hiperdüzlemi seçerken sınıflar arasındaki marjı maksimize etmeye çalışır, bu da genelleme yeteneğini artırır.
Kodda, sklearn.svm.SVC sınıfı kullanılarak SVM modeli oluşturulmuştur. Ayrıca GridSearchCV ile en iyi parametrelerin bulunması sağlanmıştır. GridSearchCV, bir hiperparametre alanının belirli bir değer aralığında en iyi sonuçları veren parametre değerlerini bulmak için kullanılır. Bu kodda, SVM için “C” (ceza parametresi), “gamma” (RBF çekirdek fonksiyonunun genişliği) ve “kernel” (çekirdek fonksiyonu) parametrelerinin en iyi değerlerini bulmak için kullanılmıştır.
Son olarak, en iyi mannequin GridSearchCV ile belirlenmiş ve eğitim verisi üzerinde eğitilmiştir. Mannequin performansı, sınıflandırma raporu ve karışıklık matrisi ile değerlendirilmiştir. Confusion matrisi(Karışıklık Matrisi), gerçek ve tahmin edilen sınıflar arasındaki ilişkiyi görselleştiren bir tablodur. Bu değerlendirmeler, modelin doğruluğunu ve performansını değerlendirmek için kullanılmıştır.
Projedeki Veri Kümesi, beş farklı köşe yazarının 24’er Köşe yazısı alınarak Toplamda 120 Köşe yazısından oluşan bir Knowledge oluşturulmuştur. Her bir yazarın Eğitimi için 20, Testi için 4’er köşe yazısı ayrılmıştır. Bu Projede Eğitim için 100 Köşe yazısı check için ise 20 köşe yazısı kullanılmıştır.
Eğitim için ayrılan Köşe yazıları Knowledge klasörü içinde yazar1, yazar2, yazar3, yazar4, yazar5 klasörleri içerisinde 20’şer tane olmak üzere 100 köşe yazısı toplanmış ve düzenlenmiştir.
Take a look at için ayrılan köşe yazıları ise check klasörü içerinde yazar isimleri ile toplanmıştır.
Her yazarın köşe yazıları doc(doc) kısaltmasıyla adlandırılmış ve 1’den 20 ye kadar numaralandırılarak Veri Setimiz kategorize ve düzenli bir hale getirilmiştir.
Veri Setimizde Eğitim ve Take a look at için kullanacağımız yazarların Kimlikleri şu şekildedir.
Yazar1: Uğur Dündar
Yazar2: Soner Yalçın
Yazar3: Murat Muratoğlu
Yazar4: Ege Cansen
Yazar5: Rahmi Turan
Take a look at için ayrılan 20 köşe yazısı ise yine aynı şekilde 1’den 20’ye kadar olacak şekilde sıralanmış ve check klasörü içerisinde toplanmıştır. Ve her yazarın kendine ait klasöre göre ayrılmıştır. Buradaki check isimli textual content dosyalarını 4’er 4’er olacak şekilde yazar1, yazar2, yazar3, yazar4, yazar5 diye adlandırılmış yazarlara aittir.
Yani check klasöründeki check(sayi).txt dosyalarının:
· 1–4 Arası köşe yazılarının yazarı Yazar1 (Uğur Dündar),
· 5–8 Arası köşe yazılarının yazarı Yazar2 (Soner Yalçın),
· 9–12 Arası köşe yazılarının yazarı Yazar3 (Murat Muratoğlu),
· 13–16 Arası köşe yazılarının yazarı Yazar4 (Ege Cansen),
· 17–20 Arası köşe yazılarının yazarı Yazar5 (Rahmin Turandır.
Veri Setimizi oluşturduktan sonra Önişleme ve Temizleme adımları için bir Stopword Türkçe Kelime listesi oluşturdum ve Proje içerisine dahil ettim. Bu Kelime Listesi Zemberek Doğal Dil İşleme Kütüphanesi içerisinden alınmıştır.
stopword.txt diye adlandırdığım ve proje içerisine dahil etmek için projede şöyle bir kodlama yapıldı.
stopwords_path = "C:/Customers/FIRAT/Desktop/myProject/veri-madenciligi/Siniflandirma-Projesi/stopword.txt"# Cease phrase dosyasını okuyarak, metinlerdeki gereksiz kelimeleri filtrelemek için bir cease phrase listesi
with open(stopwords_path, "r", encoding="utf-8") as stopwords_file:
stop_words = stopwords_file.learn().splitlines()
· Veri bir metin olduğu ve burada bahsedilen yazarların zamanla duygu ve düşünce ya da eğitim düzeyi değiştiği için yazılar arasındaki Süre çok artarsa mannequin şaşırıp farklı tahminlerde bulunabiliyor
· Alıntı yapma ise başka bir sorun Yazarların kendi yazılarında diğer yazarlardan alıntı yapması Modelin sanki o yazarın yazısıymış gibi algılamasına sebep olabiliyor.
· Yazarların Kendince bir üslup ve açıklama mantıkları var bu da yazıların uzun yada kısa olmasına sebep oluyor. Fakat böyle bir durumda da bir yazar bir konuyu iki sayfada açıklarken diğer bir yazar yarım sayfada açıklayabiliyor. Buda bizim veri setimizde dengesiz bir ortam oluşturuyor. Bu yüzden bende veri setini dengelemek için şöyle bir yöntem buldum.
# Eğitim verilerini dengeli hale getirme
# Her yazardan eşit sayıda örnek alın
min_samples = min(len(texts) for texts in training_data.values())
for writer, texts in training_data.gadgets():
training_dataFırat Kaan Bitmez = texts[:min_samples]
Bunu yapmamım sebebi yazarlara ait vektörler oluşturduğımda bir yazarın büyük yada küçük vektörü olması modelin tahmin etmesinde zorluklar ortaya çıkarabiliyordu. Fazla Eğitilen bir mannequin her şeyi x yazarı gibi tahmin ederken az eğitilen bir yazarda ise hiç tahmin edilemiyordu.
Veri temizleme ve ön işleme adımı, metin verilerinin analiz ve modelleme sürecine hazırlanmasını sağlayan önemli bir aşamadır. Bu adımda, veri setindeki metinlerin anlamlı bilgilerini çıkarmak ve gereksiz bilgilerden arındırmak için çeşitli işlemler uygulanır. Normalde bu tarz işlemler için hazır kütüphaneler kullanılabilir (Zemberek gibi.) Fakat yaptığım denemelerde kütüphaneler belirli bir düzende ve linux platformda düzgün çalışıyordu bende kendime göre bir önişleme ve temizleme aşaması yarattım.
İşte bu adımların detaylıca açıklaması:
· Özel Karakterlerin Kaldırılması
Metin verilerinde genellikle noktalama işaretleri, parantezler, tireler gibi özel karakterler bulunur. Bu karakterler metin analizinde genellikle gereksizdir ve mannequin performansını olumsuz etkileyebilir. Bu nedenle, özel karakterler genellikle kaldırılır.
cleaned_text = re.sub(r'W', ' ', textual content) # Noktalama işaretlerinin kaldırılması
· Sayıların Kaldırılması
Metin verilerinde sayılar bulunabilir, ancak metin sınıflandırma için genellikle anlamsızdır. Bu nedenle, metin verilerinden sayılar genellikle kaldırılır.
cleaned_text = re.sub(r'd+', ' ', cleaned_text) # Sayıların kaldırılması
· Küçük Harfe Dönüştürme
Metin verilerinin tümünü küçük harflere dönüştürmek, büyük ve küçük harf farklılıklarını ortadan kaldırarak modele daha tutarlı bir şekilde erişmesini sağlar. Örneğin, “Kitap” ve “kitap” kelimeleri aynı kelime olarak kabul edilir.
cleaned_text = cleaned_text.decrease() # Metnin küçük harflere dönüştürülmesi
· Cease Phrases’lerin Kaldırılması
Cease phrases, metinlerde sıklıkla görülen ancak genellikle anlam taşımayan kelimelerdir (örneğin, “ve”, “ama”, “veya” gibi). Bu kelimeler genellikle modelin performansını düşürür ve bu nedenle genellikle kaldırılır.
cleaned_text = ' '.be a part of([word for word in cleaned_text.split() if word not in stop_words]) # Cease phrases'lerin kaldırılması
· Türkçe Kök Bulma İşlemi
Türkçe kök bulma işlemi, kelimelerin köklerini bulmayı amaçlar. Örneğin, “geliyorum”, “geliyorsun”, “geliyorlar” kelimelerinin kökü “gel”dir. Bu işlem, modelin daha genelleştirilmiş ve anlamlı özelliklerle çalışmasını sağlar.
# Türkçe kök bulma işlemi
stemmer = TurkishStemmer()
cleaned_text = ' '.be a part of([stemmer.stemWord(word) for word in cleaned_text.split()])
Bu adımların uygulanması, metin verilerinin temizlenmesini ve modele hazır hale getirilmesini sağlar. Bu sayede, modelin daha iyi performans göstermesi ve doğru sonuçlar üretmesi sağlanır.
# Eğitim verisine temizlenmiş metni ekleyin
training_data[author_name].append((cleaned_text, file_name)) # Dosya ismiyle birlikte metni ekliyoruz
Veri Önişleme ve Temizleme için Türkçe Doğal Dil İşlemenin bir kütüphanesi olan Zemberek kullanmak istedim. Fakat Java ile yazıldığı için ve Home windows Platformlarda çok fazla sorun ile karşılaştığım için Kendimce yöntemler ile bu adımı tamamladım.
TF-IDF (Time period Frequency-Inverse Doc Frequency), metin verilerini sayısal vektörlere dönüştürmek için yaygın olarak kullanılan bir tekniktir. Bu teknik, metin verilerindeki her bir kelimenin önem derecesini belirlemek için kullanılır.
# Mannequin oluşturma
mannequin = Pipeline([
('tfidf', TfidfVectorizer()),
('classifier', SVC())
])
Burada, Pipeline kullanılarak TfidfVectorizer() sınıfı TF-IDF vektörleme işlemi için kullanılmıştır. Bu şekilde, tfidf adı altında vektörleme işlemi, diğer sınıflandırma adımı olan classifier adı altında ise SVC (Destek Vektör Makineleri) sınıflandırma algoritması ile bir boru hattı (pipeline) oluşturulmuştur.
İlk olarak, TF (Time period Frequency) ve IDF (Inverse Doc Frequency) kavramlarını ayrı ayrı açıklayarak başlayalım:
· Time period Frequency (TF — Kelime Sıklığı)
Bir belgedeki bir kelimenin ne kadar sıklıkta geçtiğini gösteren bir metrik. Genellikle, bir belgedeki bir kelimenin sıklığı, o kelimenin belgedeki toplam kelime sayısına oranı olarak hesaplanır. Ancak bazen kelime frekansı doğrudan kelimenin belgedeki toplam sayısını da temsil edebilir. Örneğin, “kitap” kelimesinin bir belgedeki sıklığı, o belgede “kitap” kelimesinin geçtiği toplam sayıdır.
· Inverse Doc Frequency (IDF — Ters Belge Frekansı)
Bir kelimenin belgedeki nadirliğini ölçen bir metrik. IDF, bir kelimenin ne kadar nadir olduğunu belirler. Nadir kelimeler, belgedeki genel içeriği daha iyi temsil edebilir ve bu nedenle daha yüksek bir öneme sahip olabilirler. IDF, bir kelimenin belgedeki tüm belgelerde ne kadar nadir olduğunu hesaplar ve bu nadirlik derecesine göre bir ağırlık verir. Nadir kelimelerin IDF değerleri daha yüksektir.
TF-IDF vektörleme işlemi, TF ve IDF değerlerinin çarpımıyla elde edilir ve bu işlem her bir kelimenin her bir belge için bir özellik vektörü oluşturur. TF-IDF vektörleme adımları şu şekilde gerçekleşir:
· TF-IDF Vektörleme
TF ve IDF değerleri, her bir kelimenin her bir belgedeki önemini belirlemek için çarpılır. Böylece, her bir belge için bir TF-IDF vektörü oluşturulur.
Bu işlem sonucunda, her bir belge TF-IDF vektörlerinin oluşturulmasıyla sayısal bir temsile dönüştürülür. Bu sayısal temsil, metin verilerinin modellemeye uygun hale getirilmesini sağlar ve metin sınıflandırma gibi görevler için kullanılabilir. TF-IDF vektörleme, metin verilerindeki kelime önemini vurgulayarak modelin daha iyi performans göstermesini sağlar.
4. Destek Vektör Makineleri (SVM) Algoritması ile SVC (Help Vector Classifier) Sınıflandırma
Help Vector Machine (Destek Vektör Makineleri diğer adıyla DVM ya da SVM) sınıflandırma, regresyon ve aykırı değerleri bulmak için kullanılan denetimli (superwised) bir öğrenme tekniğidir. SVM algoritması classification kavramı adı altında gelişen ve diğer classification türlerinden farklı olan bir algoritmadır. SVM algoritması bir düzlem üzerine yerleştirilmiş 2 veya daha fazla nokta kümelerini ayırmak için doğrular çizer. 2 veri kümesi düşünüldüğünde bu doğrunun, iki kümenin noktaları için de maksimum uzaklıkta olmasını amaçlar. Karmaşık ama küçük ve orta ölçekteki veri setleri için uygundur.
Görüldüğü üzere iki veri kümesi grafik üzerinde görülmekte ve 3 doğrusal çizgi. Buradaki öncelikli amacımız veri kümelerinin ayıran bir doğru çizmek. Görüldüğü üzere L_1 doğrusu bu iki kümeyi ayırmakta en başarısız olanı. Diğer iki doğruya bakacak olursak L_2 mavi renkli noktaların oluşturduğu kümeye daha yakınken kırmızı veri kümesine daha uzak kalır. Buradaki dengesizlik yeni tahmin edilmesi istenen verinin daha hatalı bir tahminle sonuçlanmasına neden olacaktır. Bundan dolayı algoritma 2 veri kümesindeki birbirlerine en yakın olan verilerin (kırmızı ve mavi verilerin) arasındaki en fazla aralığı yakaladığı doğruyu çizmeyi tercih edecektir. Bu arada sınıflar arası çizilebilecek sonsuz adet doğru vardır ve bu çizilebilecek doğrulara karar doğruları adı verilir.
Bu iki sınıfı en iyi ayıran doğrunun (L_3) bölgeler arasında kalan alana margin denir. Margin ne kadar geniş olursa sınıflar okadar iyi ayrıştırılır. Bazı durumlarda veirler margin bölgesine girebilir. Bu duruma ‘Tender Margin’ denir. Exhausting Margin ise veri doğrusal olarak ayrılabiliyorsa çalışır.
Burada görüldüğü gibi her iki veri kümesine destek vektörleri çizilmiştir. Bu destek vektörleri referans alınarak SVM çizilebilecek en iyi doğruyu çizer (w.x+b=0). SVM lerde sınıflar +1 veya -1 olarak etiketlenir. Bundan dolayı karar doğrusu (hiper düzlem) üstünde kalan doğruya wx+b=1 altında kalan doğruya ise wx+b=-1 olarak yazılır.
Kısaca Özetlemek gerekirse SVM, diğer yöntemlere göre iki temel avantaja sahiptir. Yüksek boyutlu uzaylarda işlem yapabilme yeteneğine sahiptir ve bu, genellikle birçok özelliğin kullanılması durumunda yararlıdır. Ayrıca, aşırı uymaya karşı dayanıklıdır, yani genelleme yeteneği daha iyidir.
Bu kodlamada Destek Vektör Makineleri (SVC) sınıflandırması için aşağıdaki kodlar bulunmaktadır:
· SVM Algoritmasıyla SVC’nin oluşturulması
mannequin = Pipeline([
('tfidf', TfidfVectorizer()),
('classifier', SVC())
])
· En iyi parametrelerin bulunması için GridSearchCV kullanımı ve en iyi modelin seçilmesi
# GridSearchCV ile en iyi parametreleri bulma
param_grid = {
'classifier__C': [0.1, 1, 10, 100],
'classifier__gamma': [1, 0.1, 0.01, 0.001],
'classifier__kernel': ['rbf', 'linear', 'poly', 'sigmoid']
}
grid_search = GridSearchCV(mannequin, param_grid, cv=5)
grid_search.match(X, y)
best_model = grid_search.best_estimator_
# Eğitim ve doğrulama verisi için modeli eğitin
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
best_model.match(X_train, y_train)
# Mannequin performansını değerlendirme
y_pred = best_model.predict(X_val)
print("Sınıflandırma Raporu:")
print(classification_report(y_val, y_pred))
5.Modelin Eğitilmesi ve Değerlendirilmesi
Modelin eğitilmesi ve değerlendirilmesi, makine öğrenimi projelerinde kritik bir aşamadır. Bu aşama, modelin performansının anlaşılmasına ve geliştirilmesine olanak sağlar. İşte bu adımların detaylı bir açıklaması:
· Eğitim Aşaması
Mannequin eğitimi, öncelikle belirlenen algoritmaya ve parametrelere göre gerçekleştirilir. Eğitim veri seti kullanılarak mannequin oluşturulur ve bu mannequin, veri setindeki örüntüleri öğrenir.
Destek Vektör Makineleri (SVM) gibi algoritmalar için, eğitim aşamasında hiperdüzlem belirlenir ve modelin parametreleri ayarlanır.
# Eğitim ve doğrulama verisi için modeli eğitin
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
best_model.match(X_train, y_train)
· Doğrulama Aşaması
Mannequin oluşturulduktan sonra, genellikle ayrılmış olan doğrulama veri seti kullanılarak modelin performansı değerlendirilir. Bu aşamada, modelin ne kadar iyi genelleştirildiği ve yeni veri noktaları üzerinde ne kadar başarılı olduğu ölçülür.
Doğrulama veri seti üzerinde modelin performansını değerlendirmek için çeşitli metrikler kullanılabilir. Bunlar arasında doğruluk, hassasiyet, geri çağırma ve F1-score gibi değerler bulunur.
# Mannequin performansını değerlendirme
y_pred = best_model.predict(X_val)
print("Sınıflandırma Raporu:")
print(classification_report(y_val, y_pred))
· Take a look at Aşaması
Modelin eğitim ve doğrulama aşamalarını tamamladıktan sonra, genellikle ayrılmış olan check veri seti kullanılarak modelin performansı kesin olarak değerlendirilir.
Take a look at veri seti, genellikle modelin daha önce görmediği verilerden oluşur ve modelin gerçek dünya performansını yansıtır.
Modelin check veri seti üzerindeki performansı, eğitim ve doğrulama aşamalarında elde edilen sonuçlarla karşılaştırılarak değerlendirilir.
# Take a look at verisindeki her bir yazar için
for author_folder in os.listdir(test_data_folder):
if os.path.isdir(os.path.be a part of(test_data_folder, author_folder)):
author_name = author_folder
# Yazar klasöründeki her bir dosya için
for file_name in os.listdir(os.path.be a part of(test_data_folder, author_folder)):
file_path = os.path.be a part of(test_data_folder, author_folder, file_name)
with open(file_path, "r", encoding="utf-8") as file:
textual content = file.learn()
# Metni temizleme ve kök bulma işlemleri
cleaned_text = re.sub(r'W', ' ', textual content)
cleaned_text = re.sub(r'd+', ' ', cleaned_text)
cleaned_text = cleaned_text.decrease()
cleaned_text = ' '.be a part of([word for word in cleaned_text.split() if word not in stop_words])
stemmer = TurkishStemmer()
cleaned_text = ' '.be a part of([stemmer.stemWord(word) for word in cleaned_text.split()])
# Gerçek yazarı kaydet
true_values.append(author_name)
# Mannequin ile tahmin yapma
prediction = best_model.predict([cleaned_text])[0]
predicted_values.append(prediction)
# Dosya ismi ve tahmin edilen yazarı terminalde gösterme
print("Dosya:", file_name, "- Gerçek Yazar:", author_name, "- Tahmin Edilen Yazar:", prediction)
· Performans Değerlendirme
Modelin performansı, doğrulama ve check aşamalarında elde edilen sonuçlar kullanılarak değerlendirilir.
Doğruluk, hassasiyet, geri çağırma, F1-score gibi metriklerin yanı sıra ROC eğrisi, confusion matrix gibi görsel araçlar da kullanılarak modelin performansı analiz edilir.
Bu analiz sonucunda, modelin hangi sınıflarda daha iyi veya daha kötü performans gösterdiği belirlenir ve gerektiğinde modelin iyileştirilmesi için önlemler alınır.
Modelin eğitilmesi ve değerlendirilmesi aşamaları, makine öğrenimi projelerinde modelin başarısını belirlemek için kritik öneme sahiptir. Bu aşamaların titizlikle yürütülmesi, projenin başarısını ve modelin gerçek dünya performansını doğrudan etkiler.
# Confusion matrix hesaplama
conf_matrix = confusion_matrix(true_values, predicted_values)
# Confusion matrixi görselleştirme
plt.determine(figsize=(10, 8))
sns.heatmap(conf_matrix, annot=True, cmap="Blues", fmt="d")
plt.xlabel('Tahmin Edilen')
plt.ylabel('Gerçek Değer')
plt.title('5x5 Confusion Matrix')
plt.present()
# Confusion matrixin terminalden çıktı olarak verilmesi
print("5x5 Confusion Matrix:")
print(conf_matrix)
Yaptığımız Take a look at Aşamasından sonra aşağıdaki şekilde bir Confusion matrisi elde ediyoruz. Bunu Yorumlamamız gerekirse:
Normalde Her yazara ait 4’er köşe yazımız vardı yani bizim mükemmel sonuç diyebileceğimiz sonuç şöyle bir şey olmadıydı:
Fakat burada görüldüğü üzere modelimiz %75’lik bir doğru tahmin yaparak 20 köşe yazısın 15’in yazarını doğru tahmin etmiştir.
Burada Yazar1’e dikkatlice bakarsak bütün yazarların bir yazısını Modelimiz Yazar1 olarak tahmin etmiş bunun aslında bir nedeni var bunlar yukarda Veri oluşturma bölümünde bahsettiğim sorundan kaynaklanıyor. Çoğu yazar kendi yazısında başka yazarlardan alıntı yaparak yazı yazıyor bu da tahminde yanılma gibi sorunlara yol açıyor. Manuel olarak bu sorunu çok basit bir şekilde çözebilirdik aslında fakat hem Veriyi elle bozmamak adına hem de Mannequin eğitirken Manuel müdahale etmek istemediğim için Sonuca müdahale etmedim.
Zaten Terminal çıktısındada hangi yazısının doğru tahmin edilip hangisinin yanlış tahmin edildiğini gözlemleyebiliyoruz.
Terminal çıktısında sınıflandırma modelinin performansını değerlendirmek için bir çıktı alıyoruz. Bu çıktıda, her bir sınıf için “precision”, “recall” ve “f1-score” olmak üzere üç ana ölçümü içerir. Ayrıca, modelin genel performansını görmek için “accuracy” (doğruluk) ölçümü de sağlanmıştır.
Rapordaki temel terimlerin açıklamaları
Precision (Kesinlik): Bir sınıfa ait tahmin edilen örneklerin ne kadarının gerçekten o sınıfa ait olduğunu gösterir. Kesinlik, yanlış pozitiflerin (yanlış alarm) oranını ölçer. Yüksek kesinlik değeri, modelin o sınıfı doğru bir şekilde tanımlama yeteneğini gösterir. Formülü: TP / (TP + FP), TP = True Constructive (Gerçek pozitif), FP = False Constructive (Yanlış pozitif).
Recall (Duyarlılık): Bir sınıfa ait tüm gerçek örneklerin ne kadarının doğru bir şekilde tahmin edildiğini gösterir. Recall, yanlış negatiflerin (kaçırılanlar) oranını ölçer. Yüksek recall değeri, modelin o sınıfı kaçırmadan ne kadar iyi tanıdığını gösterir. Formülü: TP / (TP + FN), FN = False Unfavorable (Yanlış negatif).
F1-score: Precision ve recall’in harmonik ortalamasıdır. F1-score, hem kesinlik hem de duyarlılığın bir dengeyi temsil ettiği bir ölçüdür. Dengesiz veri kümelerinde, sınıflandırma performansını daha doğru bir şekilde değerlendirmek için kullanılır.
Help (Destek): Her bir sınıfa ait gerçek örneklerin sayısını temsil eder.
Accuracy (Doğruluk): Modelin doğru tahmin ettiği toplam örneklerin oranını gösterir. Tüm sınıfların doğru tahmin edilme oranını gösterir. Ancak, dengesiz veri kümelerinde yanıltıcı olabilir.
Macro Avg (Makro Ortalama): Her sınıf için ölçülen metriklerin aritmetik ortalamasıdır. Tüm sınıflara eşit ağırlık verir.
Weighted Avg (Ağırlıklı Ortalama): Her sınıfın destek (help) değerine göre ağırlıklandırılmış metriklerin ortalamasıdır. Bu, dengesiz veri kümelerinde daha güvenilir bir performans ölçüsü sağlar.
***Bu rapora göre, modelin “yazar1” ve “yazar5” sınıflarını tanıma yeteneği diğerlerine göre daha düşüktür. “Yazar5” sınıfında özellikle düşük precision dikkat çekmektedir, yani mannequin “yazar5” olarak etiketlediği örneklerin büyük bir kısmı yanlış alarm olabilir. Öte yandan, “yazar2” ve “yazar3” sınıflarını tanıma yeteneği oldukça yüksektir. Ancak, tüm sınıfların doğruluk oranı %80‘dir, bu da modelin genel olarak iyi performans gösterdiğini gösterir.
Eğitim verileri temizlenmiş ve kök bulma işlemleri uygulanmıştır. Mannequin, GridSearchCV ile en iyi parametrelerin bulunmasıyla oluşturulmuştur. Son olarak, mannequin check verisi üzerinde değerlendirilmiştir ve başarı metrikleri kullanılarak performansı değerlendirilmiştir.
Projede elde edilen sonuçlar oldukça başarılıdır. Mannequin, check verisi üzerinde %80 civarında bir doğruluk elde etmiştir. Confusion matrisi ve sınıflandırma raporu ile modelin performansı detaylı bir şekilde incelenmiştir. Proje, Türkçe köşe yazarlarının metinlerini sınıflandırmak için etkili bir çözüm sunmuştur.
Kaynaklar
https://github.com/firatkaanbitmez/veri-madenciligi
https://mfatihto.medium.com/support-vector-machine-algoritması-makine-öğrenmesi-8020176898d8