Regresja logistyczna dużych zbiorów danych

9

Mam zestaw danych zawierający około 5000 funkcji. Dla tych danych najpierw użyłem testu Chi Square do wyboru funkcji; potem otrzymałem około 1500 zmiennych, które wykazały związek istotności ze zmienną odpowiedzi.

Teraz muszę dopasować do tego regresję logistyczną. Używam pakietu glmulti dla R (pakiet glmulti zapewnia efektywny wybór podzbiorów dla vlm), ale może używać tylko 30 funkcji jednocześnie, w przeciwnym razie jego wydajność spada, ponieważ liczba wierszy w moim zestawie danych wynosi około 20000.

Czy istnieje inne podejście lub techniki rozwiązania powyższych problemów? Jeśli zastosuję powyższą metodę, dopasowanie modelu zajmie zbyt dużo czasu.

Vijay
źródło
8
Jeśli umieścisz swój zestaw danych w pamięci pojedynczego komputera, nie nazwałbym tego problemem „Big Data”, szczególnie jeśli robisz to w tytule pytania
logc
Używam sklearn„s LogisticRegressioni rozwiązuje 4000 funkcji, 20.000 wierszy problemu w około minuty na moim laptopie.
Thomas Ahle,

Odpowiedzi:

13

Nie należy przeprowadzać przeglądu funkcji, a następnie wprowadzać funkcje, które przeżyły, do metody, która nie rozumie, ile tortur przeprowadzono wcześniej. Lepiej jest zastosować metodę, która może obsłużyć wszystkie potencjalne cechy (np. Elastyczną siatkę). Sugestie innych osób dotyczące stosowania redukcji danych są również doskonałymi pomysłami.

Frank Harrell
źródło
Czy są na to dowody? O / w wydaje się, że jest to tak samo heurystyczne, jak screening fabularny.
Zubin,
2
Karane oszacowanie maksymalnego prawdopodobieństwa uwzględnia kontekst, np. W lasso szacunek współczynnika regresji zmiennej będzie mniejszy, jeśli weźmiesz pod uwagę 1000 niewybranych zmiennych, niż jeśli weźmiesz pod uwagę 100 niewybranych zmiennych. W przeciwnym razie zmienne są wybierane w sposób stronniczy, a ponowne zamontowanie zmiennej w drugim kroku traci kontekst.
Frank Harrell,
Czy mógłbyś wyjaśnić, co masz na myśli mówiąc o uprzedzeniach? Zastanawiam się, ponieważ w trywialnym sensie lasso jest zawsze stronnicze, więc musisz odwoływać się do dodatkowego uprzedzenia. Ponadto istnieją pewne dwustopniowe podejścia o rozsądnych właściwościach, np. Pdfs.semanticscholar.org/d90a/…
jmb 28.10.16
2
W lasso celowo dociska współczynniki do zera, aby uniknąć nadmiernego dopasowywania. Niezenalizowane parametry prowadzą do zbyt ekstremalnych przewidywanych wartości. Dopasowanie „wybranych” zmiennych w nieopenowanym modelu spowoduje cofnięcie niezbędnego odchylenia lassa , powodując znacznie zawyżenie przewidywanych wartości.
Frank Harrell,
10

Pierwszym podejściem jest użycie PCA w celu zmniejszenia wymiarów zestawu danych. Staraj się zachować ~ 97% całkowitej wariancji, może to nieco pomóc.

Inną opcją jest użycie stochastycznego spadku gradientu, może to być znacznie szybszy algorytm i pasujący do pamięci R.

EDYCJA: Jednym z problemów z R jest to, że możesz używać tylko pamięci RAM, więc jeśli masz tylko 8 GB pamięci, to do tego jesteś ograniczony. Zetknąłem się z wieloma problemami i od tego czasu zacząłem używać scikit-learn Pythona, który wydaje się znacznie lepiej obsługiwać większe zbiory danych.

Bardzo fajny wykres, który daje pewne wyobrażenie o miejscach do rozpoczęcia w oparciu o rozmiar zestawu danych, można znaleźć tutaj: http://3.bp.blogspot.com/-dofu6J0sZ8o/UrctKb69QdI/AAAAAAAADfg/79ewPecn5XU/s1600/scikit-learn-flow -chart.jpg

wprowadź opis zdjęcia tutaj

mike1886
źródło
8
Dużym problemem przy stosowaniu PCA w ten sposób jest to, że cała relacja między zmienną odpowiedzi a zmiennymi niezależnymi może znajdować się w 3% całkowitej wariancji, którą zaniedbujesz. Wydaje się, że nie ma też ogólnego sposobu określania, ile głównych komponentów należy użyć, ponieważ bardzo najmniejszy komponent mógłby być proporcjonalny do samej odpowiedzi, a zatem stanowiłby optymalny wybór zmiennych do uwzględnienia.
whuber
1
Myślę, że rzeczywiście, jeśli jesteś w stanie załadować zestaw danych do pamięci głównej (co, jak zakładam, biorąc pod uwagę to, co wyjaśnisz), stochastyczne zejście gradientu jest pierwszym krokiem, który powinieneś zrobić przed wypróbowaniem technik redukcji wymiarów. Z Scikit-learn na Pythonie (lub R, ale nie jestem użytkownikiem tego języka), działałoby to dobrze.
Bertrand R
Myślę, że to przydatna odpowiedź, ale myślę, że OP pyta o regresję logistyczną, a nie o redukcję funkcji. Może poradzisz sobie z tą częścią pytania w wydaniu?
logc
Nie jestem pewien, jak przydatny jest PCA w przypadku problemów z regresją. Problem w tym, że PCA zachowuje największe wartości osobliwe macierzy wejściowej, ale pseudo-odwrotność macierzy odwraca wartości osobliwe, więc naprawdę chcesz zachować najmniejszą z pierwotnych wartości. Lepiej po prostu naszkicować dane: arxiv.org/abs/1411.4357
Thomas Ahle
4

Jak już wspomniano @Frank Harrell, użycie elastycznej siatki lub LASSO do przeprowadzenia regresji karnej ze wszystkimi 5000 cechami ( p ) byłoby dobrym początkiem do wyboru cech (nie można po prostu usunąć 3500 zmiennych, ponieważ nie są one „statystycznie istotne” z zależna zmienna zainteresowania). Każdą z tych metod można wykonać przy użyciu pakietu R glmnet. , .

Aby uwzględnić relacje wspólne między potencjalnymi zmiennymi predykcyjnymi będącymi przedmiotem zainteresowania ( p = 5000), zaleciłbym uruchomienie losowego lasu za pomocą randomForestpakietu i / lub zwiększenie gradientu za pomocą gbmpakietu w celu oceny względnej ważności potencjalnych zmiennych predykcyjnych w odniesieniu do wyniku binarnego. Dzięki tym informacjom będziesz znacznie lepiej przygotowany do zbudowania bardziej oszczędnego modelu regresji logistycznej.

Matt Reichenbach
źródło
3
Nie, nie jest poprawne pogłębianie danych, aby zdecydować, które parametry usunąć z modelu. Wartość losowych lasów, takich jak elastyczna siatka, polega na tym, że obejmuje ona odpowiednią ilość kurczenia się. Zaczynając od podzbioru zmiennych znalezionych w sposób, który nie został zamaskowanyYspowoduje stronniczość.
Frank Harrell,
1

Zakładam, że nie jesteś ograniczony do R, ponieważ jest to problem dużych zbiorów danych, którego prawdopodobnie nie powinieneś. Możesz wypróbować MLlib , która jest skalowalną biblioteką uczenia maszynowego Apache Spark.

Z kolei Apache Spark to szybki i ogólny silnik do przetwarzania danych na dużą skalę w pamięci. Działają one na platformie Hadoop, która umożliwia rozproszone przetwarzanie dużych zbiorów danych w klastrach komputerów przy użyciu prostych modeli programowania. Został zaprojektowany do skalowania z pojedynczych serwerów na tysiące komputerów, z których każdy oferuje lokalne obliczenia i pamięć.

Pamiętaj, że „tysiące komputerów” jest opcjonalne (!), Możesz je również skonfigurować na lokalnym komputerze stacjonarnym do pracy / domu.

Wracając do MLlib, zawiera następujące algorytmy:

  • K-średnie grupowanie za pomocą K-średnich || inicjalizacja.
  • Regresja liniowa regulowana L1 i L2.
  • Regresja logistyczna regulowana przez L1 i L2.
  • Naprzemienne filtrowanie metodą najmniejszych kwadratów, z wyraźnymi ocenami lub niejawnymi opiniami.
  • Naiwna klasyfikacja Bayesa wielomianowa.
  • Spadek gradientu stochastycznego.

Jeśli regularnie pracujesz z dużymi zbiorami danych, może być konieczne przyjęcie rozwiązania Hadoop.

Zhubarb
źródło
0

Możesz wypróbować Vowpal Wabbit: Vowpal Wabbit . Działa dobrze z bardzo dużymi zestawami danych i bardzo dużą liczbą funkcji.

według strony internetowej:

To jest projekt rozpoczęty w Yahoo! Badania i kontynuacja w Microsoft Research w celu zaprojektowania szybkiego, skalowalnego i przydatnego algorytmu uczenia się. VW to esencja szybkości w uczeniu maszynowym, z łatwością ucząca się na podstawie zbiorów danych terafeature. Dzięki równoległemu uczeniu może przekroczyć przepustowość dowolnego interfejsu sieciowego jednej maszyny podczas uczenia liniowego, co jest pierwszym spośród algorytmów uczenia się.

użytkownik765195
źródło