Próbuję przyspieszyć z R. W końcu chcę używać bibliotek R do klasyfikacji tekstu. Zastanawiałem się tylko, jakie są ludzkie doświadczenia w odniesieniu do skalowalności języka R, jeśli chodzi o klasyfikację tekstu.
Prawdopodobnie napotkam dane o dużych wymiarach (~ 300 tys. Wymiarów). Patrzę na wykorzystanie SVM i Random Forest w szczególności jako algorytmów klasyfikacji.
Czy biblioteki R byłyby skalowane do rozmiaru mojego problemu?
Dzięki.
EDYCJA 1: Żeby wyjaśnić, mój zestaw danych prawdopodobnie będzie miał 1000-3000 wierszy (być może nieco więcej) i 10 klas.
EDYCJA 2: Ponieważ jestem bardzo nowy w R, poproszę plakaty, aby były bardziej szczegółowe, tam gdzie to możliwe. Na przykład, jeśli sugerujesz przepływ pracy / potok, pamiętaj, aby w miarę możliwości wspomnieć biblioteki R zaangażowane w każdy krok. Niektóre dodatkowe wskaźniki (do przykładów, przykładowego kodu itp.) Byłyby wisienką na torcie.
EDYCJA 3: Po pierwsze, dziękuję wszystkim za komentarze. Po drugie przepraszam, być może powinienem był podać więcej informacji na temat problemu. Jestem nowy w R, ale nie tyle w klasyfikacji tekstu. Zrobiłem już wstępne przetwarzanie (usuwanie, usuwanie słów kluczowych, konwersję tf-idf itp.) Na niektórych częściach moich danych za pomocą pakietu tm , aby poszukać rzeczy. tm działał tak wolno nawet na około 200 dokumentach, że zaniepokoiłem się skalowalnością. Potem zacząłem grać w FSelector i nawet to było bardzo wolne. I w tym momencie dokonałem OP.
EDYCJA 4: Właśnie przyszło mi do głowy, że mam 10 klas i około 300 dokumentów szkoleniowych na klasę, i faktycznie buduję matrycę termXdoc z całego zestawu szkoleniowego, co skutkuje bardzo dużą wymiarowością. Ale co powiesz na sprowadzenie każdego problemu z klasyfikacją „jeden na dwa” do serii problemów z klasyfikacją binarną? To drastycznie zmniejszyłoby liczbę dokumentów szkoleniowych (a zatem i wymiarowość) na każdym etapie k-1, prawda? Czy to podejście jest dobre? Jak wypada pod względem dokładności w porównaniu do zwykłej implementacji wielu klas?
Odpowiedzi:
Zgodnie z prośbą w komentarzu, oto kilka wskazówek dotyczących kroków przetwarzania. Szereg narzędzi można znaleźć w widoku zadań CRAN dla przetwarzania języka naturalnego . Można również zajrzeć do tego artykułu na
tm
(górnictwo tekst) dla pakietu R .openNLP
(dla którego istnieje pakiet R) to jedna trasa.tf.idf
- termin częstotliwość * odwrotna częstotliwość dokumentów - więcej informacji można znaleźć w Wikipedii . Istnieją inne nowsze normalizacje, ale jest to metoda oparta na chlebie i maśle, dlatego ważne jest, aby ją znać. Możesz go łatwo wdrożyć w R: po prostu zapisz (docID, wordID, freq1, freq2), gdzie freq1 to liczba wyświetleń słowa indeksowanego przez wordID w danym dokumencie, a freq2 to liczba dokumentów, w których się pojawia. Nie ma potrzeby przechowywania tego wektora dla słów, które nie pojawiają się w danym dokumencie. Następnie po prostu weź freq1 / freq2 i masz swoją wartość tf.idf.Matrix
pakiet.W tym momencie masz ładnie wstępnie przetworzony zestaw danych. Polecam kontynuowanie korzystania z narzędzi wymienionych w widoku zadań CRAN lub pakiecie eksploracji tekstu. Grupowanie danych, na przykład przez rzutowanie na pierwsze 4 lub 6 głównych komponentów, może być bardzo interesujące dla twojej grupy, gdy dane są drukowane.
Jeszcze jedno: może się okazać, że redukcja wymiarów wzdłuż linii PCA (*) może być pomocna przy stosowaniu różnych metod klasyfikacji, ponieważ zasadniczo agregujesz powiązane słowa. Pierwszych 10–50 głównych składników może być wszystkim, czego potrzebujesz do klasyfikacji dokumentów, biorąc pod uwagę wielkość próbki.
(*) Uwaga: PCA to tylko pierwszy krok. Może to być bardzo interesujące dla kogoś, kto dopiero zaczyna od eksploracji tekstu i PCA, ale w końcu może się okazać, że jest to trochę uciążliwe dla rzadkich zestawów danych. Najpierw jednak spójrz na to, szczególnie za pomocą funkcji
prcomp
iprincomp
.Aktualizacja: Nie podałem preferencji w tej odpowiedzi -
prcomp
raczej polecam niżprincomp
.źródło
prcomp
i / lubprincomp
skaluje się do tego rodzaju danych, które według ciebie? Właśnie edytowałem moje pytanie i dodałem dodatkowe informacje.prcomp
) będą w porządku.Po pierwsze witamy! Przetwarzanie tekstu to świetna zabawa, a robienie tego w języku R jest coraz łatwiejsze.
Krótka odpowiedź: tak - narzędzia w R są teraz całkiem dobre do radzenia sobie z tego rodzaju danymi. W rzeczywistości nie ma nic specjalnego w R, C ++, Groovy, Scala ani żadnym innym języku, jeśli chodzi o przechowywanie danych w pamięci RAM: każdy język przechowuje 8-bajtowy podwójny pływak ... poczekaj na to ... poczekaj na to. .. 8 bajtów!
Algorytmy i ich implementacja mają znaczenie, zwłaszcza jeśli są bardzo słabo implementowane w odniesieniu do struktur danych i złożoności obliczeniowej. Jeśli wdrażasz własne algorytmy, po prostu zachowaj ostrożność. Jeśli używasz innego kodu, obowiązuje emptor z zastrzeżeniami, tak jak ma to miejsce w każdym środowisku.
W przypadku R należy rozważyć:
Matrix
pakiecie)bigmemory
lubff
; lub rozproszona, przy użyciu Hadoop)Ostatni punkt jest naprawdę pod twoją kontrolą.
Jeśli chodzi o tę wymiarowość, nie jest już szczególnie duża. Liczba obserwacji będzie miała większy wpływ, ale możesz podzielić dane na partycje, aby dostosować je do użycia pamięci RAM, więc naprawdę nie musisz się zbytnio martwić.
źródło
Zgadzam się z kredką, że liczba rzędów jest tutaj kluczowa. Do RF potrzebujesz co najmniej 3 razy więcej pamięci RAM niż wagi zestawu danych i prawdopodobnie dużo czasu (taka liczba atrybutów zwykle wymaga dużej liczby drzew w lesie - i pamiętaj, że nie ma równoległej implementacji RF w R).
Jeśli chodzi o SVM, wątpię, aby dobrze było walczyć z wymiarami 300k, podczas gdy prawdopodobnie możesz opracować funkcję jądra, która będzie równoważna z deskryptorami tekstu.
EDYCJA: Matryca 3k x 30k (prawdziwa) zajmowałaby około 7 Gb, więc wszystko, co musisz zrobić RF (używając randomForest) na tych danych, to komputer z 16 GB pamięci RAM, trochę szczęścia i sporo czasu lub po prostu komputer z 24 GB RAM i sporo czasu.
źródło
foreach
pakiet ładnie współpracuje zrandomForest
pakietem. Myślę, że jest jeden taki przykład winiety dlaforeach
. (A możedoMC
.)randomForest
tak, aby sprawdzał losowo wybrane kolumny z, na przykład, bazy danych SQL przy każdej iteracji (tak, aby całe 300k wymiarów nigdy nie miało być w baranie). Ale to prawdopodobnie głównie dlatego, że wiem więcej o R niż o innych możliwych opcjach.