Dengesiz bir ortamda maliyete duyarlı öğrenme için öneriler


15

Birkaç milyon satır ve ~ 100 sütun içeren bir veri kümem var. Ortak bir sınıfa ait veri kümesindeki örneklerin yaklaşık% 1'ini tespit etmek istiyorum. Minimum hassasiyet kısıtlamam var, ancak çok asimetrik maliyet nedeniyle belirli bir geri çağırma konusunda çok hevesli değilim (10 olumlu maçla kalmadığım sürece!)

Bu ortamda önerebileceğiniz bazı yaklaşımlar nelerdir? (bildirilere bağlantılar hoş geldiniz, takdir edilen uygulamalara bağlantılar)

Yanıtlar:


15

He ve Garcia'nın (2009) dengesiz sınıf problemlerinde öğrenmenin yararlı bir incelemesi olduğunu gördüm . Dikkate alınması gereken kapsamlı olmayan birkaç şey:

Veri tabanlı yaklaşımlar:

Çoğunluk sınıfının altı, azınlık sınıfının çok az örneği olabilir. (Breiman bunun resmi olarak muntazam olmayan yanlış sınıflandırma maliyetlerini atamaya eşdeğer olduğuna dikkat çekti.) Bu sorunlara neden olabilir: Örnekleme, öğrencinin çoğunluk sınıfının yönlerini gözden kaçırmasına neden olabilir; aşırı örnekleme, aşırı takılma riskini artırır.

Bu sorunları azaltan "bilinçli örnekleme" yöntemleri vardır. Bunlardan biri , çoğunluk sınıfından bağımsız olarak birkaç altkümeyi örnekleyen ve her altkümeyi tüm azınlık sınıfı verileriyle birleştirerek birden fazla sınıflandırıcı yapan EasyEnsemble'dır .

SMOTE (Sentetik Azınlık Aşırı Örnekleme Tekniği) veya SMOTEBoost (SMOTE'yi güçlendirmeyle birleştirerek) özellik alanında en yakın komşuları yaparak azınlık sınıfının sentetik örneklerini oluşturur. SMOTE, DMwR paketinde ( Luis Torgo'nun “R ile Veri Madenciliği, vaka çalışmaları ile öğrenme” CRC Press 2016 kitabıyla birlikte) R'de uygulanmaktadır .

Model uydurma yaklaşımları

Kayıp fonksiyonunuza sınıfa özgü ağırlıklar uygulayın (azınlık vakaları için daha büyük ağırlıklar).

Ağaç temelli yaklaşımlar için Hellinger mesafesini , Cieslak ve ark. "Hellinger mesafe karar ağaçları sağlam ve eğimsizdir" ( Weka kodu burada .)

Bir kullan tek sınıf sınıflandırıcı , (modele bağlı olarak) bir sınıf için olasılık yoğunluğunu veya sınırını öğrenin ve diğer sınıfı aykırı değerler olarak ele alın.

Elbette, model oluşturma için doğruluğu bir metrik olarak kullanmayın. Cohen'in kappa'sý makul bir alternatif.

Model değerlendirme yaklaşımları

Modeliniz tahmin edilen olasılıkları veya diğer puanları döndürürse, hatalarda uygun bir ödünleşime neden olan bir karar kesmeyi seçin (eğitim ve testten bağımsız bir veri kümesi kullanarak). R'de, OptimalCutpoints paketi, bir kesintiye karar vermek için maliyete duyarlı olanlar da dahil olmak üzere bir dizi algoritma uygular.


Ayrıntılı cevap için teşekkürler. Az örneklemeye çalıştım ve sefil bir şekilde başarısız oldum. Modeller mükemmel örnek içi performans gösterir, ancak test setinde (ve sonunda kullanacağım gerçek dünya verileri) dengesizlik hala mevcuttur, bu nedenle modellerin OOS hassasiyeti korkunçtur. Ayrıca sınıfa özgü ağırlıkları da denedim, ancak uygulamam yanlış pozitif için yanlış negatiflerden daha kolay ölçülebilir bir yüksek maliyet içeriyor . Bir sınıf sınıflandırıcılarına gelince, doğrusal bir svm (doğrusal olmayanlar çok yavaş) sığdırmaya çalıştım ve bu örnekte bile 0 hassasiyete sahip ...
em70

1
Senin için hissediyorum. Vakalarınızın büyük çoğunluğu negatifse yüksek hassasiyet zordur. Öğrenmeye yönelik sınıfa özgü ağırlıkları (sınıftaki vakaların fraksiyonuyla ters orantılı olarak) kullanır ve karar eşiğini belirlemek için hata türüne özgü ağırlıkları kaydederim. Umarım model seçimi için Cohen'in kappa'sında çapraz doğrulamayı kullanmazsınız. Mevcut kesinlikleri gerçekten anlamak için tüm kesimlerde yan hassasiyet ve zenginleştirme (pozitif vakaların hassasiyeti / oranı) boyunca kalibrasyon verilerindeki sınıfların olasılık yoğunluğunu görselleştirirdim.
MattBagg

Harika cevap, teşekkür ederim. Bir süredir adı geçen EasyEnsemble'a benzer bir teknik kullanıyorum, ancak bundan şüphelendim (simüle edilmiş verilerdeki makul performansa rağmen). Şimdi bunun mantıklı olduğunu biliyorum.
ayorgo

5

Anladığım kadarıyla, bu, makine öğrenimi topluluğunda aktif bir araştırma alanıdır ve büyük cevaplar değil, çok sayıda ve giderek artan sayıda potansiyel çözüm vardır. Düşündüğünüz belirli algoritmaları belirtirseniz muhtemelen daha iyi yanıtlar alacaksınız.

Parametrik bir model kullanıyorsanız (lojistik regresyon) bu daha az bir sorun olmalıdır ve sadece eşik değerini kayıp fonksiyonunuza göre değiştirebilirsiniz (yanlış pozitiflerin yanlış pozitiflerin maliyeti)

Makine öğrenimi algoritmaları kullanıyorsanız, bu daha zor olabilir. Max Kuhn, konuyu "Uygulamalı Öngörücü Modelleme" nin 16. Bölümünde özetlemeye yönelik adil bir girişimde bulunmaktadır. Ama özetlemek zor bir konu. Kitabı satın almak istemiyorsanız, bu bölüm için AppliedPredictiveModeling paketinde R kodu bulunmaktadır ve R ile olan bilginize ve kullanılan algoritmalara bağlı olarak yeterli olabilir.

Genellikle tartışma, yetersiz örnekleme / aşırı örnekleme +/- maliyete duyarlı algoritmalar etrafında döner. Jous-boost gibi varyasyonlarla da mümkündür.
Bu tür tartışmalara bir örnek: Chen ve arkadaşları "Dengesiz Verileri Öğrenmek için Rastgele Ormanı Kullanma" http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf


Eşiği değiştirmeyle ilgili sorun, bir regresyon modelinin kesişimini değiştirmek gibidir. Gerçekte, maliyeti dikkate almak için ağırlık vektörünü değiştirmek isteyebilirim. Ama eğer bunu yaparsam, zaten ağır dengesizlik göz önüne alındığında, 0 hassasiyetle sonuçlanırım! Herhangi bir algoritmaya karar vermedim ve eğer umut veriyorlarsa, en son araştırma fikirlerini uygulamak için kaynaklara sahip değilim. Önerdiğiniz kitaba bir göz atacağım.
em70

Bölüm böyledir. Sağlam çaba, ancak özetlenmesi zor bir konu. Çeşitli yöntemlerle yayınlanan birçok desteklenmeyen iddia. Rastgele ormanlarda tabakalı örnekleme, makine öğrenimi açısından iyi bir başlangıç ​​olduğunu düşünüyorum. Kod kitabın paketinde.
charles

0

Scikit-learn'un uygulamasına bir göz atabilirsiniz. sınıf ağırlıkları veya 'otomatik' sözlüğüne sahip olabilen class_ weight argümanına dikkat edin:

class sklearn.svm.SVC (C = 1.0, çekirdek = 'rbf', derece = 3, gama = 0.0, coef0 = 0.0, küçülme = Doğru, olasılık = Yanlış, tol = 0.001, cache_size = 200, class_weight = Yok, ayrıntılı = Yanlış, max_iter = -1, rastgele_stat = Yok)

Sınıf ağırlığı sözlüğü veya 'otomatik' olabilen class_weight argümanının değeriyle oynayabilirsiniz. 'Otomatik' modda, öğrenme algoritması, her bir sınıftaki ağırlık sayısına göre her sınıfa otomatik olarak ağırlık atar.

scikit-learn, bazıları sınıf ağırlıklarını kabul eden başka sınıflandırma algoritmalarına sahiptir.


OP'nin hedeflerine ulaşmak için sınıf ağırlıklarının nasıl kullanılabileceği hakkında daha fazla şey söyleyebilir misiniz? Sanırım bu sizin yayınınızda örtük, ama bu henüz bir cevap değil.
gung - Monica'yı eski

Evet, bazıları belgelere bakarsa class_weight argümanı 'auto' değerine sahip olabilir veya sınıf ağırlıklarına sahip bir sözlük değerine sahip olabilir. 'Oto' durumunda, öğrenme algoritması, her bir sınıfın ağırlığını, her birindeki örnek sayısına göre bulur.
Ash
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.