Kategoryzacja tekstu: łączenie różnego rodzaju funkcji

19

Problem, który rozwiązuję, polega na podzieleniu krótkich tekstów na wiele klas. Moje obecne podejście polega na wykorzystaniu częstotliwości ważonych tf-idf i nauce prostego klasyfikatora liniowego (regresja logistyczna). Działa to całkiem dobrze (około 90% makra F-1 na zestawie testowym, prawie 100% na zestawie treningowym). Dużym problemem są niewidoczne słowa / n-gram.

Próbuję ulepszyć klasyfikator, dodając inne funkcje, np. Wektor o stałej wielkości obliczany za pomocą podobieństw dystrybucyjnych (obliczanych przez word2vec) lub inne cechy kategorialne przykładów. Moim pomysłem było po prostu dodanie funkcji do rzadkich funkcji wprowadzania z zestawu słów. Skutkuje to jednak gorszą wydajnością zestawu testowego i szkoleniowego. Same dodatkowe funkcje dają około 80% F-1 na zestawie testowym, więc nie są śmieciami. Skalowanie funkcji również nie pomogło. Moje obecne myślenie jest takie, że tego rodzaju funkcje nie pasują dobrze do (rzadkiego) zestawu słów.

Pytanie zatem brzmi: zakładając, że dodatkowe funkcje dostarczają dodatkowych informacji, jaki jest najlepszy sposób na ich włączenie? Czy szkolenie oddzielnych klasyfikatorów i łączenie ich w jakąś pracę zespołową (prawdopodobnie miałoby to tę wadę, że nie można uchwycić interakcji między cechami różnych klasyfikatorów)? Czy są inne bardziej złożone modele, które powinienem rozważyć?

Elmille
źródło
3
Trochę aktualizacji: byłem w stanie osiągnąć akceptowalne wyniki poprzez normalizację l2 dodatkowych gęstych wektorów. Niesłusznie założyłem, że sklearn StandardScaler to zrobi. Wciąż szukam bardziej złożonych metod, które pozwoliłyby mi modelować zależności etykiet lub uwzględniać zaufanie subklasyfikatorów.
elmille
W zeszłym roku robiłem podstawowy ten sam eksperyment i napotkałem dokładnie ten sam problem, który masz. Czy twój wektor word2vec po procesie normalizacji L2 pokonał BOW? Nie przeprowadziłem normalizacji L2, ale nawet po przetestowaniu wielu metod postprocessingu wektor semantyczny wciąż pozostaje o 2-4 procent absolutnych za funkcjami BOW tf / idf. Zastanawiam się, czy ten kierunek jest martwy. Moim pierwotnym celem było połączenie gęsto semantycznego wektora z tradycyjnym BOW i sprawdzenie, czy może poprawić wyniki klasyfikacji / modelowania tematów. BTW: nad jakim zestawem danych pracowałeś, mój to 20newsgroup.
Pracowałem z zestawem danych do konkursu CIKM 2014. Dla mnie reprezentacje wektorowe nigdy nie były w stanie pokonać BOW z wagami tf-idf. Moim planem było ich użycie w celu poprawy jakości. Z mojego doświadczenia (do klasyfikacji tekstu) jakaś forma tf-idf + model liniowy z n-gramami jest niezwykle silnym podejściem. Obecnie eksperymentuję z splotowymi sieciami neuronowymi, a nawet z tymi (mniej lub bardziej) złożonymi modelami, które są trudne do pokonania.
elmille
Do Mod: Przepraszam, że nie mam 50 reputacji, więc nie mogę pisać w polu komentarza. Cześć Elmille: Tak, właśnie tego doświadczam podczas całego testu. Czy jednak uważasz, że to słowo vec + BOW pomaga? Z mojego doświadczenia wynika, że ​​kiedy łączę słowo vec z BOW tf-idf (w moim przypadku ten vec jest w rzeczywistości całym wektorem w całym artykule, nie jest słowem vec, ale bardzo podobny), wydajność staje się jeszcze niższa. Pierwotnie uważam, że powinien to być BOW + vec> BOW> vec. Ponieważ zawierają one wzajemnie pomocne informacje. Rzeczywisty wynik to BOW> vec> BOW + vec. Następnie wykonuję standardowe skalowanie i normalizację, aby wykonać łuk i vec

Odpowiedzi:

13

Jeśli dobrze rozumiem, zasadniczo masz dwie formy funkcji dla swoich modeli. (1) Dane tekstowe, które przedstawiłeś jako rzadką paczkę słów i (2) bardziej tradycyjne, gęste elementy. W takim przypadku istnieją 3 wspólne podejścia:

  1. Wykonaj redukcję wymiarowości (taką jak LSA via TruncatedSVD) na swoich rzadkich danych, aby były gęste, i połącz cechy w jedną gęstą macierz, aby wyszkolić swój model (modele).
  2. Dodaj kilka gęstych funkcji do swojej rzadkiej macierzy, używając czegoś takiego jak scipy's hstackw jednej rzadkiej macierzy, aby wytrenować swój model (y).
  3. Utwórz model, używając tylko rzadkich danych tekstowych, a następnie połącz jego przewidywania (prawdopodobieństwa, jeśli jest to klasyfikacja) jako gęstą cechę z innymi gęstymi cechami, aby utworzyć model (tj. Zestawianie poprzez układanie w stos). Jeśli wybierzesz się na tę trasę, pamiętaj, aby używać tylko prognoz CV jako funkcji do trenowania swojego modelu, w przeciwnym razie prawdopodobnie źle się dopasujesz (możesz zrobić całkiem niezłą klasę, aby zrobić to wszystko w ciągu jednego, Pipelinejeśli chcesz).

Wszystkie trzy podejścia są ważne i mają swoje zalety i wady. Osobiście uważam, że (1) jest zwykle najgorszy, ponieważ jest stosunkowo powolny. Uważam też, że (3) jest zwykle najlepszy, ponieważ jest wystarczająco szybki i daje bardzo dobre prognozy. Możesz oczywiście wykonać ich kombinację, jeśli chcesz wykonać bardziej rozbudowane połączenie.

Jeśli chodzi o używane algorytmy, mogą one zasadniczo pasować do tych ram. Regresja logistyczna działa zaskakująco dobrze przez większość czasu, ale inni mogą radzić sobie lepiej w zależności od problemu i tego, jak dobrze go dostroisz. Sam jestem częściowo zwolennikiem GBM, ale najważniejsze jest to, że możesz wypróbować tyle algorytmów, ile chcesz, a nawet wykonanie prostych ważonych zestawów ich prognoz prawie zawsze prowadzi do lepszego ogólnego rozwiązania.

David
źródło
10

Modele liniowe po prostu dodają swoje cechy pomnożone przez odpowiednie wagi. Jeśli na przykład masz 1000 rzadkich funkcji, z których tylko 3 lub 4 są aktywne w każdej instancji (a pozostałe są zerami) i 20 gęstych obiektów, które nie są zerami, to jest całkiem prawdopodobne, że gęste funkcje wykorzystają większość wpływ, podczas gdy rzadkie funkcje dodadzą tylko niewielką wartość. Możesz to sprawdzić, przyglądając się wagom obiektów w kilku przypadkach i ich wpływowi na wynikową sumę.

Jednym ze sposobów rozwiązania tego problemu jest odejście od modelu addytywnego. Oto kilka modeli kandydujących.

SVM opiera się na oddzielaniu hiperpłaszczyzn. Chociaż hiperpłaszczyzna jest samym modelem liniowym, SVM nie podsumowuje swoich parametrów, ale zamiast tego próbuje optymalnie podzielić przestrzeń cech. Biorąc pod uwagę liczbę funkcji, powiedziałbym, że liniowy SVM powinien działać dobrze, podczas gdy bardziej skomplikowane jądra mogą mieć tendencję do przeładowywania danych.

Pomimo swojej nazwy, Naive Bayes jest dość potężnym modelem statystycznym, który wykazał dobre wyniki w klasyfikacji tekstu. Jest również wystarczająco elastyczny, aby wychwycić nierównowagę częstotliwości rzadkich i gęstych funkcji, więc zdecydowanie powinieneś spróbować.

Wreszcie losowe lasy mogą w tym przypadku działać jako dobra metoda zespolona. Randomizacja zapewni, że różne rodzaje cech (rzadkie / gęste) będą wykorzystywane jako główne węzły decyzyjne w różnych drzewach. Drzewa RF / decyzyjne są również dobre do samodzielnego sprawdzania cech, więc i tak warto zwrócić uwagę na ich strukturę.

Zauważ, że wszystkie te metody mają swoje wady, które mogą w twoim przypadku zmienić je w śmieci. Łączenie rzadkich i gęstych funkcji nie jest tak naprawdę dobrze zbadanym zadaniem, więc daj nam znać, które z tych podejść działa najlepiej w twoim przypadku.

przyjaciel
źródło
Dziękuję za Twoją odpowiedź! Mam dwa pytania uzupełniające :) 1) Czym różni się SVM (z jądrem liniowym) i Naive Bayes, ponieważ nie sumują swoich cech i odpowiadających im wag (tj. Tego, co nazywacie „modelem addytywnym”)? Oba skutecznie tworzą oddzielającą hiperpłaszczyznę, więc czy nie zawsze wynikiem jest jakaś funkcja dodawania pomnożona przez odpowiednie wagi? 2) Chciałbym wypróbować losowe lasy, ale niestety przestrzeń funkcji jest zbyt duża, aby reprezentować ją w gęstym formacie (używam sklearn). Czy istnieje implementacja, która może to obsłużyć?
elmille
1) W regresji liniowej interesują Cię punkty na hiperpłaszczyźnie, dlatego sumujesz funkcje ważone, aby uzyskać przewidywany punkt. Z drugiej strony, w SVM szukasz punktów po bokach hiperpłaszczyzny. Klasyfikujesz, po prostu sprawdzając, po której stronie jest twój przykład, bez przewidywania. Naiwne Bayes mogą zawierać różne rodzaje modeli (np. Dwumianowe lub wielomianowe), ale w zasadzie pomnożymy prawdopodobieństwa, a nie je dodamy.
zaprzyjaźnij się
2) Widziałem pewne badania w tym temacie, ale nigdy nie spotkałem się z wdrożeniem (prawdopodobnie Google poda tutaj kilka linków). Zawsze możesz jednak pójść inną drogą - zmniejszyć wymiarowość, powiedzmy, PCA, a następnie uruchomić losowy las na podstawie zmniejszonego zestawu danych.
zaprzyjaźnij się