Osadzania w uczeniu maszynowym: upraszczanie złożonych danych

Opublikowany: 2022-03-11

Praca z danymi nienumerycznymi może być trudna, nawet dla doświadczonych analityków danych. Typowy model uczenia maszynowego oczekuje, że jego funkcjami będą liczby, a nie słowa, wiadomości e-mail, strony internetowe, listy, wykresy lub rozkłady prawdopodobieństwa. Aby były użyteczne, dane muszą być najpierw przekształcone w przestrzeń wektorową. Ale jak?

Jednym z popularnych podejść byłoby traktowanie cechy nienumerycznej jako kategorycznej . Może to działać dobrze, jeśli liczba kategorii jest niewielka (na przykład, jeśli dane wskazują zawód lub kraj). Jeśli jednak spróbujemy zastosować tę metodę do wiadomości e-mail, prawdopodobnie otrzymamy tyle kategorii, ile jest próbek. Żadne dwa e-maile nie są dokładnie takie same, dlatego takie podejście byłoby bezużyteczne.

Innym podejściem byłoby zdefiniowanie odległości między próbkami danych , funkcja, która mówi nam, jak blisko są dowolne dwie próbki. Albo moglibyśmy zdefiniować miarę podobieństwa , która dawałaby nam te same informacje, z tą różnicą, że odległość między dwiema bliskimi próbkami jest mała, a podobieństwo duże. Obliczenie odległości (podobieństwa) między wszystkimi próbkami danych dałoby nam macierz odległości (lub podobieństwa). To są dane liczbowe, których moglibyśmy użyć.

Jednak te dane miałyby tyle wymiarów, ile jest próbek, co zwykle nie jest świetne, jeśli chcemy wykorzystać je jako cechę (patrz przekleństwo wymiarowości) lub je zwizualizować (choć jeden wykres może obsłużyć nawet 6D, mam jeszcze zobaczyć działkę 100D). Czy moglibyśmy zredukować liczbę wymiarów do rozsądnej ilości?

Odpowiedź brzmi tak! Po to właśnie mamy osadzenia .

Co to jest osadzanie i dlaczego go używać?

Osadzanie to niskowymiarowa reprezentacja danych wielowymiarowych. Zazwyczaj osadzanie nie przechwytuje wszystkich informacji zawartych w oryginalnych danych. Jednak dobre osadzenie uchwyci wystarczająco dużo, aby rozwiązać problem.

Istnieje wiele osadzeń dostosowanych do określonej struktury danych. Na przykład mogłeś słyszeć o word2vec dla danych tekstowych lub deskryptorach Fouriera dla danych obrazu kształtu. Zamiast tego omówimy, jak zastosować osadzania do dowolnych danych, w których możemy zdefiniować odległość lub miarę podobieństwa. Dopóki możemy obliczyć macierz odległości, natura danych jest całkowicie nieistotna. Będzie działać tak samo, czy to e-maile, listy, drzewa czy strony internetowe.

W tym artykule przedstawimy różne rodzaje osadzania i omówimy, jak działają niektóre popularne osadzania i jak możemy wykorzystać osadzanie do rozwiązywania rzeczywistych problemów związanych ze złożonymi danymi. Omówimy również wady i zalety tej metody, a także kilka alternatyw. Tak, niektóre problemy można lepiej rozwiązać innymi sposobami, ale niestety w uczeniu maszynowym nie ma złotego środka.

Zacznijmy.

Jak działają osadzania

Wszystkie osadzania próbują zredukować wymiarowość danych, zachowując „podstawowe” informacje w danych, ale każde osadzanie robi to na swój własny sposób. Tutaj przejdziemy przez kilka popularnych osadzeń, które można zastosować do macierzy odległości lub podobieństwa.

Nie będziemy nawet próbować zakrywać wszystkich osadzeń. Istnieje co najmniej tuzin dobrze znanych osadzeń, które mogą to zrobić i wiele mniej znanych osadzeń i ich odmian. Każdy z nich ma swoje podejście, zalety i wady.

Jeśli chcesz zobaczyć, jakie są inne osadzenia, możesz zacząć tutaj:

  • Podręcznik użytkownika do nauki Scikit
  • Elementy uczenia się statystycznego (wydanie drugie), rozdział 14

Macierz odległości

Omówmy krótko macierze odległości. Znalezienie odpowiedniej odległości dla danych wymaga dobrego zrozumienia problemu, pewnej znajomości matematyki, a czasem zwykłego szczęścia . W podejściu opisanym w tym artykule może to być najważniejszy czynnik przyczyniający się do ogólnego sukcesu lub porażki twojego projektu.

Należy również pamiętać o kilku szczegółach technicznych. Wiele algorytmów osadzania zakłada, że ​​macierz odległości (lub niepodobieństwa ) $\textbf{D}$ ma zera na swojej przekątnej i jest symetryczna. Jeśli nie jest symetryczny, możemy zamiast tego użyć $(\textbf{D} + \textbf{D}^T) / 2$. Algorytmy wykorzystujące sztuczkę z jądrem również zakładają, że odległość jest metryką, co oznacza, że ​​nierówność trójkąta zachodzi:

\[\dla wszystkich a, b, c \;\; d(a,c) \leq d(a,b) + d(b,c)\]

Ponadto, jeśli algorytm wymaga zamiast tego macierzy podobieństwa, możemy zastosować dowolną funkcję zmniejszającą monotonię, aby przekształcić macierz odległości w macierz podobieństwa: na przykład $\exp -x$.

Analiza głównych składowych (PCA)

Analiza głównych składowych (ang. Principal Component Analysis lub PCA) jest prawdopodobnie najczęściej stosowanym do tej pory osadzaniem. Pomysł jest prosty: znajdź transformację liniową cech, która maksymalizuje przechwyconą wariancję lub (równoważnie) minimalizuje kwadratowy błąd rekonstrukcji .

W szczególności, niech cechy będą przykładową macierzą $\textbf{X} \in \mathbb{R}^{n \times p}$ mają cechy $n$ i wymiary $p$. Dla uproszczenia załóżmy, że średnia próbki danych wynosi zero. Możemy zmniejszyć liczbę wymiarów z $p$ do $q$, mnożąc $\textbf{X}$ przez macierz ortonormalną $\textbf{V}_q \in \mathbb{R}^{p \times q}$ :

\[\hat{\textbf{X}} = \textbf{X} \textbf{V}_q\]

Wtedy $\hat{\textbf{X}} \in \mathbb{R}^{n \times q}$ będzie nowym zestawem funkcji. Aby zmapować nowe cechy z powrotem do oryginalnej przestrzeni (ta operacja nazywa się rekonstrukcją ), wystarczy pomnożyć ją ponownie przez $\textbf{V}_q^T$.

Teraz musimy znaleźć macierz $\textbf{V}_q$, która minimalizuje błąd rekonstrukcji:

\[\min_{\textbf{V}_q} ||\textbf{X}\textbf{V}_q\textbf{V}_q^T - \textbf{X}||^2\]

Kolumny macierzy $\textbf{V}_q$ nazywamy kierunkami składowymi głównymi, a kolumny $\hat{\textbf{X}}$ składowymi głównymi. Numerycznie możemy znaleźć $\textbf{V}_q$, stosując dekompozycję SVD do $\textbf{X}$, chociaż istnieją inne, równie ważne sposoby, aby to zrobić.

PCA można zastosować bezpośrednio do cech numerycznych. Lub, jeśli nasze cechy są nieliczbowe, możemy zastosować je do macierzy odległości lub podobieństwa.

Jeśli używasz Pythona, PCA jest zaimplementowane w scikit-learn.

Zaletą tej metody jest to, że jest szybka w obliczeniach i dość odporna na zakłócenia w danych.

Wadą byłoby to, że może przechwytywać tylko struktury liniowe, więc nieliniowe informacje zawarte w oryginalnych danych prawdopodobnie zostaną utracone.

PCA jądra

Kernel PCA to nieliniowa wersja PCA. Pomysł polega na użyciu sztuczki jądra , o której prawdopodobnie słyszałeś, jeśli znasz Support Vector Machines SVM.

W szczególności istnieje kilka różnych sposobów obliczania PCA. Jednym z nich jest obliczenie rozkładu własnego podwójnie wyśrodkowanej wersji macierzy gramowej $\textbf{X} \textbf{X}^T \in \mathbb{R}^{n \times n}$. Teraz, jeśli obliczymy macierz jądra $\textbf{K} \in \mathbb{R}^{n \times n}$ dla naszych danych, Kernel PCA potraktuje ją jako macierz gramów, aby znaleźć główne składniki.

Niech $x_i$, $i \in {1,..,n}$ będą przykładami cech. Macierz jądra jest zdefiniowana przez funkcję jądra $K(x_i,x_j)=\langle \phi(x_i),\phi(x_j) \rangle$.

Popularnym wyborem jest jądro radialne:

\[K(x_i,x_j)=\exp -\gamma \cdot d(x_i,x_j)\]

gdzie $d$ jest funkcją odległości.

Kernel PCA wymagał od nas określenia odległości. Na przykład dla obiektów numerycznych moglibyśmy użyć odległości euklidesowej: $d(x_i,x_j)=\vert\vert x_i-x_j \vert \vert ^2$.

W przypadku funkcji nieliczbowych może być potrzebna kreatywność. Jedną rzeczą do zapamiętania jest to, że ten algorytm przyjmuje naszą odległość jako metrykę.

Jeśli używasz Pythona, Kernel PCA jest zaimplementowany w scikit-learn.

Zaletą metody Kernel PCA jest możliwość przechwytywania nieliniowych struktur danych.

Wadą jest to, że jest wrażliwy na szum w danych i że wybór odległości i funkcji jądra ma duży wpływ na wyniki.

Skalowanie wielowymiarowe (MDS)

Skalowanie wielowymiarowe (MDS) próbuje globalnie zachować odległości między próbkami. Pomysł jest dość intuicyjny i dobrze współpracuje z macierzami odległości.

W szczególności, biorąc pod uwagę próbki cech $x_i$, $i \in {1,..,n}$ i funkcję odległości $d$, obliczamy próbki nowych cech $z_i \in \mathbb{R}^{q}$, $i \in {1,..,n}$ minimalizując funkcję stresu :

\[\min_{z_1,..,z_n} \sum_{1 \leq i < j \leq n} (d(x_i, x_j) - ||z_i - z_j||)^2\]

Jeśli używasz Pythona, MDS jest zaimplementowany w scikit-learn. Jednak scikit-learn nie obsługuje transformacji punktów poza próbą, co może być niewygodne, jeśli chcemy użyć osadzania w połączeniu z modelem regresji lub klasyfikacji. W zasadzie jednak jest to możliwe.

Zaletą MDS jest to, że jego idea doskonale pasuje do naszego frameworka i że nie ma na niego wpływu szum w danych.

Wadą jest to, że jego implementacja w scikit-learn jest dość powolna i nie obsługuje transformacji poza próbką.

Zastosowanie: śledzenie przesyłki

Kilka osad na małej tropikalnej wyspie rozwinęło usługi przesyłek paczek, aby zaspokoić lokalny przemysł turystyczny. Kupiec w jednej z tych osiedli postanowił podjąć działania mające na celu zdobycie przewagi nad konkurencją, dlatego utworzył system satelitarnego nadzoru, śledzący wszystkie przesyłki paczek na wyspie. Po zebraniu danych sprzedawca zadzwonił do analityka danych (czyli do nas!), aby pomógł mu odpowiedzieć na następujące pytanie: Czy możemy przewidzieć miejsce docelowe paczki, która jest obecnie w drodze?

Zestaw danych zawiera informacje o 200 śledzonych przesyłkach. Dla każdej śledzonej przesyłki istnieje lista (x,y)-współrzędnych wszystkich lokalizacji, w których paczka została zauważona, co zwykle mieści się w przedziale od 20 do 50 obserwacji. Poniższy wykres pokazuje, jak wyglądają te dane.

Zastosowanie: śledzenie przesyłki

Te dane wyglądają jak kłopoty – właściwie to dwa różne rodzaje kłopotów.

Pierwszy problem polega na tym, że dane, z którymi mamy do czynienia, są wielowymiarowe. Na przykład, jeśli każda paczka została zauważona w 50 lokalizacjach, nasze dane miałyby 100 wymiarów – brzmi jak dużo w porównaniu z 200 próbkami do Twojej dyspozycji.

Drugi problem: różne trasy wysyłki mają w rzeczywistości różną liczbę obserwacji, więc nie możemy po prostu układać list ze współrzędnymi w celu przedstawienia danych w formie tabelarycznej (a nawet gdyby tak było, to nadal nie miałoby sensu).

Kupiec niecierpliwie bębni palcami po stole, a analityk danych stara się nie okazywać żadnych oznak paniki.

Tutaj przydadzą się macierze odległości i osadzenia. Musimy tylko znaleźć sposób na porównanie dwóch tras wysyłki. Odległość Frechet wydaje się rozsądnym wyborem. Dysponując odległością możemy obliczyć macierz odległości.

Uwaga: ten krok może chwilę potrwać. Musimy obliczyć $O(n^2)$ odległości dla każdej odległości mającej $O(k^2)$ iteracji, gdzie $n$ to liczba próbek, a $k$ to liczba obserwacji w jednej próbce. Sprawne napisanie funkcji odległości jest kluczowe. Na przykład w Pythonie możesz użyć numba, aby wielokrotnie przyspieszyć to obliczenie.

Wizualizacja osadzeń

Teraz możemy użyć osadzania, aby zmniejszyć liczbę wymiarów z 200 do zaledwie kilku. Widzimy wyraźnie, że istnieje tylko kilka szlaków handlowych, więc możemy mieć nadzieję na znalezienie dobrej reprezentacji danych nawet w dwóch lub trzech wymiarach. Użyjemy osadzeń, które omówiliśmy wcześniej: PCA, Kernel PCA i MDS.

Na poniższych wykresach można zobaczyć oznaczone dane trasy (podane w celach demonstracyjnych) i ich reprezentację przez osadzenie w 2D i 3D (od lewej do prawej). Opisane dane oznaczają cztery placówki handlowe połączone sześcioma szlakami handlowymi. Dwa z sześciu szlaków handlowych są dwukierunkowe, co daje w sumie osiem grup wysyłkowych (6+2). Jak widać, otrzymaliśmy dość wyraźne oddzielenie wszystkich ośmiu grup wysyłkowych za pomocą embeddingów 3D.

Wizualizacja osadzeń

To dobry początek.

Osadzania w potoku modelowym

Teraz jesteśmy gotowi do trenowania osadzania. Chociaż MDS wykazał najlepsze wyniki, jest raczej powolny; również implementacja scikit-learn nie obsługuje transformacji poza próbką. Nie jest to problem dla badań, ale może być dla produkcji, więc zamiast tego użyjemy Kernel PCA. W przypadku jądra PCA nie powinniśmy zapominać o uprzednim nałożeniu jądra radialnego na macierz odległości.

Jak wybrać liczbę wymiarów wyjściowych? Analiza wykazała, że ​​nawet 3D działa dobrze. Aby być po bezpiecznej stronie i nie pominąć żadnych ważnych informacji, ustawmy wyjście osadzania na 10D. Aby uzyskać najlepszą wydajność, liczbę wymiarów wyjściowych można ustawić jako hiperparametr modelu, a następnie dostroić za pomocą weryfikacji krzyżowej.

Tak więc będziemy mieli 10 funkcji numerycznych, których możemy użyć jako danych wejściowych dla prawie każdego modelu klasyfikacji. Co powiesz na jeden model liniowy i jeden nieliniowy: powiedzmy, regresja logistyczna i wzmocnienie gradientowe? Dla porównania użyjmy również tych dwóch modeli z matrycą pełnej odległości jako dane wejściowe. Ponadto przetestujmy również SVM (SVM jest zaprojektowany do bezpośredniej pracy z macierzą odległości, więc nie będzie wymagane osadzanie).

Dokładność modelu w zestawie testowym pokazano poniżej (wygenerowano 10 zestawów danych pociągów i testowych, abyśmy mogli oszacować wariancję modelu):

  • Gradient Boosting w połączeniu z osadzaniem (KernelPCA+GB) zajmuje pierwsze miejsce. Pokonał Gradient Boosting bez osadzania (GB). Tutaj Kernel PCA okazał się przydatny.
  • Regresja logistyczna była w porządku. Co ciekawe, regresja logistyczna bez osadzania (LR) poradziła sobie lepiej niż z osadzeniem (KernelPCA+LR). Nie jest to całkowicie nieoczekiwane. Modele liniowe nie są zbyt elastyczne, ale stosunkowo trudno je przesadzić. W tym przypadku utrata informacji spowodowana osadzaniem wydaje się przewyższać korzyści wynikające z mniejszej wymiarowości wejściowej.
  • Wreszcie, SVM również radził sobie dobrze, chociaż wariancja tego modelu jest dość znaczna.

Dokładność modelu

Dokładność modelu

Kod Pythona dla tego przypadku użycia jest dostępny na GitHub.

Wniosek

Wyjaśniliśmy, czym są osadzania i pokazaliśmy, jak można ich używać w połączeniu z macierzami odległości do rozwiązywania rzeczywistych problemów. Czas na werdykt:

Czy osadzania są czymś, z czego powinien korzystać analityk danych? Przyjrzyjmy się obu stronom tej historii.

Plusy i minusy korzystania z osadzeń

Plusy:

  • Takie podejście pozwala nam pracować z nietypowymi lub złożonymi strukturami danych, o ile możesz zdefiniować odległość, którą – przy pewnym stopniu wiedzy, wyobraźni i szczęścia – zazwyczaj możesz.
  • Wynikiem są niskowymiarowe dane liczbowe, które można łatwo analizować, grupować lub używać jako funkcji modelu dla prawie każdego modelu uczenia maszynowego.

Cons:

  • Stosując takie podejście, z konieczności stracimy pewne informacje:

    • W pierwszym kroku, kiedy zastępujemy oryginalne dane macierzą podobieństwa
    • Podczas drugiego kroku, gdy zmniejszamy wymiarowość za pomocą osadzania
  • W zależności od danych i funkcji odległości obliczenie macierzy odległości może być czasochłonne. Można to złagodzić przez wydajnie zapisaną funkcję odległości.
  • Niektóre osadzania są bardzo wrażliwe na szum w danych. Można to złagodzić przez dodatkowe czyszczenie danych.
  • Niektóre osadzania są wrażliwe na dobór hiperparametrów. Można to złagodzić przez dokładną analizę lub dostrojenie hiperparametrów.

Alternatywy: Dlaczego nie używać…?

  • Dlaczego nie skorzystać z osadzania bezpośrednio na danych, a nie z macierzy odległości?
    Jeśli znasz osadzanie, które może efektywnie bezpośrednio zakodować Twoje dane, użyj go. Problem w tym, że nie zawsze istnieje.
  • Dlaczego po prostu nie użyć klastryzacji na macierzy odległości?
    Jeśli Twoim jedynym celem jest segmentacja zbioru danych, byłoby to całkowicie w porządku. Niektóre metody klasteryzacji również wykorzystują osadzania (na przykład klastrowanie widmowe). Jeśli chcesz dowiedzieć się więcej, oto samouczek dotyczący klastryzacji.
  • Dlaczego po prostu nie użyć macierzy odległości jako funkcji?
    Rozmiar macierzy odległości to $(n_{próbek}, n_{próbek})$. Nie wszystkie modele radzą sobie z tym wydajnie — niektóre mogą się przesadzać, niektóre wolno się dopasowują, inne mogą nie pasować całkowicie. Dobrym wyborem byłyby tutaj modele o niskiej wariancji, takie jak modele liniowe i/lub uregulowane.
  • Dlaczego po prostu nie użyć SVM z macierzą odległości?
    SVM to świetny model, który dobrze sprawdził się w naszym przypadku użycia. Są jednak pewne zastrzeżenia. Po pierwsze, jeśli chcemy dodać inne funkcje (mogą to być po prostu proste liczby), nie będziemy mogli tego zrobić bezpośrednio. Musielibyśmy włączyć je do naszej macierzy podobieństwa i potencjalnie stracić cenne informacje. Po drugie, tak dobry jak SVM, inny model może działać lepiej w przypadku konkretnego problemu.
  • Dlaczego po prostu nie skorzystać z głębokiego uczenia?
    To prawda, że ​​w przypadku każdego problemu możesz znaleźć odpowiednią sieć neuronową, jeśli będziesz szukać wystarczająco długo. Należy jednak pamiętać, że proces wyszukiwania, trenowania, walidacji i wdrażania tej sieci neuronowej niekoniecznie będzie prosty. Tak więc, jak zawsze, kieruj się najlepszym osądem.

W jednym zdaniu

Osadzenia w połączeniu z macierzami odległości są niezwykle przydatnym narzędziem, jeśli zdarzy ci się pracować ze złożonymi danymi nienumerycznymi, zwłaszcza gdy nie możesz bezpośrednio przekształcić danych w przestrzeń wektorową i wolisz mieć niskowymiarowe dane wejściowe dla swojego modelu.