XGBoost ile dengesiz çoklu sınıf verileri


21

Bu dağıtım ile 3 sınıf var:

Class 0: 0.1169
Class 1: 0.7668
Class 2: 0.1163

Ve xgboostsınıflandırma için kullanıyorum . Adında bir parametre olduğunu biliyorum scale_pos_weight.

Ancak 'çok sınıflı' dava için nasıl ele alınır ve nasıl düzgün bir şekilde ayarlayabilirim?

Yanıtlar:


19

scale_pos_weightbelirttiğiniz gibi ikili sınıflandırma için kullanılır. Dengesiz sınıfları ele almak için daha genel bir çözümdür. Bir değer atarken iyi bir yaklaşım scale_pos_weight:

sum(negative instances) / sum(positive instances)

Özel durumunuz için, güçlendirici ile çalışırken tek tek veri noktalarını ağırlıklandırmak ve ağırlıklarını dikkate almak ve ağırlıklarla ilgili optimizasyonun gerçekleşmesini sağlamak için başka bir seçenek daha vardır, böylece her nokta eşit olarak temsil edilir. Sadece kullanmanız yeterlidir:

xgboost.DMatrix(..., weight = *weight array for individual weights*)

Ağırlıkları istediğiniz gibi tanımlayabilirsiniz ve böylece sınıflardaki dengesizliklerin yanı sıra farklı sınıflardaki dengesizliklerle başa çıkabilirsiniz.


> Scale_pos_weight için bir değer atarken iyi bir yaklaşım: sum (negatif örnekler) / sum (pozitif örnekler)
lcrmorin

1
Bu tavsiyeyi her yerde görüyorum ve daha az temsil edilen sınıfa daha fazla ağırlık vermek mantıklı. Ancak bu kesin değeri tartışan bir kaynak bulmakta zorlanıyorum. Bu özel değerin arkasındaki sezgiyi alıyorum (numuneyi dengeli hale getirin), ancak bir yerde bir varyans değişimi olduğundan şüpheleniyorum, bu da daha düşük ağırlığı düşünmenizi sağlayacaktır.
lcrmorin

Şahsen @Kerem, olumlu örneklerin çoğunluk mu yoksa azınlık sınıfları mı olduğu benim için hala belirsiz. Her zaman pozitif = çoğunluk ve negatif = azınlık ve dolayısıyla toplamın (negatif örnekler) / toplam (pozitif örnekler) = toplam (azınlık) / toplamın (çoğunluk) olduğunu düşünüyor muyuz?
Penseur

8

@KeremT tarafından verilen bu cevap doğrudur. Kesin uygulamada hala sorun yaşayanlara bir örnek veriyorum.

weightXGBoost parametresi sınıf başına değildir. Bu nedenle, her sınıfın ağırlığını örneklerine atamamız gerekir, ki bu aynı şeydir.

Örneğin, oranlarla üç dengesiz sınıfımız varsa

class A = 10%
class B = 30%
class C = 60%

Ağırlıkları (en küçük sınıfı başkalarına bölmek) olacaktır.

class A = 1.000
class B = 0.333
class C = 0.167

Ardından, eğitim verileri

index   class
0       A
1       A
2       B
3       C
4       B

weightvektörü aşağıdaki gibi inşa ediyoruz :

index   class    weight
0       A        1.000
1       A        1.000
2       B        0.333
3       C        0.167
4       B        0.333

5

Herkes R'de XGBoost kullanarak dengesiz çoklu sınıf sınıflandırma problemi ile uğraşırken bu soruyu tökezler. Ben de yaptım!

Nasıl uygulanacağını daha iyi anlamak için bir örnek arıyordum. Aşağıda belirtilen bağlantıyı bulmak için neredeyse bir saat yatırım yaptım. Bir örnek arayanlar için işte burada -

/datascience//a/9493/37156

Teşekkürler wacax


2

Tren verilerinizin her bir örneğini sınıf ağırlığıyla atamanız yeterlidir. Önce class_weight.compute_class_weightsklearn ile sınıf ağırlıklarını alın, ardından tren verisinin her sırasına uygun ağırlığını atayın.

Burada tren verilerinin sınıf numarasını içeren 'class' sütununa sahip olduğunu varsayıyorum. Ayrıca 1'den nb_classes olan nb_classes olduğunu varsayalım.

from sklearn.utils import class_weight
class_weights = list(class_weight.compute_class_weight('balanced',
                                             np.unique(train['class']),
                                             train['class']))

w_array = np.ones(y_train.shape[0], dtype = 'float')
for i, val in enumerate(y_train):
    w_array[i] = class_weights[val-1]

xgb_classifier.fit(X, y, sample_weight=w_array)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.