Szybka metoda znajdowania najlepszych metaparametrów SVM (jest szybsza niż wyszukiwanie w siatce)


17

Używam modeli SVM do krótkoterminowego prognozowania zanieczyszczeń powietrza. Aby wytrenować nowy model, muszę znaleźć odpowiednie metaparametry dla modelu SVM (mam na myśli C, gamma i tak dalej).

Dokumentacja Libsvm (i wiele innych książek, które przeczytałem) sugeruje użycie wyszukiwania siatki w celu znalezienia tych parametrów - w zasadzie trenuję model dla każdej kombinacji tych parametrów z określonego zestawu i wybieram najlepszy model.

Czy istnieje lepszy sposób na znalezienie optymalnych (lub prawie optymalnych) metaparametrów? Dla mnie jest to głównie kwestia czasu obliczeń - jedno przeszukiwanie siatki tego problemu zajmuje około dwóch godzin (po tym, jak przeprowadziłem kilka optymalizacji).

Zalety wyszukiwania siatki:

  • Można go łatwo zrównoleglić - jeśli masz 20 procesorów, będzie on działał 20 razy szybciej, równolegle z innymi metodami jest trudniej
  • Sprawdzasz duże części przestrzeni metaparametrów, więc jeśli istnieje dobre rozwiązanie, znajdziesz je.

Odpowiedzi:


10

Minusem wyszukiwania sieci jest to, że środowisko wykonawcze rośnie tak szybko, jak iloczyn liczby opcji dla każdego parametru.

Oto wpis na blogu Alexa Smoli dotyczący twojego pytania

Oto cytat:

[...] wybierz, powiedzmy 1000 par (x, x ') losowo z zestawu danych, oblicz odległość wszystkich takich par i weź medianę, kwantyl 0,1 i 0,9. Teraz wybierz λ, aby być odwrotną dowolną z tych trzech liczb. Przy odrobinie weryfikacji krzyżowej dowiesz się, która z trzech jest najlepsza. W większości przypadków nie trzeba już szukać.

Sam tego nie próbowałem, ale wydaje się to obiecujące.


Jak to się ma do pytania? Pytanie dotyczy znalezienia najlepszych parametrów modelu SVM (w szybki sposób).
Roronoa Zoro,

2
@Roronoa Zoro: i taka jest odpowiedź. Wyjaśnia, jak znaleźć parametry dla SVM opartych na radialnych funkcjach bazowych (C i \ lambda w blogu Smoli) w 3 | Cs | czas w przeciwieństwie do | \ gamma || Cs | tak jak w przypadku wyszukiwania siatki.
carlosdc

Aby wyjaśnić, że rozumiem heurystykę, w zasadzie losowo rysujesz 1000 punktów danych z zestawu danych do szkolenia SVM, a następnie odwracasz kwantyle .1, .9 i medianę, a te prawdopodobnie będą dobre kandydaci na odpowiednią gamma?
tomas

6

Jeśli przyjmiesz założenie, że pod siatką parametrów leży stosunkowo gładka funkcja, możesz zrobić pewne rzeczy. Na przykład jedna prosta heurystyka polega na tym, aby zacząć od bardzo grubej siatki parametrów, a następnie użyć drobniejszej siatki wokół najlepszych ustawień parametrów z grubej siatki.

W praktyce działa to całkiem dobrze, oczywiście z zastrzeżeniami. Po pierwsze, przestrzeń niekoniecznie musi być gładka i mogą istnieć lokalne optymima . Gruboziarnista siatka może ich całkowicie ominąć i możesz uzyskać nieoptymalne rozwiązanie. Zauważ również, że jeśli masz stosunkowo mało próbek w zestawie podtrzymującym, możesz mieć wiele ustawień parametrów, które dają ten sam wynik (błąd lub dowolną używaną metrykę). Może to być szczególnie problematyczne, jeśli uczymy się w wielu klasach (np. Stosując metodę „ jeden na wszystkich” ), a zestaw zawiera tylko kilka przykładów z każdej klasy. Jednak bez uciekania się do nieprzyjemnych nieliniowych technik optymalizacji prawdopodobnie służy to jako dobry punkt wyjścia.

Jest ładny zestaw odniesień tutaj . W przeszłości przyjąłem podejście, że można rozsądnie oszacować dobry zakres hiperparametrów jądra poprzez kontrolę jądra (np. W przypadku jądra RBF, upewniając się, że histogram wartości jądra daje dobry rozkład wartości, zamiast przechylać się w kierunku 0 lub 1 - i możesz to zrobić automatycznie, bez zbytniej pracy), co oznacza, że ​​możesz zawęzić zakres przed rozpoczęciem. Następnie możesz skoncentrować swoje wyszukiwanie na innych parametrach, takich jak parametr regularyzacji / wydajności. Jednak oczywiście działa to tylko w przypadku wstępnie obliczonych jąder, chociaż można to oszacować na przypadkowym podzbiorze punktów, jeśli nie chcesz używać wstępnie obliczonych jąder, i myślę, że takie podejście byłoby również w porządku.


5

Używam symulowanego wyżarzania do wyszukiwania parametrów.

Zachowanie jest regulowane przez kilka parametrów:

  • k jest stałą Boltzmanna.
  • T_max jest twoją temperaturą początkową.
  • T_min jest twoim końcowym progiem.
  • mu_T( μ) to o ile obniżasz temperaturę ( T->T/μ)
  • i to liczba iteracji w każdej temperaturze
  • zto rozmiar kroku - sam określasz, co to dokładnie znaczy. Losowo się poruszam old*(1±z).
  1. Weź punkt początkowy (zestaw wartości parametrów).
  2. Zdobądź energię (jak dobrze pasuje do twoich danych; używam wartości chi-kwadrat).
  3. Spójrz w losowym kierunku („zrób krok”).
    • Jeśli energia jest niższa niż bieżący punkt, przejdź tam.
    • Jeśli jest wyższy, przenieś się tam z prawdopodobieństwem p = e^{-(E_{i+1} - E_i)/(kT)}.
  4. Powtarzaj, od czasu do czasu obniżając T->T/μkażdą iiterację, aż uderzysz T_min.

Baw się trochę z parametrami i powinieneś być w stanie znaleźć zestaw, który działa dobrze i szybko.

A Biblioteka Naukowa GNU zawiera symulowane wyżarzanie.


4

Jeśli ktoś jest tutaj zainteresowany, zapoznaj się z moimi przemyśleniami na ten temat:

  • Jak sugeruje @tdc, szukam zgrubnego / dokładnego wyszukiwania siatki. To wprowadza dwa problemy:
    • W większości przypadków otrzymam zestaw dobrych zestawów metaparametrów, które mają bardzo różne parametry --- interpretuję to w ten sposób, że te parametry są optymalnymi rozwiązaniami, ale dla pewności powinienem sprawdzić wszystkie drobne siatki w pobliżu wszystkich tych dobrych parametrów ( zajęłoby to dużo czasu), więc na razie sprawdzam tylko sąsiedztwo zestawu metaparametrów zakładów.
    • W większości przypadków dokładne wyszukiwanie nie zwiększa wydajności SVM (może to wynikać z faktu, że sprawdzam tylko sąsiedztwo najlepszego punktu z grubej siatki).
  • Zauważyłem zachowanie, że większość czasu obliczeniowego spędza się na zestawach metaparametrów, które nie przyniosą dobrych rezultatów, na przykład: większość zestawów metaparametrów oblicza się w czasie krótszym niż 15 sekund (a najlepszy z nich ma wskaźnik błędu 15%), a niektóre zajmują 15 minut ( i większość z nich ma poziomy błędów większe niż 100%). Więc podczas wyszukiwania siatki zabijam punkty, których obliczenie zajmuje więcej niż 30 sekund i zakładam, że mają nieskończony błąd.
  • Korzystam z wielu procesów (co jest dość proste)

1

Jeśli jądro jest promieniowe, możesz użyć tej heurystyki, aby uzyskać właściweσ - Optymalizacja C jest wtedy znacznie łatwiejsza.


Link jest martwy. Do jakiej heurystyki się odnosiłeś?
Aalawlx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.