Takip et

Çoklu Sınıf Veri Kümelerini İkiliye Dönüştürme: Makine Öğrenimi İçin Yöntemler ve Uygulamalar

Çoklu Sınıf Veri Kümelerini İkiliye Dönüştürme: Makine Öğrenimi İçin Yöntemler ve Uygulamalar Giriş Makine öğrenimi projelerinde kar

Çoklu Sınıf Veri Kümelerini İkiliye Dönüştürme: Makine Öğrenimi İçin Yöntemler ve Uygulamalar

Giriş

Makine öğrenimi projelerinde karşılaşılan veri kümeleri, tahmin etmeye çalıştığımız hedef değişkene (etiket) bağlı olarak farklı yapılandırmalara sahip olabilir. Bu yapılandırmalardan ikisi, ikili (binary) ve çoklu sınıf (multiclass) sınıflandırma problemleridir. İkili sınıflandırma, bir veriyi iki olası sınıftan birine atama görevidir; örneğin, bir e-postanın spam olup olmadığı, bir hastanın belirli bir hastalığa sahip olup olmadığı gibi. Çoklu sınıf sınıflandırma ise, bir veriyi ikiden fazla olası sınıftan birine atama görevidir; örneğin, bir hayvanın kedi, köpek, kuş veya balık olup olmadığı, el yazısı rakamların 0’dan 9’a kadar hangi rakamı temsil ettiği gibi.

Çoğu makine öğrenimi algoritması doğal olarak çoklu sınıf problemlerini çözebilirken, bazı durumlarda çoklu sınıf bir veri kümesini ikili bir yapıya dönüştürme ihtiyacı doğabilir. Bu makale, çoklu sınıf veri kümelerini ikiliye dönüştürmenin nedenlerini, temel yöntemlerini ve bu dönüşümün pratik uygulamalarını derinlemesine inceleyecektir. Dönüştürme stratejileri, algoritmik kısıtlamalardan, performans optimizasyonundan, model yorumlanabilirliğinden ve özel iş gereksinimlerinden kaynaklanabilir.

Neden Çoklu Sınıf Veri Kümelerini İkiliye Dönüştürmeliyiz?

Çoklu sınıf bir problemi ikili sınıflandırma problemine dönüştürmek ilk başta gereksiz görünebilir, ancak bu yaklaşımın arkasında yatan sağlam nedenler vardır:

Algoritma Kısıtlamaları

Bazı makine öğrenimi algoritmaları doğaları gereği sadece ikili sınıflandırma için tasarlanmıştır. Örneğin, orijinal Destek Vektör Makineleri (SVM) ve Lojistik Regresyon modelleri temel olarak ikili sınıflandırma için geliştirilmiştir. Bu algoritmaları çoklu sınıf problemlerinde kullanabilmek için, genellikle “tek-e-karşı-tüm” (One-vs-Rest) veya “tek-e-karşı-tek” (One-vs-One) gibi stratejilerle ikili sınıflandırıcılara bölünmeleri gerekir.

Model Karmaşıklığını Azaltma

Çok fazla sınıf içeren çoklu sınıf modelleri, özellikle karmaşık karar sınırlarına sahipse, daha karmaşık ve hesaplama açısından daha pahalı olabilir. Çoklu sınıf problemine yaklaşımı ikili alt problemlere bölmek, her bir alt problemi daha basit bir modelle çözmeye olanak tanır. Bu, eğitim süresini kısaltabilir ve modelin genellenebilirliğini artırabilir.

Performans Optimizasyonu

Bazı durumlarda, belirli bir sınıfın diğer tüm sınıflara karşı ayrıştırılması, genel bir çoklu sınıflandırıcının tüm sınıfları aynı anda doğru bir şekilde sınıflandırmasından daha iyi performans gösterebilir. Özellikle bir veya iki sınıfın kritik öneme sahip olduğu durumlarda, bu sınıflar için özel ikili sınıflandırıcılar oluşturmak, daha yüksek hassasiyet (precision) veya hatırlama (recall) değerleri sağlayabilir.

Yorumlanabilirlik

İkili sınıflandırıcılar genellikle çoklu sınıflandırıcılardan daha kolay yorumlanabilir. “Bu, X sınıfı mı, değil mi?” sorusu, “Bu, X, Y, Z veya W sınıflarından hangisi?” sorusundan genellikle daha net bir cevaba ve daha basit bir model yapısına sahiptir. Bu, özellikle iş paydaşlarına model kararlarını açıklarken veya modelin neden belirli bir tahmini yaptığını anlamaya çalışırken faydalıdır.

Özel İş Problemi Çerçevesi

Bazen iş problemi doğası gereği ikilidir, ancak veri kümesi çoklu sınıf etiketleri içerir. Örneğin, bir şirketin ana endişesi “müşteri kaybı (churn)” olup olmadığını tahmin etmek olabilir. Veri kümesi “yüksek riskli müşteri”, “orta riskli müşteri”, “düşük riskli müşteri” gibi etiketler içerse bile, iş problemine odaklanmak için “yüksek riskli müşteri” ile “diğer tüm müşteriler” arasında ikili bir ayrım yapmak gerekebilir.

Çoklu Sınıf Veri Kümelerini İkiliye Dönüştürme Yöntemleri

Çoklu sınıf bir veri kümesini ikiliye dönüştürmek için çeşitli stratejiler mevcuttur. Her bir yöntemin kendine özgü avantajları ve dezavantajları vardır ve doğru seçimi yapmak probleminizin doğasına, veri kümenizin özelliklerine ve kullanmayı düşündüğünüz algoritmalara bağlıdır.

1. Tek-e-Karşı-Tüm (One-vs-Rest / OvR veya One-vs-All / OvA)

Tek-e-Karşı-Tüm (OvR) stratejisi, çoklu sınıf sınıflandırmayı çözmek için en yaygın ve sezgisel yaklaşımlardan biridir.

Nasıl Çalışır?

OvR stratejisinde, her bir sınıf için ayrı bir ikili sınıflandırıcı eğitilir. Eğer $C$ adet sınıfımız varsa (örneğin, Sınıf A, Sınıf B, Sınıf C), $C$ adet ikili sınıflandırıcı eğitiriz:
* Sınıflandırıcı 1: Sınıf A’yı diğer tüm sınıflardan (B ve C) ayırır. Hedef değişken: 1 eğer Sınıf A ise, 0 eğer Sınıf B veya C ise.
* Sınıflandırıcı 2: Sınıf B’yi diğer tüm sınıflardan (A ve C) ayırır. Hedef değişken: 1 eğer Sınıf B ise, 0 eğer Sınıf A veya C ise.
* Sınıflandırıcı 3: Sınıf C’yi diğer tüm sınıflardan (A ve B) ayırır. Hedef değişken: 1 eğer Sınıf C ise, 0 eğer Sınıf A veya B ise.

Yeni bir veri örneği geldiğinde, bu $C$ adet sınıflandırıcının her biri örneği sınıflandırmaya çalışır ve bir olasılık veya karar skoru üretir. En yüksek olasılık veya skoru veren sınıflandırıcı, örneğin nihai sınıfı olarak seçilir.

Avantajları

* Basitlik ve Sezgisellik: Uygulaması ve anlaması kolaydır.
* Herhangi Bir İkili Sınıflandırıcı Kullanımı: Temel ikili sınıflandırıcı olarak Lojistik Regresyon, SVM, Karar Ağaçları gibi herhangi bir algoritmayı kullanabilir.
* Modülerlik: Her sınıflandırıcı bağımsız olarak eğitilir.
* Sınıf Dengesizliği Yönetimi: Her bir ikili problemde sınıf dengesizliği farklı olabileceğinden, her bir sınıflandırıcı için ayrı ayrı sınıf ağırlıkları veya örnekleme teknikleri uygulanabilir.

Dezavantajları

* Çakışan Tahminler: Bazı durumlarda, birden fazla sınıflandırıcı yüksek güvenle aynı örneği pozitif olarak etiketleyebilir veya tüm sınıflandırıcılar düşük güvenle negatif olarak etiketleyebilir. Bu durumda, en yüksek skora sahip olanı seçmek genellikle en iyi yaklaşımdır.
* Hesaplama Maliyeti: Sınıf sayısı ($C$) arttıkça, eğitilmesi gereken sınıflandırıcı sayısı da artar. Ancak her bir sınıflandırıcı tüm veri kümesi üzerinde eğitilir.

Uygulama Örneği (Python / Scikit-learn)
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

Veri setini yükle

iris = load_iris() X, y = iris.data, iris.target

Eğitim ve test setlerine ayır

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Temel ikili sınıflandırıcıyı tanımla

Burada LogisticRegression kullanıyoruz, ancak başka bir ikili sınıflandırıcı da olabilir.

base_classifier = LogisticRegression(solver='liblinear', max_iter=200)

OneVsRestClassifier'ı kullan

ovr_classifier = OneVsRestClassifier(base_classifier)

Modeli eğit

ovr_classifier.fit(X_train, y_train)

Tahmin yap

y_pred = ovr_classifier.predict(X_test)

Performansı değerlendir

accuracy = accuracy_score(y_test, y_pred) print(f"One-vs-Rest Sınıflandırıcının Doğruluk Oranı: {accuracy:.4f}")

Her bir sınıf için eğitilen temel sınıflandırıcıları inceleyebiliriz

print(len(ovr_classifier.estimators_)) # 3 sınıf için 3 temel sınıflandırıcı

2. Tek-e-Karşı-Tek (One-vs-One / OvO)

Tek-e-Karşı-Tek (OvO) stratejisi, özellikle sınıf sayısı yüksek olduğunda veya sınıflar arasındaki karar sınırları karmaşık olduğunda kullanışlıdır.

Nasıl Çalışır?

OvO stratejisinde, her bir sınıf çifti için ayrı bir ikili sınıflandırıcı eğitilir. Eğer $C$ adet sınıfımız varsa, $C * (C – 1) / 2$ adet ikili sınıflandırıcı eğitilir. Örneğin, 3 sınıf için (A, B, C):
* Sınıflandırıcı 1: Sadece A ve B sınıflarına ait örnekler üzerinde eğitilir ve A ile B’yi ayırır.
* Sınıflandırıcı 2: Sadece A ve C sınıflarına ait örnekler üzerinde eğitilir ve A ile C’yi ayırır.
* Sınıflandırıcı 3: Sadece B ve C sınıflarına ait örnekler üzerinde eğitilir ve B ile C’yi ayırır.

Yeni bir veri örneği geldiğinde, tüm bu ikili sınıflandırıcılar örneği sınıflandırmaya çalışır. Her bir sınıflandırıcı, örneğin ait olduğunu düşündüğü sınıfa bir “oy” verir. En çok oyu alan sınıf, örneğin nihai sınıfı olarak seçilir (çoğunluk oylaması).

Avantajları

* Daha Küçük Veri Kümeleri Üzerinde Eğitim: Her bir sınıflandırıcı, tüm veri kümesi yerine sadece ilgili iki sınıfa ait örnekler üzerinde eğitilir. Bu, özellikle veri kümesi çok büyükse veya sınıfların çoğu birbiriyle ilgisizse faydalı olabilir.
* Karmaşık Karar Sınırları: Her bir ikili sınıflandırıcı, belirli iki sınıf arasındaki karmaşık karar sınırlarını daha iyi modelleyebilir.
* SVM İçin Uygunluk: Destek Vektör Makineleri (SVM) gibi bazı algoritmalar OvO stratejisinde daha iyi performans gösterme eğilimindedir.

Dezavantajları

* Yüksek Hesaplama Maliyeti: Sınıf sayısı ($C$) arttıkça, eğitilmesi gereken sınıflandırıcı sayısı $C^2$ ile orantılı olarak artar. Bu, çok sayıda sınıfa sahip veri kümeleri için önemli bir dezavantaj olabilir.
* Karmaşık Oylama Mekanizması: Tahmin aşamasında, tüm sınıflandırıcıların oylarının toplanması ve en çok oyu alan sınıfın belirlenmesi gerekir.

Uygulama Örneği (Python / Scikit-learn)
from sklearn.datasets import load_iris
from sklearn.svm import SVC # SVM genellikle OvO ile iyi çalışır
from sklearn.multiclass import OneVsOneClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

Veri setini yükle

iris = load_iris() X, y = iris.data, iris.target

Eğitim ve test setlerine ayır

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Temel ikili sınıflandırıcıyı tanımla (örneğin SVC)

base_classifier = SVC(kernel='linear', probability=True, random_state=42)

OneVsOneClassifier'ı kullan

ovo_classifier = OneVsOneClassifier(base_classifier)

Modeli eğit

ovo_classifier.fit(X_train, y_train)

Tahmin yap

y_pred = ovo_classifier.predict(X_test)

Performansı değerlendir

accuracy = accuracy_score(y_test, y_pred) print(f"One-vs-One Sınıflandırıcının Doğruluk Oranı: {accuracy:.4f}")

Kaç adet temel sınıflandırıcı eğitildiğini görebiliriz

print(len(ovo_classifier.estimators_)) # 3 sınıf için 3 temel sınıflandırıcı (3 * 2 / 2)

3. Hiyerarşik Sınıflandırma (Hierarchical Classification)

Hiyerarşik sınıflandırma, özellikle sınıflar arasında doğal bir hiyerarşi veya yapı olduğunda kullanışlıdır. Bu yaklaşım, çoklu sınıf problemini bir dizi ikili veya daha küçük çoklu sınıf problemine bölerek bir “karar ağacı” oluşturur.

Nasıl Çalışır?

Bu yöntemde, önce en genel ayrımı yapmak için bir ikili sınıflandırıcı eğitilir. Örneğin, “Hayvanlar” veri kümesinde önce “Memeli mi değil mi?” diye sorulur. Eğer “Memeli” ise, bir sonraki ikili sınıflandırıcı “Etçil mi Otçul mu?” diye sorabilir. Bu şekilde, bir hiyerarşi veya ağaç yapısı içinde ardışık ikili kararlar alınarak nihai sınıfa ulaşılır.

Avantajları

* Verimlilik: Eğer hiyerarşi iyi tanımlanmışsa, her adımda sadece ilgili örnekler ve özellikler üzerinde çalışıldığı için oldukça verimli olabilir.
* Alan Bilgisi Entegrasyonu: Alan uzmanlığının doğrudan model yapısına entegre edilmesini sağlar.
* Yorumlanabilirlik: Karar süreci, ağaç yapısı nedeniyle oldukça şeffaf ve yorumlanabilir olabilir.

Dezavantajları

* Hata Yayılımı: Hiyerarşinin üst seviyelerindeki hatalar, alt seviyelere doğru yayılabilir ve nihai sınıflandırma üzerinde olumsuz etki yaratabilir.
* Hiyerarşi Tanımlama: Doğru ve etkili bir hiyerarşi oluşturmak için derin alan bilgisi ve dikkatli tasarım gerektirir. Her veri kümesi için doğal bir hiyerarşi bulunmayabilir.
* Uygulama Karmaşıklığı: Genel OvR veya OvO sarmalayıcıları kadar kolay uygulanmaz; özel bir yapılandırma ve kodlama gerektirebilir.

Uygulama Örneği

Bu yöntem için Scikit-learn’de doğrudan bir sarmalayıcı (wrapper) yoktur, ancak özel bir fonksiyon veya sınıflandırma boru hattı (pipeline) oluşturularak uygulanabilir.

# Örnek bir hiyerarşik sınıflandırma yapısı (pseudocode)

Sınıflar: Kedi, Köpek, Kuş, Balık

Hiyerarşi:

Seviye 1: Memeli mi? (Kedi, Köpek) vs (Kuş, Balık)

Seviye 2a (Memeli ise): Kedi mi? vs Köpek mi?

Seviye 2b (Memeli değilse): Kuş mu? vs Balık mı?

import numpy as np

from sklearn.tree import DecisionTreeClassifier

from sklearn.model_selection import train_test_split

def hierarchical_classifier(X, y):

# Örnek veri ve etiketler (gerçek bir veri seti yerine sembolik)

# y_labels = ['Kedi', 'Köpek', 'Kuş', 'Balık']

# y_numeric = [0, 1, 2, 3]

# # Seviye 1: Memeli mi? (0, 1) vs (2, 3)

y_level1 = np.where(y < 2, 0, 1) # 0: Memeli, 1: Memeli değil

model1 = DecisionTreeClassifier(random_state=42)

model1.fit(X, y_level1)

# # Seviye 2a: Memeli ise (Kedi vs Köpek)

X_mammal = X[y_level1 == 0]

y_mammal = y[y_level1 == 0]

y_level2a = np.where(y_mammal == 0, 0, 1) # 0: Kedi, 1: Köpek

model2a = DecisionTreeClassifier(random_state=42)

model2a.fit(X_mammal, y_level2a)

# # Seviye 2b: Memeli değilse (Kuş vs Balık)

X_non_mammal = X[y_level1 == 1]

y_non_mammal = y[y_level1 == 1]

y_level2b = np.where(y_non_mammal == 2, 0, 1) # 0: Kuş, 1: Balık

model2b = DecisionTreeClassifier(random_state=42)

model2b.fit(X_non_mammal, y_level2b)

# # Tahmin fonksiyonu

def predict(X_new):

level1_pred = model1.predict(X_new)

final_preds = []

for i, pred1 in enumerate(level1_pred):

if pred1 == 0: # Memeli

pred2a = model2a.predict(X_new[i:i+1])

final_preds.append(0 if pred2a == 0 else 1) # Kedi veya Köpek

else: # Memeli değil

pred2b = model2b.predict(X_new[i:i+1])

final_preds.append(2 if pred2b == 0 else 3) # Kuş veya Balık

return np.array(final_preds)

# return predict

4. Özel İkili Bölme / Sınıf Gruplama (Custom Binary Split / Class Grouping)

Bu yöntem, belirli bir sınıfın veya sınıf grubunun özel bir ilgi alanı olduğu ve diğer tüm sınıfların “diğer” veya “negatif” olarak gruplandırılabileceği durumlarda kullanılır.

Nasıl Çalışır?

Bu yaklaşım, çoklu sınıf etiketlerini doğrudan manipüle ederek yeni bir ikili hedef değişken oluşturmayı içerir.
Örneğin, 5 sınıfınız varsa (Sınıf A, B, C, D, E) ve sadece Sınıf A’nın varlığını veya yokluğunu tahmin etmek istiyorsanız:
* Yeni hedef değişken: 1 eğer orijinal etiket Sınıf A ise, 0 eğer orijinal etiket B, C, D veya E ise.

Başka bir senaryoda, Sınıf A ve B’nin birlikte bir “pozitif” kategori oluşturduğunu, C, D, E’nin ise “negatif” kategori olduğunu varsayalım:
* Yeni hedef değişken: 1 eğer orijinal etiket A veya B ise, 0 eğer orijinal etiket C, D veya E ise.

Bu dönüşüm, genellikle alan uzmanlığına ve iş gereksinimlerine dayanır.

Avantajları

* Doğrudan İş Problemi Çözümü: Özellikle bir sınıfın (veya sınıf grubunun) diğerlerinden ayrılmasının iş açısından kritik olduğu durumlarda çok etkilidir.
* Model Basitliği: Sadece bir ikili sınıflandırıcı eğitildiği için en basit model yapılarından birini sunar.
* Kaynak Verimliliği: En az hesaplama kaynağı gerektiren yöntemlerden biridir.

Dezavantajları

* Bilgi Kaybı: Gruplanan sınıflar arasındaki ayrımı tamamen göz ardı eder. Bu, gelecekteki analizler veya daha detaylı sınıflandırma ihtiyaçları için bilgi kaybına yol açabilir.
* Önyargı Riski: Gruplama keyfi veya yanlış yapılırsa, modelin performansı ve genellenebilirliği olumsuz etkilenebilir.

Uygulama Örneği (Python / Scikit-learn)
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

Veri setini yükle

iris = load_iris() X, y = iris.data, iris.target # y: 0, 1, 2

Diyelim ki sadece sınıf 0'ı (setosa) diğerlerinden ayırmak istiyoruz.

Yeni ikili hedef değişkeni oluştur: 1 eğer sınıf 0 ise, 0 diğer sınıflar için.

y_binary_target_0 = (y == 0).astype(int)

Eğitim ve test setlerine ayır

X_train, X_test, y_train_binary_0, y_test_binary_0 = train_test_split(X, y_binary_target_0, test_size=0.3, random_state=42)

İkili sınıflandırıcıyı eğit

binary_classifier_0 = LogisticRegression(solver='liblinear', random_state=42) binary_classifier_0.fit(X_train, y_train_binary_0)

Tahmin yap

y_pred_binary_0 = binary_classifier_0.predict(X_test)

Performansı değerlendir

accuracy_0 = accuracy_score(y_test_binary_0, y_pred_binary_0) print(f"Sınıf 0'ı diğerlerinden ayıran ikili sınıflandırıcının Doğruluk Oranı: {accuracy_0:.4f}") print("\nSınıflandırma Raporu (Sınıf 0 vs Diğerleri):") print(classification_report(y_test_binary_0, y_pred_binary_0))

Diyelim ki sınıf 0 ve 1'i "grup A", sınıf 2'yi "grup B" olarak ayırmak istiyoruz.

y_binary_group = np.where(y < 2, 0, 1) # 0: Sınıf 0 veya 1, 1: Sınıf 2

Eğitim ve test setlerine ayır

X_train, X_test, y_train_binary_group, y_test_binary_group = train_test_split(X, y_binary_group, test_size=0.3, random_state=42)

İkili sınıflandırıcıyı eğit

binary_classifier_group = LogisticRegression(solver='liblinear', random_state=42) binary_classifier_group.fit(X_train, y_train_binary_group)

Tahmin yap

y_pred_binary_group = binary_classifier_group.predict(X_test)

Performansı değerlendir

accuracy_group = accuracy_score(y_test_binary_group, y_pred_binary_group) print(f"\nSınıf 0&1'i Sınıf 2'den ayıran ikili sınıflandırıcının Doğruluk Oranı: {accuracy_group:.4f}") print("\nSınıflandırma Raporu (Sınıf 0&1 vs Sınıf 2):") print(classification_report(y_test_binary_group, y_pred_binary_group))

5. Çoklu Sınıf Olasılığı Üzerinden Eşikleme (Thresholding on Multiclass Probability)

Bu yöntem, aslında bir dönüşümden ziyade, mevcut bir çoklu sınıf modelinin çıktısını ikili bir karara dönüştürme şeklidir.

Nasıl Çalışır?

Öncelikle, normal bir çoklu sınıf sınıflandırma modeli eğitilir. Bu model, her bir sınıf için bir olasılık (veya güven skoru) çıktısı verebilir (predict_proba metodu). Daha sonra, belirli bir hedef sınıf için bu olasılık değerleri alınır ve bir eşik değeri belirlenir. Eğer hedef sınıfın olasılığı belirlenen eşiği aşarsa, örnek o hedef sınıfa ait olarak kabul edilir (1); aksi takdirde, diğer sınıflara ait olarak kabul edilir (0).

Avantajları

* Mevcut Modelleri Kullanma: Yeni bir model eğitmek yerine, mevcut çoklu sınıf modelini kullanır.
* Esneklik: Eşik değeri, performans gereksinimlerine (örneğin, daha yüksek hatırlama veya hassasiyet) göre ayarlanabilir.
* Basit Uygulama: Mevcut modelin predict_proba çıktısı üzerinde basit bir eşik kontrolü yeterlidir.

Dezavantajları

* Temel Modelin Sınırlamaları: İkili kararın kalitesi, temel çoklu sınıf modelinin performansına bağlıdır.
* Eşik Seçimi: Optimal eşik değerini bulmak, ayrı bir optimizasyon problemi olabilir ve genellikle bir validasyon seti üzerinde gerçekleştirilir.

Uygulama Örneği (Python / Scikit-learn)
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

Veri setini yükle

iris = load_iris() X, y = iris.data, iris.target

Eğitim ve test setlerine ayır

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Çoklu sınıf sınıflandırıcıyı eğit

multiclass_classifier = LogisticRegression(solver='liblinear', max_iter=200, random_state=42) multiclass_classifier.fit(X_train, y_train)

Tahmin olasılıklarını al

y_proba = multiclass_classifier.predict_proba(X_test)

Diyelim ki sınıf 1'i (versicolor) hedef olarak belirledik (iris.target_names[1])

target_class_index = 1 threshold = 0.5 # Eşik değeri

İkili tahminler oluştur

Eğer sınıf 1'in olasılığı eşiğin üzerindeyse 1, değilse 0

y_pred_binary_from_proba = (y_proba[:, target_class_index] > threshold).astype(int)

Gerçek ikili etiketleri oluştur (sınıf 1 mi, değil mi?)

y_true_binary = (y_test == target_class_index).astype(int)

Performansı değerlendir

accuracy = accuracy_score(y_true_binary, y_pred_binary_from_proba) precision = precision_score(y_true_binary, y_pred_binary_from_proba) recall = recall_score(y_true_binary, y_pred_binary_from_proba) f1 = f1_score(y_true_binary, y_pred_binary_from_proba) print(f"Sınıf {target_class_index} için olasılık eşikleme ile ikili sınıflandırma:") print(f"Doğruluk: {accuracy:.4f}") print(f"Hassasiyet (Precision): {precision:.4f}") print(f"Hatırlama (Recall): {recall:.4f}") print(f"F1 Skoru: {f1:.4f}")

Dikkat Edilmesi Gerekenler ve En İyi Uygulamalar

Çoklu sınıf veri kümelerini ikiliye dönüştürürken göz önünde bulundurmanız gereken bazı önemli noktalar ve en iyi uygulamalar şunlardır:

Sınıf Dengesizliği

Özellikle OvR veya özel ikili bölme yöntemlerinde, bir sınıfın diğer tüm sınıflara karşı çok daha az örneğe sahip olması yaygın bir durumdur. Bu, ikili sınıflandırıcıların dengesiz veri üzerinde eğitilmesine yol açabilir. Bu durumu yönetmek için şunlar yapılabilir:
* Sınıf Ağırlıkları (Class Weights): Çoğu Scikit-learn sınıflandırıcısında class_weight='balanced' parametresi veya manuel ağırlıklar kullanılabilir.
* Örnekleme Teknikleri: Aşırı örnekleme (oversampling) yöntemleri (SMOTE gibi) veya eksik örnekleme (undersampling) yöntemleri uygulanabilir.
* Farklı Metrikler: Sadece doğruluk yerine, F1 skoru, hassasiyet, hatırlama veya ROC-AUC gibi dengesiz veri kümeleri için daha uygun metrikler kullanılmalıdır.

Temel Sınıflandırıcının Seçimi

Dönüşüm yönteminin başarısı büyük ölçüde temel ikili sınıflandırıcının performansına bağlıdır. Probleminizin özelliklerine ve veri kümenizin yapısına en uygun algoritmayı seçmek önemlidir. Örneğin, doğrusal olmayan karar sınırları için çekirdek tabanlı SVM’ler veya ağaç tabanlı modeller daha iyi olabilir.

Değerlendirme Metrikleri

* OvR ve OvO için: Genel performans, genellikle makro ortalama (macro-average) veya mikro ortalama (micro-average) F1 skoru, hassasiyet ve hatırlama gibi çoklu sınıf metrikleri kullanılarak değerlendirilir.
* Mikro Ortalama: Tüm bireysel ikili sınıflandırıcıların TP, FP, FN değerlerini toplayıp genel metrikleri hesaplar. Büyük sınıfların etkisini vurgular.
* Makro Ortalama: Her bir sınıf için metrikleri ayrı ayrı hesaplar ve sonra bunların ortalamasını alır. Sınıf dengesizliğinden daha az etkilenir, küçük sınıfların performansını daha iyi yansıtır.
* Özel İkili Bölme ve Eşikleme için: Standart ikili sınıflandırma metrikleri (doğruluk, hassasiyet, hatırlama, F1 skoru, ROC-AUC) doğrudan kullanılabilir.

Hesaplama Maliyeti

Sınıf sayısı arttıkça, OvO stratejisinin hesaplama maliyeti önemli ölçüde artar. Çok sayıda sınıfa sahip veri kümelerinde OvR genellikle daha uygun bir seçenektir. Hiyerarşik sınıflandırma, iyi tasarlanmışsa verimli olabilir.

Yorumlanabilirlik

OvR stratejisi, her bir sınıflandırıcının belirli bir sınıfı diğerlerinden ayırmaya odaklanması nedeniyle genellikle OvO’dan daha yorumlanabilir kabul edilir. Özel ikili bölme de iş kararlarına doğrudan bağlı olduğu için yüksek yorumlanabilirlik sunar.

Alan Bilgisi

Özellikle hiyerarşik sınıflandırma ve özel ikili bölme yöntemlerinde, alan bilgisi kritik öneme sahiptir. Sınıfları nasıl gruplayacağınız, hangi sınıfın “pozitif” olarak kabul edileceği gibi kararlar, veri analistinin veya alan uzmanının bilgisine dayanmalıdır.

Sonuç

Çoklu sınıf veri kümelerini ikiliye dönüştürmek, makine öğreniminde karşılaşılan yaygın bir problem olup, çeşitli yöntemlerle etkili bir şekilde çözülebilir. Tek-e-Karşı-Tüm (OvR) ve Tek-e-Karşı-Tek (OvO) stratejileri, genel amaçlı sarmalayıcılar olarak öne çıkarken, hiyerarşik sınıflandırma ve özel ikili bölme, belirli problem yapılarına ve iş gereksinimlerine yönelik daha özel çözümler sunar. Çoklu sınıf olasılıkları üzerinden eşikleme ise, mevcut bir modelin çıktısını ikili bir karara dönüştürmenin esnek bir yoludur.

Hangi yöntemin seçileceği, temel algoritmanın kısıtlamaları, veri kümesinin boyutu ve sınıf sayısı, sınıf dengesizliği, istenen model yorumlanabilirliği ve en önemlisi çözülmek istenen iş probleminin doğası gibi faktörlere bağlıdır. Her bir yöntemin avantajlarını ve dezavantajlarını anlayarak, veri bilimciler daha bilinçli kararlar verebilir ve makine öğrenimi modellerinin performansını ve uygulanabilirliğini artırabilirler. Dönüşüm sürecinde sınıf dengesizliği gibi potansiyel tuzaklara dikkat etmek ve uygun değerlendirme metriklerini kullanmak, başarılı bir proje için hayati öneme sahiptir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.