Pracuję nad zbiorem danych z ponad 200 000 próbek i około 50 cechami na próbkę: 10 zmiennych ciągłych, a pozostałe ~ 40 to zmienne jakościowe (kraje, języki, dziedziny nauki itp.). Dla tych zmiennych kategorialnych masz na przykład 150 różnych krajów, 50 języków, 50 dziedzin naukowych itp.
Jak dotąd moje podejście jest następujące:
Dla każdej zmiennej kategorialnej o wielu możliwych wartościach, weź tylko tę, która ma więcej niż 10000 próbek, która przyjmuje tę wartość. Zmniejsza to do 5-10 kategorii zamiast 150.
Zbuduj zmienną fikcyjną dla każdej kategorii (jeśli 10 krajów, to dla każdej próbki dodaj wektor binarny o rozmiarze 10).
Wprowadź losowy klasyfikator leśny (sprawdź parametry itp.) Tymi danymi.
Obecnie przy takim podejściu udaje mi się uzyskać jedynie 65% dokładności i wydaje mi się, że można zrobić więcej. Szczególnie nie jestem zadowolony z mojej 1), ponieważ uważam, że nie powinienem arbitralnie usuwać „najmniej istotnych wartości” zgodnie z liczbą próbek, jakie mają, ponieważ te mniej reprezentowane wartości mogą być bardziej dyskryminujące. Z drugiej strony, moja pamięć RAM nie może sobie pozwolić na dodanie 500 danych * 200000 wierszy do danych, zachowując wszystkie możliwe wartości.
Czy masz jakieś sugestie, aby poradzić sobie z tymi bardzo kategorycznymi zmiennymi?
Odpowiedzi:
1) Losowe lasy powinny być w stanie obsłużyć wartości jakościowe w sposób natywny, więc poszukaj innej implementacji, abyś nie musiał kodować wszystkich tych funkcji i zajmował całą pamięć.
2) Problem z kategorycznymi cechami wysokiej kardynalności polega na tym, że łatwo jest z nimi zmieścić się. Możesz mieć wystarczającą ilość danych, aby nie stanowiło to problemu, ale uważaj na to.
3) Sugeruję przyjrzenie się losowemu wyborowi cech opartych na lesie przy użyciu metody zaproponowanej przez Briemana lub sztucznych kontrastów . Metoda sztucznych kontrastów (ACE) jest interesująca, ponieważ porównuje ważność tej funkcji ze znaczeniem potasowanej wersji samej siebie, która walczy z niektórymi problemami wysokiej kardynalności. Pojawiła się nowa praca „Lasy losowe z przewodnikiem po modułach”, która może być interesująca, jeśli masz o wiele więcej funkcji, ponieważ wykorzystuje ona metodę wyboru cech, która jest świadoma grup cech ściśle skorelowanych.
4) Inną czasami używaną opcją jest ulepszenie algorytmu, aby używał skrzynek z torby w celu dokonania ostatecznego wyboru funkcji po dopasowaniu podziałów w skrzynkach z torby, co czasem pomaga w walce z przeregulowaniem.
Jest prawie pełna realizacja ace tutaj i mam effichent więcej pamięci / szybkie wdrożenie rf, który obsługuje zmienne kategoryczne natywnie tutaj ... The -evaloob podpory opcja opcja 4 pracuję na dodanie wsparcia dla ACE i kilka innych rf oparte na metodach wyboru funkcji, ale jeszcze tego nie zrobiono.
źródło
pandas.get_dummies
funkcja). Implementacja losowego lasu przez H2O była dla mnie bardzo dobra (patrz 0xdata.com/docs/master/model/rf ).Dlaczego zamiast zmumifikować swoje kategorie, po prostu nie użyłbyś jednej zmiennej numerycznej dla każdej z nich? W kontekście losowych lasów często zastanawiałem się nad konsekwencjami takiego postępowania (ponieważ zgadzam się, że wprowadzanie porządku w kategorycznych danych, z którym często nie ma sensu, wydaje się podejrzane), ale w praktyce (przynajmniej z wdrożoną przez scikit metodą uczenia RF, której używam), często zauważyłem, że nie ma to wpływu na wyniki (choć nie jestem pewien, dlaczego).
źródło
Myślę, że powinieneś rozważyć / więcej technik redukcji zmiennej . Pozbywa się nie tak wpływowych predyktorów.
Dużo czytałem o przetwarzaniu danych i jest to świetne rozwiązanie, aby zmniejszyć liczbę twoich zmiennych.
Moje sugestie są następujące:
'nzv'
funkcji z'caret'
pakietu. To znacznie zmniejszy twój wymiar danych.Sugerowałbym również użycie algorytmu AdaBoost zamiast RF. Osobiście przeprowadzone przeze mnie badania dały mi bardzo podobne współczynniki Giniego dla obu tych metod. Zaletą AdaBoost jest to, że w R obsługuje brakujące obserwacje. Możesz więc pominąć pierwszy krok na tej liście
Mam nadzieję, że trochę pomogło. Powodzenia
źródło
Możesz rozważyć modele z efektami mieszanymi. Są one popularne w naukach społecznych ze względu na ich wyniki w kategoriach danych o wysokiej kardynalności, a ja wykorzystałem je do stworzenia świetnych modeli predykcyjnych, które przewyższają popularne podejścia do uczenia maszynowego, takich jak drzewa ze wzmocnieniem gradientu, losowe lasy i regresja logistyczna z elastyczną siatką. Najbardziej znaną implementacją jest pakiet Rme lme4; funkcją, której użyjesz do klasyfikacji, jest glmer, który implementuje regresję logistyczną z mieszanymi efektami. Być może masz problemy ze skalowaniem zestawu danych, ale wykonałem 80 000 wierszy z 15 funkcjami bez większych trudności.
źródło
Kiedy mówisz „buduj zmienną fikcyjną dla każdego kategorycznego” , brzmi to tak, jakbyś używał Pythona, a nie R? R randomforest może natywnie obsługiwać kategorie, także wynikające z tego zmniejszenie pamięci. Wypróbuj R.
Następnie nie trzeba ręcznie przycinać / łączyć poziomów jakościowych, co brzmi jak poważny ból. I nawet jeśli tak, nie masz gwarancji, że najbardziej zaludnione kategorie są najbardziej przewidywalne. Kontroluj złożoność lasów losowych za pomocą parametru nodesize : zacznij od dużego nodesize i stopniowo go zmniejszaj (jest to wyszukiwanie hiperparametrów).
Przydatny będzie wybór zmiennych. @lorelai daje dobre rekomendacje. Spróbuj wyeliminować bezużyteczne (mało ważne lub wysoce skorelowane) funkcje. Konstrukcja drzewa jest kwadratowa w stosunku do liczby funkcji, więc jeśli nawet wyeliminujesz jedną trzecią, zapłaci dywidendy.
źródło
Powinieneś spojrzeć na pakiet H2O.ai. Obsługuje zmienne kategoryczne od razu po wyjęciu z pudełka, bez konieczności kodowania (upewnij się, że zmienne są czynnikami).
Szczególnie podoba mi się ich implementacja Gradient Boosted Machine (GBM), ponieważ po zbudowaniu modelu można następnie spojrzeć na zmienne znaczenie. GBM mają również tę zaletę, że są odporne na nadmierne dopasowanie.
Jeśli chcesz eksplorować inne modele, mają one: GLM, Random Forest, Naive Bayes, Deep Learning itp.
Zobacz: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html
Jest także łatwy w instalacji (Windows, Linux, Mac) i łatwy w obsłudze z API za pomocą R, Python, Java i Scala.
Może używać wielu rdzeni, aby przyspieszyć.
W najbliższej przyszłości będą obsługiwać procesory graficzne.
Jest to również oprogramowanie typu open source i bezpłatne (istnieje obsługa Enterprise).
źródło