SVM z nierównymi wielkościami grup w danych treningowych

12

Próbuję zbudować maszynę SVM na podstawie danych szkoleniowych, w których jedna grupa jest reprezentowana bardziej niż druga. Grupy będą jednakowo reprezentowane w ostatecznych danych testowych. Dlatego chciałbym użyć class.weightsparametru e1071interfejsu pakietu R, libsvmaby zrównoważyć wpływ dwóch grup na dane treningowe.

Ponieważ nie byłem pewien, jak dokładnie określić te wagi, przygotowałem mały test:

  1. Wygeneruj niektóre dane zerowe (cechy losowe; stosunek 2: 1 między etykietami grupy)
  2. Dopasuj svm z class.weightszestawem parametrów.
  3. Przewiduj kilka nowych zerowych zbiorów danych i spójrz na proporcje klas.
  4. Powtórz cały proces wiele razy dla różnych zerowych zestawów treningowych.

Oto kod R, którego używam:

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)))

Z tego wszystkiego spodziewałem się wyniku ~ 0,5, ale nie to otrzymałem:

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

class.weightsParamter działa, sortowania , jako niższą masę I a, tym niższe jest reprezentowana w tej symulacji (a jeśli pominąć class.weightszwraca bliski 1) ... ale nie rozumiem, dlaczego po prostu za pomocą odważników od 1: 2 ( dla danych treningowych, które są 2: 1) nie doprowadza mnie do 50%.

Jeśli nie rozumiem SVM, czy ktoś może wyjaśnić ten punkt? (lub wysłać referencje?)

Jeśli robię to źle, czy ktoś może powiedzieć mi właściwy sposób użycia class.weightsparametru?

Czy to może być błąd? (Myślę, że nie, ponieważ rozumiem, że to oprogramowanie i leżący u jego podstaw libsvm są dość dojrzałe)

John Colby
źródło
Nie mam doświadczenia z libsvm, ale z LiblineaR wagi klas są kluczowe. Bez prawidłowego ustawienia uzyskasz nieoptymalne wyniki, jeśli twoje klasy są mocno niezrównoważone. Sugerowałbym: Uzyskaj prawdziwy zestaw danych z niezbalansowanymi klasami i wypróbuj różne wartości class.weights (w LiblineaR wi). LiblineaR jest o rząd wielkości szybszy dla jądra liniowego i ma również metody karane. Z mojego doświadczenia wynika, że ​​najpierw znajdujesz przyzwoitą wagę klasową, a następnie optymalizujesz C.
marbel

Odpowiedzi:

7

Myślę, że może to zależeć od wartości C i liczby posiadanych wzorów. SVM próbuje znaleźć dyskryminator maksymalnego marginesu, więc jeśli masz rzadkie dane, możliwe jest, że SVM może znaleźć rozwiązanie z twardym marginesem bez żadnego mnożnika Lagrange'a osiągającego górne granice (w takim przypadku stosunek kar dla każdego z nich klasa jest w zasadzie nieistotna, ponieważ luźne wartości są małe lub zerowe. Spróbuj zwiększyć liczbę wzorców treningowych i sprawdź, czy to ma wpływ (ponieważ zmniejsza to prawdopodobieństwo znalezienia rozwiązania z marginesem twardym w ramach ograniczeń pola) .

Co ważniejsze, optymalne wartości C są zależne od danych, nie można po prostu ustawić ich na niektóre z góry określone wartości, ale zamiast tego zoptymalizować je, minimalizując błąd pomijany lub ograniczenia związane z generalizacją. Jeśli masz niezrównoważone klasy, możesz ustalić stosunek wartości dla każdej klasy i zoptymalizować średnią karę za wszystkie wzorce.

Dikran Torbacz
źródło
To ma sens. Kiedy zmniejszę liczbę funkcji i zwiększę liczbę obserwacji w tej symulacji, wartość wyjściowa zbliży się do 0,5. Jednak nigdy do niej nie dociera - nawet z 900 rzędami i tylko 1 kolumną.
John Colby,
Oczywiście na prawdziwych danych zawsze używam caretpakietu lub wbudowanej tune()funkcji do strojenia parametrów modelu, więc szczególnie podoba mi się twój drugi pomysł, jak sobie z tym poradzić w praktyce, dostosowując schemat ponownego próbkowania, aby faworyzować klasę mniejszości. Bardzo mile widziane.
John Colby,
cieszę się, że twoja sugestia była przydatna. Jest artykuł na temat ustawiania optymalnego współczynnika, który może być również przydatny theoval.cmp.uea.ac.uk/publications/pdf/ijcnn2001.pdf Jednak optymalna teoretyczna korekta nie zawsze jest optymalna w praktyce, więc najlepsze wyniki mogą faktycznie można uzyskać przez dostrajanie dwóch oddzielnych parametrów C bez wymuszania określonego stosunku, ale ważenie wzorców zgodnie z klasą podczas oceny kryterium wyboru modelu pomijania.
Dikran Marsupial
2
Dodam również, że obecnie używam regresji grzbietu jądra zamiast SVM, ponieważ nie masz tego rodzaju sprzecznych z intuicją problemów z powodu nieciągłości pochodnej funkcji utraty. Dość często, jeśli dostroisz L2 SVM poprawnie, otrzymujesz bardzo małą wartość C, a wszystkie dane są SV, w którym to momencie masz model KRR. Im częściej ich używałem, tym mniej przydatne znalazłem SVM w praktyce, chociaż teoretyczne spostrzeżenia, które przynieśli, były kluczowe.
Dikran Torbacz
0

w szkoleniu svm znajdujemy wektory pomocnicze, aby stworzyć dyskryminującą granicę, a gdy jest wystarczająca ilość wektorów pomocniczych dla danych wszystkich klas, nie byłoby problemu. w dokładności wyników zestawu testowego należy pamiętać o równej ilości danych dla wszystkich klas w prawdziwym świecie, a dla uzyskania rzeczywistych wyników należy manipulować danymi, a także odpowiednio uwzględnić je w rzeczywistej sytuacji.

ho3ein
źródło
Ta odpowiedź jest w tej chwili niejasna - rozważałem nadanie jej edycji, ale jest kilka miejsc, w których nie byłem pewien, co zamierzałeś. Interpunkcja i grammmar są ważne dla przekazywania znaczenia.
Silverfish