Dengesiz veri kümeleri için xgboost'ta scale_pos_weight'nin doğru kullanımı nedir?


26

Çok dengesiz bir veri setim var. Ayarlama önerisini ve kullanımını izlemeye çalışıyorum scale_pos_weightama nasıl ayarlayacağımı bilmiyorum.

Gördüğümü görebiliyorum RegLossObj.GetGradient:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

dolayısıyla pozitif bir numunenin gradyanı daha etkili olacaktır. Ancak, xgboost kağıdına göre , gradyan istatistiği her zaman yerel olarak kullanılır = belirli bir ağaçtaki belirli bir düğümün örnekleri içinde:

  1. Bir düğüm bağlamında, bir aday bölünmesinin kayıp azalmasını değerlendirmek
  2. bir yaprak düğüm bağlamında, o düğüme verilen ağırlığı optimize etmek için

Dolayısıyla, neyin iyi olacağını bilmenin bir yolu yoktur scale_pos_weight- pozitif ve negatif örnekler arasında 1: 100 oranıyla sonuçlanan bir düğüm için ve 1: 2 oranına sahip bir düğüm için çok farklı bir sayıdır.

İpucu var mı?


Muhtemelen, parametreyi CV'de 5 kat 5 tekrarla ayarlayabilirsiniz. Ancak, bunu yapmak için kodu yazmanız gerekebilir.
user2149631

Yanıtlar:


22

Genel olarak Scale_pos_weight, negatif sınıf sayısının pozitif sınıfa oranıdır. Veri kümesinin 90 negatif sınıf gözlemine ve 10 pozitif sınıf gözlemine sahip olduğunu varsayalım, o zaman scale_pos_Weight'ın ideal değeri 9 olmalıdır. Aşağıdaki bağlantıyı kontrol edebilirsiniz. http://xgboost.readthedocs.io/en/latest/parameter.html


1
Bu çok sınıflı bir veri kümesi için nasıl geçerlidir? 28 derse ne dersin? Bu benim için açık değil
Gabriel Ziegler

1
@Gabriel İnanıyorum o zaman sınıf ağırlıklarına gitmek daha iyi olur. Scale_pos_weight 'i, bir vs rest yaklaşımı kullanarak kullanabilirsiniz. Örneğin, 28 sınıf için manken oluşturun. Sonra her birini bir ikili sınıflandırma problemi olarak kullanabilirsiniz. Bu şekilde 28 farklı model ile uğraşacaksınız.
Harshit Mehta

Anlıyorum, ama onevsrest kullandığımda sınıflandırıcı da bana çok etiketli bir çıktı vermiyor, değil mi? 28 sınıftan sadece bir sınıf değil
Gabriel Ziegler

Nasıl ?. Örneğin: Sınıflar A, B, C'dir. Sınıflandırma için (A / Not A) ikili sınıflandırıcıya sahip olabilirsiniz, diğeri (B / B değil) olacaktır. Bunu 'n' sınıf sayısı için yapabilirsiniz. Sonra her sınıflandırıcıya karşılık gelen tüm olasılıklar arasında, sınıf atamanın bir yolunu bulmanız gerekir.
Harshit Mehta

Çoklu etiket için onevsrest kullanmaya alışkınım, ama denemeliyim! Teşekkürler!
Gabriel Ziegler

3

Tüm belgeler bunun olması gerektiğini söylüyor:

scale_pos_weight = count(negative examples)/count(Positive examples)

Uygulamada, bu oldukça iyi çalışıyor, ancak veri kümeniz son derece dengesizse, daha muhafazakar bir şey kullanmanızı tavsiye ederim:

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

Bu, pozitif örneklerin çoğalmasının etkisini çok yüksek bir ağırlıkla sınırlamak için yararlıdır.


1

Sorunuzu ve hayal kırıklığınızı anlıyorum, ancak bunun analitik olarak hesaplanabilecek bir şey olduğundan emin değilim, bunun yerine @ user2149631 çapraz doğrulama kullanarak çoğu hiper parametre için yaptığınız gibi, verileriniz için ampirik olarak iyi bir ayar belirlemeniz gerekir. önerildi. XGboost ile SelectFPR ve özellik seçimi ile XGBoost için FPR düşürmek için sklearn API kullanarak bazı başarı elde ettim, daha sonra 0 ve 1.0 arasında scale_pos_weight ayarlama. O.9 iyi çalışıyor gibi görünüyor, ama her şeyde olduğu gibi, YMMV verilerinize bağlı olarak. Ayrıca, belgelerine bakarsanız XGboost'a gönderirken her veri noktasını ayrı ayrı ağırlıklandırabilirsiniz. Sklearn paketleyicisini değil API'larını kullanmalısınız. Bu şekilde, bir veri noktası kümesini diğerinden çok daha fazla ağırlıklandırabilirsiniz ve kullandığı yükseltme algoritmasını etkileyecektir.


0

Ben de bu ikilemi tökezledim ve hala en iyi çözümü arıyorum. Ancak, sınıflandırıcı için en iyi parametre ayarı için Izgara Arama (sklearn içinde GridSearchCV) gibi yöntemleri kullanmanızı öneririm. Bununla birlikte, veri kümeniz oldukça dengesizse, örnekleme yöntemlerini (özellikle rasgele örnekleme ve SMOTE örnekleme yöntemleri) ve model pozitif ve negatif sınıf örneklerinin farklı oranlarına sahip veri örneklerinde toplanmaya değer. Dengesiz veri kümelerinin kullanımı hakkında güzel ve kullanışlı (neredeyse kapsamlı) bir öğretici.

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

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.