Dengesiz sınıfta, doğrulama / test veri kümelerimde örnekleme altında kullanmak zorunda mıyım?


14

Makine öğrenimine yeni başlıyorum ve bir durumla karşı karşıyayım. IPinYou veri kümesi ile bir Gerçek Zamanlı Teklif sorunu üzerinde çalışıyorum ve bir tıklama tahmini yapmaya çalışıyorum.

Mesele şu ki, bildiğiniz gibi, veri kümesi çok dengesiz: 1 olumlu örnek (tıklama) için yaklaşık 1300 negatif örnek (tıklama yok).

Bu benim işim:

  1. Verileri yükleyin
  2. Veri kümesini 3 veri kümesine bölün: A = Eğitim (% 60) B = Doğrulama (% 20) C = Test (% 20)
  3. Her veri kümesi için (A, B, C), 5 (1 pozitif örnek için 5 negatif örnek) oranına sahip olmak için her negatif sınıfta bir örnekleme yapın. Bu bana daha dengeli 3 yeni veri kümesi veriyor: A 'B' C '

Sonra modelimi A 'veri kümesi ve lojistik regresyon ile eğitiyorum.

Sorum şu:

  1. Doğrulama için hangi veri kümesini kullanmam gerekiyor? B veya B '?

  2. Test için hangi veri kümesini kullanmam gerekiyor? C veya C '

  3. Modelimi değerlendirmek için hangi metrikler en alakalı? F1Score, iyi kullanılan bir metrik gibi görünüyor. Ancak burada dengesiz sınıf nedeniyle (B ve C veri kümelerini kullanırsam) hassasiyet düşüktür (0.20'nin altında) ve F1Score düşük hatırlama / hassasiyetten çok etkilenir. AucPR veya aucROC kullanmak daha doğru olur mu?

  4. Öğrenme eğrisini çizmek istersem hangi metrikleri kullanmalıyım? (doğrulamak için B 'veri kümesini kullanırsam% hatasının alakalı olmadığını bilmek)

Zaman ayırdığınız için şimdiden teşekkür ederiz!

Saygılarımızla.

Yanıtlar:


10

Harika soru ... Numaralandırılmış sorularınıza bazı özel cevaplar:

1)B 'yi değil B'yi çapraz doğrulamalısınız. Aksi takdirde, sınıf dengelemenizin ne kadar iyi çalıştığını bilemezsiniz. Hem B çapraz validate da bir zararı yoktur ve B` ve aşağıdaki 4'e Yanıta göre yararlı olacaktır.

2) Aşağıdaki 4'e göre hem C hem de C` üzerinde test yapmalısınız.

3)Ben F1 ile sopa ve ROC-AUC kullanmak yararlı olabilir ve bu iyi bir sağlık kontrolü sağlar. Her ikisi de dengesiz sınıflarda yararlı olma eğilimindedir.

4)Bu gerçekten zor oluyor. Buradaki sorun, en iyi yöntemin, öğrenme eğrilerinin neye benzemesi gerektiğini yeniden yorumlamanızı veya hem yeniden örneklenmiş hem de orijinal veri kümelerini kullanmanızı gerektirmesidir.

Öğrenme eğrilerinin klasik yorumu:

  • Overfit - Çizgiler bir araya gelmiyor;
  • Underfit - Çizgiler bir araya gelir ancak çok düşük bir F1 puanı;
  • Doğru - Çizgiler makul bir F1 puanı ile bir araya geliyor.

Şimdi, A` üzerinde eğitim alıyorsanız ve C üzerinde test yapıyorsanız, çizgiler asla tamamen bir araya gelmeyecektir. A` üzerinde eğitim alıyorsanız ve C` üzerinde test yapıyorsanız, sonuçlar orijinal sorun bağlamında anlamlı olmayacaktır. Ee ne yapıyorsun?

Cevap A` üzerinde antrenman yapmak ve B` üzerinde test etmek, fakat aynı zamanda B üzerinde test etmektir. B` için F1 puanını olmasını istediğiniz yerde alın, ardından F1 için B puanını kontrol edin. Sonra testinizi yapın ve öğrenme eğrileri oluşturun Eğriler bir araya gelmeyecek, ancak kabul edilebilir önyargı hissine sahip olacaksınız ... bu F1 (B) ve F1 (B`) arasındaki fark.

Şimdi, öğrenme eğrilerinizin yeni yorumu:

  • Overfit - Çizgiler bir araya gelmez ve F1 (B`) -F1 (B) 'den daha uzaktadır;
  • Underfit - Çizgiler bir araya gelmez, ancak fark F1 (B`) -F1 (B) 'den daha azdır ve F1 (C) puanı F1 (B)' nin altındadır;
  • Doğru - Çizgiler bir araya gelmez, ancak F1 (B) 'ye benzer bir F1 (C) puanı olan fark F1 (B`) -F1 (B)' den daha azdır.

Genel : Dengesiz sınıflar için, yukarıda özetlediğimiz tüm ahlaki ahlaki durumlardan kaçındığı için, aşırı / düşük örnekleme yerine öğrenme algoritmanızda sınıf ağırlıklarınızı ayarlamayı denemenizi şiddetle tavsiye ediyorum. Scikit-learn gibi kütüphanelerde çok kolay ve bir sigmoid işlevi veya çoğunluk oyu kullanan herhangi bir şeyde kod vermesi oldukça kolaydır.

Bu yardımcı olur umarım!


AN605 @ çok teşekkürler. Çok hoşsun! Birkaç quesitonum var: 4 için) - "A 'üzerinde antrenman yapmak ve B' üzerinde test etmek" derseniz, demek istiyor musunuz? - "C için öğrenme eğrileri oluşturma" & "F1 (C) skoru F1 (B) altında / benzeri". Bununla birlikte, öğrenme eğrisi için, eğitim seti (burada A veya A ') için hata metriğini ve yalnızca doğrulama seti (B veya B') için hata metriğini çizmek zorunda kaldık. Burada C'yi "doğrulamıyor musun?"
9'da jmvllt

"Sınıf ağırlıkları" kullanma hakkında, eğer yanılıyorsam beni düzelt (ben sadece bu konuda hızlı bir göz vardı) ama, bu hile önünde bir katsayı / ağırlık "k" ekleyerek maliyet fonksiyonu "değiştirmek" içerir dengesiz sınıf, değil mi? : 􏲏 Maliyet (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) Bu şekilde, algoritma yanlış sınıflandırmayı dikkate almalıdır Ama her şey modelimi oluşturmak için Apache Spark & ​​MLlib kullanmak zorundayım ve maliyet fonksiyonumu kıvılcım ile kolayca değiştirebileceğimden emin değilim. time!
jmvllt

5

İçin 1)ve 2)sen yapmak istiyor

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

Bu veri kümeleri için sınıfları dengelemenize gerek yoktur.

Bu kararı sizin için hallettiğinden, yetersiz / aşırı örnekleme yerine sınıf ağırlıklarını kullanmayı da deneyebilirsiniz.

İçin 3)büyük olasılıkla (bu bir yarışma varsa) üzerinde atılır metrik şeyin kullanılarak optimize etmek istiyorum. Ancak bu bir düşünce değilse, tüm bu modeller iyi seçimlerdir. F1 düşük hassasiyetten etkilenebilir, ancak bunun yakalanmasını istersiniz. Saf modellerin (çoğunluk sınıfını tahmin etmek gibi) F1 gibi puanların alakalı olduğu bazı metriklerle iyi bir puan alabilmesi tam olarak budur.

Gelince 4)hangi metrik optimizasyon sonunda gösteren ile yanlış bir şey yok.


Merhaba @ jamesmf, bu harika cevap için teşekkürler. F1Score için sahip olduğum sorun, Yanlış Pozitif'i Yanlış Negatif'ten daha fazla ortadan kaldırmaya daha fazla odaklanmak isteyebileceğimdir. Hassasiyet ve geri çağırma işlemlerinde FP ve FN için farklı "ağırlık" eklemek doğru olur mu?
15:57, jmvllt

Bu bana mantıklı geliyor. Ayrıca sınıf ağırlığı açıklamanız doğru ve MLib'de uygulandığını görmüyorum, ancak bir özellik isteğine
değebilir

Tamam teşekkürler james! Şu anda LogisticGradient sınıfını genişleterek ve compute yönteminin üzerine yazarak kendim yapmaya çalışıyorum. Bunun bana iyi sonuçlar verip vermediğini size bildireceğim. İyi günler.
jmvllt

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.