Mój zestaw treningowy zawiera około 50 000 wpisów, z którymi przeprowadzam wstępną naukę. Co tydzień dodaje się około 5 000 wpisów; ale ta sama ilość „znika” (ponieważ są to dane użytkownika, które należy usunąć po pewnym czasie).
Dlatego korzystam z nauki online, ponieważ później nie mam dostępu do pełnego zestawu danych. Obecnie używam tego, SGDClassifier
co działa, ale mój duży problem: pojawiają się nowe kategorie, a teraz nie mogę już używać mojego modelu, ponieważ nie były na początku fit
.
Czy jest jakiś sposób na SGDClassifier
inny model? Głęboka nauka?
Nie ma znaczenia, czy muszę zacząć od nowa TERAZ (tj. Użyć czegoś innego niż SGDClassifier
), ale potrzebuję czegoś, co umożliwi naukę online z nowymi etykietami.
Odpowiedzi:
Wygląda na to, że nie chcesz przekwalifikowywać modelu za każdym razem, gdy pojawia się nowa kategoria etykiet. Najprostszym sposobem, aby zachować maksymalną informacje o ostatnich danych byłoby pociąg jeden klasyfikator każdej kategorii.
W ten sposób możesz kontynuować szkolenie każdego klasyfikatora stopniowo („online”) z czymś w rodzaju,
SGDClassifier
bez konieczności ich przekwalifikowywania. Ilekroć pojawia się nowa kategoria, dodajesz nowy binarny klasyfikator tylko dla tej kategorii. Następnie wybierasz klasę o najwyższym prawdopodobieństwie / wyniku wśród zestawu klasyfikatorów.Nie różni się to zbytnio od tego, co robisz dzisiaj, ponieważ
scikit's SDGClassifier
już obsługuje scenariusz wieloklasowy, umieszczając pod maską wiele klasyfikatorów „jeden kontra wszyscy”.Oczywiście, jeśli pojawi się wiele nowych kategorii, takie podejście może być nieco trudne do zarządzania.
źródło
warm_start
opcję.Jeśli nowe kategorie pojawiają się bardzo rzadko, ja osobiście wolę rozwiązanie „jeden kontra wszystkie” dostarczone przez @oW_ . Dla każdej nowej kategorii trenujesz nowy model na X liczbie próbek z nowej kategorii (klasa 1) i X liczbie próbek z pozostałych kategorii (klasa 0).
Jeśli jednak często pojawiają się nowe kategorie i chcesz skorzystać z jednego wspólnego modelu, istnieje sposób na osiągnięcie tego za pomocą sieci neuronowych.
Podsumowując, po nadejściu nowej kategorii dodajemy odpowiedni nowy węzeł do warstwy softmax o zerowych (lub losowych) wagach i utrzymujemy nietknięte stare wagi, a następnie trenujemy model rozszerzony o nowe dane. Oto wizualny szkic pomysłu (narysowany przeze mnie):
Oto implementacja pełnego scenariusza:
Model jest szkolony w dwóch kategoriach,
Nadchodzi nowa kategoria,
Formaty modeli i docelowych są odpowiednio aktualizowane,
Model jest szkolony na nowych danych.
Kod:
które wyjścia:
Powinienem wyjaśnić dwie kwestie dotyczące tego wyniku:
Wydajność modelu jest zmniejszana od
0.9275
do0.8925
tylko przez dodanie nowego węzła. Jest tak, ponieważ dane wyjściowe nowego węzła są również uwzględniane przy wyborze kategorii. W praktyce dane wyjściowe nowego węzła należy uwzględnić dopiero po przeszkoleniu modelu na sporej próbce. Na przykład[0.15, 0.30, 0.55]
na tym etapie powinniśmy osiągnąć najwyższą z dwóch pierwszych pozycji , tj. 2. klasy.Wydajność modelu rozszerzonego w dwóch (starych) kategoriach
0.88
jest mniejsza niż w starym modelu0.9275
. Jest to normalne, ponieważ teraz model rozszerzony chce przypisać dane wejściowe do jednej z trzech kategorii zamiast dwóch. Ten spadek jest również oczekiwany, gdy wybieramy spośród trzech klasyfikatorów binarnych w porównaniu do dwóch klasyfikatorów binarnych w podejściu „jeden kontra wszyscy”.źródło
Muszę powiedzieć, że nie znalazłem żadnej literatury na ten temat. O ile mi wiadomo, to, o co prosisz, jest niemożliwe. Powinieneś być tego świadomy, a właściciel produktu również powinien. Powodem jest to, że każda funkcja utraty opiera się na znanych etykietach, więc nie można przewidzieć etykiety, której nie ma w danych treningowych. Jest też science fiction, że algorytm uczenia maszynowego może przewidzieć coś, do czego nie został przeszkolony
Powiedziawszy to, myślę, że może istnieć obejście problemu (pozwolę sobie zauważyć, że jest to opinia nieoparta na formalnej literaturze). Jeśli klasyfikator jest probabilistyczny, wyjściem jest prawdopodobieństwo, że każda klasa jest prawdziwa, a decyzja jest wyższym prawdopodobieństwem. Być może możesz ustawić próg dla tego prawdopodobieństwa, tak że model przewiduje „nieznane”, jeśli wszystkie prawdopodobieństwa są poniżej tego progu. Dam ci przykład.
PozwolićM.( x ) być wzorem, który: biorąc pod uwagę x , decyduje, czy x należy do jednej z trzech kategorii do1,do2),do3) . Dane wyjścioweM. jest wektorem prawdopodobieństw p . Decyzja jest podejmowana na podstawie najwyższego prawdopodobieństwap . Więc wynikM.( x ) = p ( x ) = ( 0,2 , 0,76 , 0,5 ) odpowiada decyzji x należy do do2) . Możesz zmodyfikować tę decyzję, ustawiającτ takie, jeśli żaden z nich pja≥ τ wtedy decyzja jest x należy do nieznanej klasy
To, co robisz z tymi nieznanymi , zależy od logiki biznesowej. Jeśli są one ważne, możesz utworzyć ich pulę i ponownie wyszkolić model przy użyciu dostępnych danych. Myślę, że możesz zrobić coś w rodzaju „transferu uczenia się” z wyuczonego modelu, zmieniając wymiar wyniku. Ale z tym się nie spotkałem, więc po prostu mówię
Weź pod uwagę, że
SGDClassifier
używaSVM
pod spodem, który nie jest algorytmem probabilistycznym. Zgodnie zSGDClassifier
dokumentacją możesz zmodyfikowaćloss
argument domodified_huber
lublog
w celu uzyskania wyników probabilistycznych.źródło
Istnieją dwie opcje:
Przewiduj, że punkt danych należy do nieznanej lub
unk
kategorii. Wszelkie nowe kategorie pojawiające się w strumieniu należy przewidzieć jakounk
. Jest to powszechne w przetwarzaniu języka naturalnego (NLP), ponieważ zawsze pojawiają się nowe tokeny słów w strumieniach słów.Ponownie trenuj model za każdym razem, gdy pojawi się nowa kategoria.
Odkąd wspomniałeś
SGDClassifier
, zakładam, że używasz scikit-learn. Scikit-learn nie bardzo dobrze wspiera naukę online. Lepiej byłoby zmienić platformę, która lepiej obsługuje transmisję strumieniową i naukę online, taką jak Spark .źródło