Chcę dokonać klasyfikacji na podstawie moich danych tekstowych. Mam 300 classes
200 dokumentów szkoleniowych na klasę (więc 60000 documents in total
), co może skutkować bardzo wysokimi wymiarami danych (być może szukamy ponad 1 milion wymiarów ).
Chciałbym wykonać następujące kroki w przygotowaniu (aby dać ci wyobrażenie o moich wymaganiach):
- Konwertowanie każdego dokumentu na wektor funkcji (
tf-idf
lubvector space model
) Feature selection
(Mutual Information
najlepiej oparte lub inne standardowe)- Szkolenie klasyfikatora (
SVM
,Naive Bayes
,Logistic Regression
lubRandom Forest
) - Prognozowanie niewidocznych danych na podstawie przeszkolonego modelu klasyfikatora.
Pytanie brzmi: jakich narzędzi / ram używam do obsługi danych o tak dużych wymiarach? Zdaję sobie sprawę ze zwykłych podejrzanych (R, WEKA ...), ale o ile mi wiadomo (mogę się mylić) być może żaden z nich nie poradzi sobie z tak dużymi danymi. Czy jest jakieś inne gotowe narzędzie, na które mógłbym spojrzeć?
Jeśli muszę to zrównoważyć, czy powinienem patrzeć na Apache Mahout ? Wygląda na to, że może jeszcze nie zapewniać wymaganej funkcjonalności.
Dzięki wszystkim z góry.
Aktualizacja: Rozejrzałem się po tej stronie , liście mailingowej R i ogólnie po Internecie. Wydaje mi się, że w mojej sytuacji mogą pojawić się następujące problemy:
(1) Wstępne przetwarzanie moich danych przy użyciu R ( w szczególności pakietu TM ) może być niepraktyczne , ponieważ tm
będzie zbyt wolne.
(2) Ponieważ będę musiał użyć zestawu pakietów R (przetwarzanie wstępne, rzadkie macierze, klasyfikatory itp.) Interoperacyjność między pakietami może stać się problemem, i mogę ponieść dodatkowe koszty związane z konwersją danych z jednego formatu na inny . Na przykład, jeśli wykonam wstępne przetwarzanie przy użyciu tm
(lub zewnętrznego narzędzia, takiego jak WEKA), będę musiał wymyślić sposób konwersji tych danych do postaci, którą biblioteki HPC w R mogą odczytać. I znowu nie jest dla mnie jasne, czy pakiety klasyfikujące bezpośrednio pobierałyby dane dostarczone przez biblioteki HPC.
Czy jestem na dobrej drodze? A co ważniejsze, czy mam sens?
źródło
foreach
biblioteki do pisania równoległego kodu w R. Działa to szczególnie dobrze w połączeniu z losowymi lasami, które z natury są łatwe do zrównoleglenia.Odpowiedzi:
Powinno to być możliwe, aby działało tak długo, jak długo dane są reprezentowane jako rzadka struktura danych, taka jak
scipy.sparse.csr_matrix
instancja w Pythonie. Napisałem tutorial do pracy na danych tekstowych . Możliwe jest dalsze zmniejszenie zużycia pamięci poprzez zastosowanie sztuczki haszującej: dostosuj ją, aby używaćHashingVectorizer
zamiastCountingVectorizer
lubTfidfVectorizer
. Wyjaśniono to w sekcji dokumentacji wyodrębnianie funkcji tekstowych .Lasy losowe są generalnie znacznie droższe niż modele liniowe (takie jak liniowe maszyny wektorów nośnych i regresja logistyczna) oraz wielomianowe lub Bernoulliego naiwne Bayesa, a dla większości problemów z klasyfikacją tekstu, które nie zapewniają znacznie lepszej dokładności predykcyjnej niż prostsze modele.
Jeśli scikit-learn nie będzie mógł skalować się do twojego problemu, Vowpal Wabbit zrobi (i prawdopodobnie szybciej niż sklearn), chociaż nie wdroży wszystkich modeli, o których mówisz.
Edytowano w kwietniu 2015 r., Aby odzwierciedlić aktualny stan biblioteki scikit-learn i naprawić niedziałające linki.
źródło
Gensim dla Pythona to magia. A ponieważ jest w Pythonie, możesz go używać w połączeniu z sugestią @ ogrisel.
źródło
Aby nie trącić własnym rogiem, stworzyłem dość popularną serię wideo na temat analizy tekstu za pomocą Rapidminer. Możesz to zobaczyć tutaj:
http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html
Prawdopodobnie możesz uniknąć wyboru funkcji, po prostu użyj klasyfikatora, który nie tworzy w pamięci milionów * milionów macierzy :)
Regresja logistyczna dusi się w tak wielu wymiarach. Naive Bayes przyjmuje niezależne wymiary, więc wszystko będzie dobrze. SVM nie zależy od liczby wymiarów (ale od liczby wektorów pomocniczych), więc będzie dobrze.
300 to jednak dużo klas. Zaczynam od nielicznych i pracuję na twojej drodze.
źródło
Po pierwsze, na podstawie twoich komentarzy potraktowałbym to jako 300 binarnych (tak / nie) problemów z klasyfikacją. Istnieje wiele łatwych w użyciu binarnych klasyfikatorów typu open source, dzięki czemu możesz wymieniać czas na pamięć.
SVM i regresja logistyczna są prawdopodobnie najpopularniejszymi metodami klasyfikacji tekstu. Oba mogą z łatwością obsłużyć 1000000 wymiarów, ponieważ nowoczesne implementacje wykorzystują rzadkie struktury danych i zawierają ustawienia regularyzacji, które unikają nadmiernego dopasowania.
Kilka pakietów uczenia maszynowego typu open source, w tym WEKA i KNIME , obejmuje zarówno maszyny SVM , jak i regresję logistyczną. Autonomiczne implementacje SVM obejmują libSVM i SVMlight . Aby uzyskać regresję logistyczną, podłączę BXRtrain i BXRclassify , które opracowałem z Madigan, Genkin i innymi. BXRclassify może zbudować indeks w pamięci tysięcy modeli regresji logistycznej i zastosować je jednocześnie.
Jeśli chodzi o konwersję tekstu do postaci wektorowej atrybutu, zawsze jakoś zawsze piszę trochę Perla, aby zrobić to od zera. :-) Ale wydaje mi się, że wspomniane pakiety uczenia maszynowego obejmują tokenizację i kod wektoryzacji. Inną drogą byłoby pójście z zestawem narzędzi w języku naturalnym, takim jak LingPipe , choć może to być dla ciebie przesadą .
źródło
Od wersji Sklearn 0.13 rzeczywiście istnieje implementacja HashingVectorizer .
EDYCJA: Oto pełny przykład takiej aplikacji ze sklearn docs
Zasadniczo ten przykład pokazuje, że można klasyfikować tekst według danych, które nie mieszczą się w głównej pamięci komputera (ale raczej na dysku / sieci / ...).
źródło