Egzersiz verilerinde eşit olmayan grup boyutlarına sahip SVM


12

Bir grubun diğerinden daha fazla temsil edildiği eğitim verilerinden bir SVM oluşturmaya çalışıyorum. Ancak, gruplar nihai test verilerinde eşit olarak temsil edilecektir. Bu nedenle, iki paketin eğitim verilerindeki etkisini dengelemek için R paketi arabiriminin class.weightsparametresini kullanmak istiyorum .e1071libsvm

Bu ağırlıkların tam olarak nasıl belirlenmesi gerektiğinden emin olmadığım için küçük bir test yaptım:

  1. Bazı boş veriler oluşturun (rastgele özellikler; grup etiketleri arasında 2: 1 oran)
  2. class.weightsParametre seti ile bir svm takın .
  3. Bir grup yeni null veri kümesini tahmin edin ve sınıf oranlarına bakın.
  4. Tüm farklı eğitim setleri için tüm süreci birçok kez çoğaltın.

İşte kullanıyorum R kodu:

nullSVM <- function(n.var, n.obs) {
    # Simulate null training data
    vars   = matrix(rnorm(n.var*n.obs), nrow=n.obs)
    labels = rep(c('a', 'a', 'b'), length.out=n.obs)
    data   = data.frame(group=labels, vars)

    # Fit SVM
    fit = svm(group ~ ., data=data, class.weights=c(a=0.5, b=1))

    # Calculate the average fraction of 'a' we would predict from null test data
    mean(replicate(50, table(predict(fit, data.frame(matrix(rnorm(n.var*n.obs), nrow=n.obs))))[1])) / n.obs
}

library(e1071)
set.seed(12345)
mean(replicate(50, nullSVM(50, 300)))

Bütün bu şeyden ~ 0.5 bir çıktı bekliyordum, ancak, ne var bu değil:

> mean(replicate(50, nullSVM(50, 300)))
[1] 0.6429987

class.weightsMenü noktası, çalışıyor çeşit alt Ben ağırlığı olarak, abu simülasyon temsil edilir (ve atlarsanız düşürmek, class.weightsyakın 1'e döner) ... ama sadece 1 ağırlıkları kullanılarak neden anlamıyorum: 2 ( 2: 1 olan egzersiz verileri için) beni% 50'ye kadar indirmiyor.

SVM'leri yanlış anlıyorsam, birisi bu noktayı açıklayabilir mi? (veya bazı referanslar gönderilsin mi?)

Yanlış yapıyorsam, birisi bana class.weightsparametreyi kullanmanın doğru yolunu söyleyebilir mi?

Muhtemelen bir hata olabilir mi? (Bence, bu yazılımı ve altta yatan libsvm'nin oldukça olgun olduğunu anladığım için)


Libseam ile deneyimim yok ama LiblineaR ile sınıf ağırlıkları çok önemli. Doğru şekilde ayarlamakla birlikte, sınıflarınız büyük ölçüde dengesizse, optimal olmayan sonuçlar elde edersiniz. Şunu öneririm: Dengesiz sınıflarla gerçek bir veri seti alın ve class.weights'ın (LiblineaR wi'de) farklı değerlerini deneyin. LiblineaR, doğrusal bir çekirdek için daha hızlı büyüklük düzenidir ve ayrıca yöntemleri de cezalandırmıştır. Deneyimlerime göre, önce iyi bir sınıf ağırlığı bulursunuz ve daha sonra C'yi optimize edersiniz
marbel

Yanıtlar:


7

Bence bu, C'nin değerlerine ve sahip olduğunuz desen sayısına bağlı olabilir. SVM maksimum marj ayrımcısını bulmaya çalışır, bu nedenle seyrek verileriniz varsa SVM, Lagrange çarpanlarından herhangi birinin üst sınırlarına ulaşmadan sert marj çözümünü bulabilir (bu durumda her biri için ceza oranı) Gevşeklik değerlerinin küçük ya da sıfır olması nedeniyle sınıf temel olarak önemsizdir. Eğitim düzenlerinin sayısını artırmayı deneyin ve bunun bir etkisi olup olmadığını görün (bu şekilde, zor marj çözümünün kutu kısıtlamaları içinde bulunma olasılığını azaltır) .

Daha da önemlisi, C'nin optimum değerleri verilere bağlıdır, bunları önceden belirlenmiş bazı değerlere ayarlayamazsınız, bunun yerine bir kerede bırakma hatasını veya bazı genelleme sınırlarını en aza indirerek bunları optimize edebilirsiniz. Dengesiz sınıflarınız varsa, her sınıf için değerlerin oranını düzeltebilir ve tüm desenlere göre ortalama cezayı optimize edebilirsiniz.


Bu mantıklı. Bu simülasyondaki özellik sayısını azalttığımda ve gözlem sayısını artırdığımda, çıkış değeri 0,5'e yaklaşıyor. Ancak, 900 sıra ve sadece 1 sütun olsa bile oraya asla ulaşmaz.
John Colby

Tabii ki gerçek veriler üzerinde her zaman caretpaketi veya yerleşik tune()parametre model parametre ayarı için kullanıyorum, bu yüzden özellikle azınlık sınıfını tercih edecek şekilde yeniden örnekleme şemasını ayarlayarak pratikte bununla nasıl başa çıkacağınıza dair ikinci fikrinizi seviyorum. Çok takdir etmek.
John Colby

memnun öneri yararlı oldu. Ayrıca yararlı olabilecek optimum oranını ayarlama konusunda bir kağıt vardır theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf optimum teorik düzeltme pratikte her zaman optimal değildir, ancak en iyi sonuçları alan olabilir, aslında, iki ayrı C parametresini belirli bir oranı zorlamadan ayarlayarak, ancak bir defaya mahsus model seçim kriterini değerlendirirken desenleri sınıfa göre ağırlıklandırarak elde edilir.
Dikran Marsupial

2
Ayrıca, bu günlerde kayıp fonksiyonunun türevindeki süreksizlik nedeniyle bu tür karşı-sezgisel problemlere sahip olmadığınız için SVM'den ziyade çekirdek sırt regresyonunu kullanma eğilimindeyim. Oldukça sık bir L2 SVM'yi doğru ayarlarsanız, çok küçük bir C değeri elde edersiniz ve tüm veriler SV'dur, bu noktada yine de bir KRR modeliniz vardır. Onları ne kadar çok kullanırsam, SVM'leri uygulamada daha az yararlı buldum, ancak getirdikleri teorik bilgiler hayati önem taşıyordu.
Dikran Marsupial

0

eğitim svm ayrımcı bir sınır yapmak için destek vektörleri bulmak ve bunu yapmak için tüm sınıf verileri için yeterli destek vektörleri olduğunda, sorun olmaz. test setinin sonuç doğruluğunda, gerçek dünyadaki tüm sınıflar için eşit veri miktarına dikkat etmelisiniz ve gerçek sonuçlar elde etmek için verileri manipüle etmeli ve gerçek duruma uygun olarak değerlendirilmelidir.


Bu cevap şu anda oldukça belirsiz - ona bir kopya düzenleme vermeyi düşündüm, ancak ne istediğinden emin olmadığım birkaç yer var. Noktalama işaretleri ve gramer anlam taşımak için önemlidir.
Silverfish
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.