Yanıtlar:
scale_pos_weight
belirttiğ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.
@KeremT tarafından verilen bu cevap doğrudur. Kesin uygulamada hala sorun yaşayanlara bir örnek veriyorum.
weight
XGBoost 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
weight
vektö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
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 -
Teşekkürler wacax
Tren verilerinizin her bir örneğini sınıf ağırlığıyla atamanız yeterlidir. Önce class_weight.compute_class_weight
sklearn 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)