[44][Machine Learning] (5)

Obliczenia przybliżone, rozmyte i granularne

Na zajęciach z inteligencji obliczeniowej zajmuję się klasyfikacją krótkich tekstów. Jeden z artykułów, które znalazłem, w dużym stopniu wykorzystuje obliczenia granularne, ale staram się znaleźć przyzwoite wyjaśnienie, czym dokładnie jest. Z tego, co mogę wyciągnąć z artykułu, wydaje mi się, że obliczenia granularne są bardzo podobne do zbiorów rozmytych. Na czym więc dokładnie polega różnica. Pytam też o zestawy przybliżone, bo jestem ich ciekawa i jak się odnoszą do zbiorów rozmytych. Jeżeli w ogóle.

„Ziarnistość” odnosi się do rozdzielczości analizowanych zmiennych. Jeśli analizujesz wzrost ludzi, możesz użyć zmiennych o przebiegu kursu, które mają tylko kilka możliwych wartości – np. „Powyżej średniej, średniej, poniżej średniej” – lub zmienna drobnoziarnista, zawierająca wiele lub nieskończoną liczbę wartości – np. wartości całkowite lub liczba rzeczywista wartości. Miara jest „rozmyta”, jeśli rozróżnienie między wartościami alternatywnymi nie jest wyraźne. W zmiennej wysokości o ziarnistej ziarnistości, miara „ostra” oznaczałaby, że dana osoba mogłaby mieć przypisaną tylko jedną wartość – np. wysoka osoba jest albo „ponadprzeciętna”, albo „przeciętna”. Z kolei miara „rozmyta” pozwala na określenie stopni przynależności dla każdej wartości, przy czym „członkostwo” przyjmuje wartości od 0 do 1,0. Zatem osoba wysoka może mieć wartości „0,5 powyżej średniej”, „0,5 średniej”, „0,0 poniżej średniej”. Wreszcie, miara jest „zgrubna”, gdy podane są dwie wartości: górna i dolna granica jako oszacowanie „wyraźnej” miary. W naszym przykładzie wysokiej osoby, przybliżona miara to {GÓRNA = ponadprzeciętna, NISKA = średnia}.

Możesz zapytać, po co w ogóle używać miar ziarnistych, rozmytych lub przybliżonych? Dlaczego nie zmierzyć wszystkiego w ładnych, precyzyjnych liczbach rzeczywistych? Ponieważ wiele rzeczywistych zjawisk nie ma dobrych, wiarygodnych wewnętrznych miar i procedur pomiarowych, które dają liczbę rzeczywistą. Jeśli poprosisz pary małżeńskie o ocenę jakości ich małżeństwa w skali od 1 do 10 lub od 1,00 do 10,00, mogą podać liczbę (lub zakres liczb), ale na ile wiarygodne są te raporty? Użycie miary o ziarnistej strukturze (np. „Szczęśliwy”, „neutralny / mieszany”, „nieszczęśliwy”), rozmytej lub przybliżonej może być bardziej wiarygodne i wiarygodne w Twojej analizie. Ogólnie rzecz biorąc, znacznie lepiej jest używać miar zgrubnych / surowych, niż słabo używać miar precyzyjnych / drobnoziarnistych.

Uczenie maszynowe – funkcje inżynierii na podstawie danych daty / czasu

Jakie są typowe / najlepsze praktyki dotyczące obsługi danych czasowych dla aplikacji uczenia maszynowego? Na przykład, jeśli w zbiorze danych znajduje się kolumna z sygnaturą czasową zdarzenia, na przykład „2014-05-05”, w jaki sposób można wyodrębnić przydatne funkcje z tej kolumny, jeśli takie istnieją?

W kilku przypadkach dane i zdarzenia w szeregach czasowych mają charakter sezonowy. W takich przypadkach miesiąc i rok wydarzenia ma duże znaczenie. Dlatego w takich scenariuszach można używać zmiennych binarnych do określenia, czy zdarzenie ma miejsce w danym miesiącu / roku, czy nie. Mam nadzieję, że to odpowiada na twoje pytanie. Jeśli nie, uprzejmie bądź bardziej szczegółowy, co dokładnie próbujesz osiągnąć

Podziel dane na okna i znajdź funkcje dla tych okien, takie jak współczynniki autokorelacji, falki itp., I użyj tych funkcji do nauki. Na przykład, jeśli masz dane dotyczące temperatury i ciśnienia, podziel je na poszczególne parametry i oblicz cechy, takie jak liczba lokalnych minimów w tym oknie i inne, i użyj tych funkcji w swoim modelu.

Porównanie algorytmów podobieństwa Mahouta

Które z poniższych jest najlepsze (lub szeroko stosowane) do obliczania miary podobieństwa element-element w mahout i dlaczego?

*Korelacja Pearsona

*Korelacja Spearmana

*Odległość euklidesowa

*Współczynnik Tanimoto

*Podobieństwo LogLikelihood

Czy jest jakaś reguła kciuka, którą można wybrać z tego zestawu algorytmów i jak rozróżnić każdy z nich?

Dla tych, którzy nie są znani, osoby polecające przedmiot obliczają podobieństwa między przedmiotami, w przeciwieństwie do rekomendujących użytkowników (lub użytkowników), które obliczają podobieństwa między użytkownikami. Chociaż niektóre algorytmy mogą być używane do obu tych celów, to pytanie dotyczy algorytmów itemitem (dziękujemy za sprecyzowanie pytania).

Trafność lub skuteczność rekomendujących jest oceniana na podstawie porównania rekomendacji z wcześniej zebranym zbiorem danych (zbiorem szkoleniowym). Na przykład, mam dane koszyka z ostatnich sześciu miesięcy; Użyję pierwszych 5 miesięcy jako dane treningowe, a następnie uruchomię różne algorytmy i porównam jakość z tym, co naprawdę wydarzyło się w szóstym miesiącu. Powodem, dla którego Mahout jest dostarczany z tak wieloma algorytmami, jest to, że różne algorytmy są mniej lub bardziej efektywne w każdym zestawie danych, z którym możesz pracować. Idealnie byłoby więc przeprowadzić testy, jak opisałem, z wieloma algorytmami i porównać dokładność, a następnie wybrać zwycięzcę. Co ciekawe, możesz również wziąć pod uwagę inne czynniki, takie jak potrzeba zminimalizowania zbioru danych (ze względu na wydajność) i uruchamiać testy tylko z określoną częścią dostępnych danych szkoleniowych. W takim przypadku jeden algorytm może działać lepiej z mniejszym zestawem danych, ale inny może działać z pełnym zestawem. Następnie możesz zważyć wydajność VS dokładność VS wyzwanie implementacji (takie jak wdrożenie w klastrze Hadoop). Dlatego różne algorytmy są dostosowane do różnych projektów. Istnieje jednak kilka ogólnych zasad:

  1. Wszystkie algorytmy zawsze radzą sobie lepiej z niezredukowanymi zbiorami danych (im więcej danych, tym lepiej).
  2. Bardziej złożone algorytmy niekoniecznie są lepsze.

Proponuję zacząć od prostego algorytmu i upewnić się, że dane są wysokiej jakości. Jeśli masz więcej czasu, możesz zaimplementować bardziej złożone algorytmy i utworzyć porównanie, które będzie unikalne dla Twojego zestawu danych. Większość moich informacji pochodzi z tego badania. Znajdziesz tam wiele szczegółów na temat implementacji.

Konsekwencje skalowania funkcji

Obecnie używam SVM i skaluję moje funkcje szkoleniowe do zakresu [0,1]. Najpierw dopasowuję / przekształcam mój zestaw uczący, a następnie stosuję tę samą transformację do mojego zestawu testowego. Na przykład:

### Skonfiguruj transformację i zastosuj do zestawu uczącego

min_max_scaler = MinMaxScaler (feature_range = (0, 1))

X_train = min_max_scaler.fit_transform (X_train)

### Przeprowadź transformację na zbiorze testowym

X_test = min_max_scaler.transform (X_test)

Załóżmy, że dana cecha w zbiorze uczącym ma zakres [0,100], a ta sama cecha w zbiorze testowym ma zakres [-10,120]. W zbiorze uczącym ta cecha zostanie odpowiednio przeskalowana do [0,1], podczas gdy w zbiorze testowym ta cecha zostanie przeskalowana do zakresu poza pierwszym określonym, na przykład [-0.1,1.2]. Zastanawiałem się, jakie są konsekwencje tego, że funkcje zestawu testowego są poza zakresem tych używanych do trenowania modelu? Czy to problem?

W każdej klasie będziesz mieć rozkłady wartości funkcji. To samo w sobie nie jest powodem do niepokoju. Z nieco teoretycznego punktu widzenia możesz zadać sobie pytanie, dlaczego powinieneś skalować swoje funkcje i dlaczego powinieneś je skalować w dokładnie wybrany sposób. Jednym z powodów może być to, że twój konkretny algorytm uczący jest znany z tego, że zbiegają się szybciej (lepiej) z wartościami około 0-1 niż z cechami, które obejmują inne rzędy wielkości. W takim przypadku prawdopodobnie wszystko w porządku. Domyślam się, że Twoja SVM jest w porządku: chcesz uniknąć zbyt dużych liczb ze względu na iloczyn wewnętrzny, ale maksimum 1,2 w porównaniu z maksimum 1,0 nie zrobi dużej różnicy. (OTOH, gdybyś np. Wiedział, że twój algorytm nie akceptuje wartości ujemnych, to oczywiście miałbyś kłopoty). Praktyczne pytanie brzmi, czy Twój model działa dobrze w przypadkach, które są nieco poza zakresem objętym treningiem. Uważam, że najlepiej i prawdopodobnie można na to odpowiedzieć, testując takie przypadki / sprawdzając wyniki testów pod kątem spadku wydajności w przypadkach spoza domeny szkoleniowej. Jest to ważna obawa, a przyjrzenie się temu byłoby częścią walidacji twojego modelu. Obserwowanie różnic w opisywanym rozmiarze to IMHO powód, aby dokładnie przyjrzeć się stabilności modelu.

To miał być komentarz, ale jest za długi. Fakt, że zestaw testowy ma inny zakres, może oznaczać, że zbiór uczący nie jest dobrą reprezentacją zestawu testowego. Jeśli jednak różnica jest naprawdę niewielka, jak w Twoim przykładzie, prawdopodobnie nie wpłynie to na Twoje przewidywania. Niestety, nie sądzę, że mam dobry powód, by sądzić, że w żadnych okolicznościach nie wpłynie to na SVM. Zauważ, że uzasadnienie dla użycia MinMaxScalar jest (zgodnie z dokumentacją): Motywacja do korzystania z tego skalowania obejmuje odporność na bardzo małe odchylenia standardowe cech i zachowanie zerowych wpisów w rzadkich danych. Dlatego ważne jest, aby upewnić się, że Twoje dane pasują do tego przypadku. Jeśli naprawdę martwisz się o zakres różnicy, powinieneś zamiast tego użyć zwykłej standaryzacji (takiej jak preprocessing.scale).

Jak połączyć eksplorację danych z procesem uczenia maszynowego

Chcę napisać usługę eksploracji danych w Google Go, która zbiera dane poprzez skrobanie i interfejsy API. Jednak ponieważ Go nie ma dobrego wsparcia dla ML, chciałbym robić rzeczy ML w Pythonie. Mając tło internetowe, połączyłbym obie usługi z czymś takim jak RPC, ale ponieważ uważam, że jest to powszechny problem w nauce o danych, myślę, że istnieje lepsze rozwiązanie. Na przykład w większości protokołów (internetowych) brakuje:

* buforowanie między procesami

* grupowanie w wielu instancjach

Więc jakiego rodzaju bibliotek używają naukowcy zajmujący się danymi do łączenia różnych języków / procesów?

Data Science Toolkit to potężna biblioteka (lub technicznie zbiór bibliotek), która jest dostępna w wielu językach. Na przykład używam implementacji o nazwie RDSTK w R. W przypadku Twojego preferowanego języka, Google Go, jest tutaj lista bibliotek internetowych, która wygląda bardzo użytecznie.

Różnica rekomendacji opartych na przedmiotach i na użytkownikach w Mahout

Chciałbym wiedzieć, jak dokładnie różnią się od siebie rekomendacje oparte na użytkownikach i przedmiotach. To definiuje 

Oparte na użytkownikach: polecaj produkty, znajdując podobnych użytkowników. Jest to często trudniejsze do skalowania ze względu na dynamiczny charakter użytkowników.

Na podstawie pozycji: oblicz podobieństwo między przedmiotami i przedstaw zalecenia. Pozycje zwykle nie zmieniają się zbytnio, więc często można to obliczyć offline.

Ale chociaż istnieją dwa rodzaje rekomendacji, rozumiem, że oba przyjmą pewien model danych (powiedzmy 1,2 lub 1,2, .5 jako item1, item2, value lub user1, user2, value gdzie value nie jest obowiązkowe) i wykona wszystkie obliczenia jako miara podobieństwa i wbudowana funkcja rekomendująca, którą wybraliśmy i możemy uruchomić obie rekomendacje oparte na użytkowniku / pozycji oparta na tych samych danych (czy to prawidłowe założenie ?). Chciałbym więc wiedzieć, jak dokładnie i w jakich aspektach te dwa typy algorytmów się różnią.

Jakie są najlepsze praktyki anonimizacji nazw użytkowników w danych?

Pracuję nad projektem, w którym prosi się kolegów uczniów o udostępnienie ich oryginalnych danych tekstowych do dalszej analizy przy użyciu technik eksploracji danych. Myślę, że należałoby anonimizować nazwiska uczniów w ich zgłoszeniach. Pomijając lepsze rozwiązania adresu URL, w którym uczniowie przesyłają swoje prace, a skrypt zaplecza wstawia zanonimizowany identyfikator. Jakie rozwiązania mogę polecić uczniom do samodzielnego wdrożenia w celu anonimizacji własnych nazwisk? W tej okolicy nadal jestem noobem. Nie wiem, jakie są normy. Myślałem, że rozwiązaniem może być algorytm mieszający. Brzmi to jak lepsze rozwiązanie niż wymyślanie fałszywego nazwiska, ponieważ dwie osoby mogą wybrać to samo fałszywe imię. Potencjalni ludzie mogą wybrać to samo fałszywe imię. O jakich obawach powinienem wiedzieć?

Podejrzewałem, że używasz imion jako identyfikatorów. Nie powinieneś; nie są wyjątkowe i podnoszą tę kwestię prywatności. Zamiast tego używaj ich numerów uczniów, które możesz zweryfikować na podstawie ich identyfikatorów przechowywanych w postaci zaszyfrowanej. Użyj nazwiska ucznia jako soli (utwórz ciąg do zaszyfrowania, łącząc numer identyfikacyjny i nazwisko).

Standardową praktyką w psychologii (w której chcesz zakodować uczestników w celu powiązania różnych pomiarów) jest poproszenie uczestników o wybranie inicjałów nazwiska panieńskiego i daty urodzenia matki, np. W formacie XX-RRMMDD. To, jeśli oczywiście może nadal napotkać konflikty. Z drugiej strony, nie sądzę, aby istniał jakikolwiek niezawodny, wolny od konfliktów algorytm anonimizacji, który mogliby zastosować twoi uczniowie bez znajomości wszystkich innych uczniów. Imiona i daty urodzenia matek mogą być identyczne, własne daty urodzenia mogą być identyczne, rozmiary butów, ulubione postacie superbohaterów… Jedyną rzeczą, o której mógłbym pomyśleć, byłyby numery ubezpieczenia społecznego (USA), ale naprawdę nie chcesz ich używać . Konkluzja: anonimizacja na zapleczu. Lub, jak sugeruje @Emre, zastanów się, czy naprawdę potrzebujesz identyfikatora. Może wystarczy indeks wygenerowany przez DB?

Jaka jest różnica między generowaniem elementu a funkcją ekstrakcji?

Czy ktoś może mi powiedzieć, jaki jest cel generowania funkcji? i dlaczego wzbogacenie przestrzeni cech jest potrzebne przed sklasyfikowaniem obrazu? Czy to konieczny krok? Czy istnieje sposób na wzbogacenie przestrzeni funkcji?

Generowanie funkcji – jest to proces pobierania surowych, nieustrukturyzowanych danych i definiowania funkcji (tj. Zmiennych) do potencjalnego wykorzystania w analizie statystycznej. Na przykład w przypadku eksploracji tekstu możesz zacząć od nieprzetworzonego dziennika tysięcy wiadomości tekstowych (np. SMS-ów, e-maili, wiadomości z sieci społecznościowych itp.) I generować funkcje, usuwając słowa o niskiej wartości (tj. Pomijane słowa), używając określonego rozmiaru bloki słów (tj. n-gramów) lub stosowanie innych reguł.

Wyodrębnianie cech – po wygenerowaniu cech często konieczne jest przetestowanie transformacji oryginalnych cech i wybranie podzbioru tej puli potencjalnych funkcji oryginalnych i pochodnych do wykorzystania w modelu (tj. Wyodrębnianie i selekcja cech). Testowanie wartości pochodnych jest częstym krokiem, ponieważ dane mogą zawierać ważne informacje która ma nieliniowy wzór lub związek z Twoim wynikiem, dlatego znaczenie elementu danych może być widoczne tylko w stanie przekształconym (np. pochodne wyższego rzędu). Użycie zbyt wielu cech może skutkować zwielokrotnioną współliniowością lub w inny sposób zagmatwać modele statystyczne, podczas gdy wyodrębnianie minimalnej liczby cech w celu dopasowania do celu analizy jest zgodne z zasadą oszczędności. Zwiększenie przestrzeni funkcji w ten sposób jest często niezbędnym krokiem w klasyfikacji obrazów lub innych obiektów danych, ponieważ pierwotna przestrzeń funkcji jest zwykle wypełniona przytłaczającą ilością nieustrukturyzowanych i nieistotnych danych, które obejmują coś, co często określa się jako „szum” w paradygmacie „sygnału” i „szumu” (co oznacza, że ​​niektóre dane mają wartość predykcyjną, a inne nie). Zwiększając przestrzeń cech, możesz lepiej zidentyfikować ważne dane, które mają wartość predykcyjną lub inną w twojej analizie (tj. „Sygnał”), jednocześnie usuwając mylące informacje (tj. „Szum”).

Wzmacnianie skrótu uwzględniającego lokalizację

Próbuję zbudować hash cosinus z uwzględnieniem lokalizacji, aby móc znaleźć potencjalne podobne pary elementów bez konieczności porównywania każdej możliwej pary. Zasadniczo działa, ale większość par w moich danych wydaje się mieć podobieństwo cosinusowe w zakresie od -0,2 do +0,2, więc jestem próbując pokroić go w kostkę i wybrać rzeczy z podobieństwem cosinusowym 0,1 i powyżej. Czytałem rozdział 3 „Mining Massive Datasets”, który dotyczy zwiększania dokładności doboru par kandydatów poprzez wzmacnianie rodziny zależnej od lokalizacji. Myślę, że po prostu rozumiem matematyczne wyjaśnienie, ale staram się zobaczyć, jak to zrobić aby wdrożyć to praktycznie. To, co mam do tej pory, jest następujące

  1. Mam, powiedzmy, 1000 filmów, każdy z ocenami od wybranych 1 mln użytkowników. Każdy film jest reprezentowany przez rzadki wektor wyników użytkowników (numer wiersza = identyfikator użytkownika, wartość = wynik użytkownika)
  2. Buduję N losowych wektorów. Długość wektora odpowiada długości wektorów filmowych (tj. Liczbie użytkowników). Wartości wektora to +1 lub -1. W rzeczywistości koduję te wektory jako binarne, aby zaoszczędzić miejsce, z +1 zamapowanym na 1 i -1 zamapowanym na 0
  3. Tworzę wektory szkicu dla każdego filmu, biorąc iloczyn skalarny filmu i każdego z N losowych wektorów (a raczej, jeśli utworzę macierz R, układając N losowych wektorów poziomo i nakładając je na siebie, a następnie szkic do filmu m to R * m), a następnie przyjmujemy znak każdego elementu w wynikowym wektorze, więc kończę na wektor szkicu dla każdego filmu + 1s i -1s, który ponownie koduję jako binarny. Każdy wektor ma długość N bitów.
  1. Następnie szukam podobnych szkiców, wykonując następujące czynności
  2. Podzieliłem wektor szkicu na pasma r bitów
  3. Każde pasmo r bitów jest liczbą. Łączę tę liczbę z numerem zespołu i dodaję film do zasobnika z haszowaniem pod tym numerem. Każdy film można dodać do więcej niż jednego zasobnika.
  4. Następnie zaglądam do każdego wiadra. Wszystkie filmy, które znajdują się w tym samym segmencie, są parami kandydatów.

Porównując to do 3.6.3 mmds, mój krok AND jest wtedy, gdy patrzę na pasma r bitów – para filmów przechodzi krok AND, jeśli r bity mają tę samą wartość. Mój krok LUB odbywa się w zasobnikach: filmy są parami kandydatów, jeśli obie znajdują się w jednym z koszy. Książka sugeruje, że mogę „wzmocnić” swoje wyniki, dodając więcej kroków AND i OR, ale nie wiem, jak to zrobić w praktyce, ponieważ wyjaśnienie procesu konstruowania kolejnych warstw polega na sprawdzaniu równości par, a nie na wymyślam wiadro liczby. Czy ktoś może mi pomóc zrozumieć, jak to zrobić?

Myślę, że coś wymyśliłem. Zasadniczo szukam podejścia, które działa w środowisku mapowania / redukowania typów i myślę, że to podejście wystarcza. Więc,

* przypuśćmy, że mam wstęgi r rzędów i chcę dodać kolejny etap AND, powiedzmy kolejne c AND.

* więc zamiast b * r bitów potrzebuję skrótów b * r * c bitów

* i wykonuję moją poprzednią procedurę c razy, za każdym razem na b * r bitach

* Jeśli x i y okażą się parą kandydującą przez którąkolwiek z tych procedur, emituje parę klucz-wartość ((x, y), 1), z krotką identyfikatorów (x, y) jako kluczem i wartością 1

* Na końcu procedury c grupuję te pary według klucza i sumy

* Każda para (x, y), której suma jest równa c, była parą kandydatów w każdej z rund c, a więc jest parą kandydatów w całej procedurze.

Więc teraz mam sprawne rozwiązanie i wszystko, co muszę zrobić, to sprawdzić, czy wykonanie takich 3 kroków rzeczywiście pomoże mi uzyskać lepszy wynik przy mniejszej ogólnej liczbie bitów mieszania lub lepszą ogólną wydajność…

Uczenie maszynowe w zakresie dużych zbiorów danych finansowych

Zastrzeżenie: chociaż wiem kilka rzeczy na temat dużych zbiorów danych i obecnie uczę się innych rzeczy o uczeniu maszynowym, konkretny obszar, który chcę studiować, jest niejasny lub przynajmniej wydaje mi się teraz niejasny. Zrobię wszystko, co w mojej mocy, aby to opisać, ale to pytanie nadal można sklasyfikować jako zbyt niejasne lub nie do końca. Miejmy nadzieję, że będę mógł to przeredagować bardziej precyzyjnie, gdy zobaczę reakcję. Mam więc pewne doświadczenie z Hadoopem i stosem Hadoop (zdobyte dzięki CDH) i czytam książkę o Mahout, która jest zbiorem bibliotek uczenia maszynowego. Myślę również, że znam wystarczająco dużo statystyk, aby zrozumieć matematykę stojącą za algorytmami uczenia maszynowego i mam pewne doświadczenie z R. Moim ostatecznym celem jest stworzenie konfiguracji, która przewidywałaby transakcje handlowe i radziła sobie z danymi finansowymi w czasie rzeczywistym. Zastanawiam się, czy są jakieś materiały, które mógłbym przeczytać dalej, aby pomóc mi zrozumieć sposoby radzenia sobie z tym problemem; książki, samouczki wideo i ćwiczenia z przykładowymi zbiorami danych to wszystko

Istnieje mnóstwo materiałów dotyczących analizy (dużych) danych finansowych, które można przeczytać i przejrzeć. Nie jestem ekspertem w dziedzinie finansów, ale jestem ciekawy tej dziedziny, szczególnie w kontekście nauki o danych i R. Dlatego poniżej przedstawiono wybrane odpowiednie sugestie dotyczące zasobów że mam dla ciebie. Mam nadzieję, że się przydadzą.

Przeprowadzam podobne badania i odkryłem, że PluralSight, http://pluralsight.com, jest nieocenionym źródłem informacji. Mają kursy wideo na temat uczenia maszynowego, AWS, Azure, Hadoop, Big Data itp. Osobiście uważam, że te kursy wideo pozwalają mi nauczyć się materiału znacznie szybciej i łatwiej niż książki

Nauka o danych w C (lub C ++)

Jestem programistą języka R. Należę też do grupy osób uważanych za Data Scientists, ale wywodzących się z innych dyscyplin naukowych niż CS. Sprawdza się to dobrze w mojej roli analityka danych, jednak rozpoczynając karierę w R i mając jedynie podstawową wiedzę o innych językach skryptowych / internetowych, czułem się nieco nieadekwatne w 2 kluczowych obszarach:

  1. Brak solidnej wiedzy z zakresu teorii programowania
  2. Brak konkurencyjnego poziomu umiejętności w szybszych i szerzej używanych językach, takich jak C, C ++ i Java, które mogłyby być wykorzystane do zwiększenia szybkości obliczeń potoku i Big Data, a także do tworzenia produktów DS / danych, które mogą być łatwiejsze do tworzenia szybkich skryptów zaplecza lub samodzielnych aplikacji

Rozwiązanie jest oczywiście proste – naucz się programowania, czyli tego, co robiłem, zapisując się na niektóre zajęcia (obecnie programowanie w C). Jednak teraz, gdy zaczynam rozwiązywać problemy nr 1 i 2 powyżej, zadaję sobie pytanie: „Na ile realne są języki takie jak C i C ++ dla nauki o danych?”. Na przykład mogę bardzo szybko przenosić dane i wchodzić w interakcje z użytkownikami, ale co z zaawansowaną regresją, uczeniem maszynowym, eksploracją tekstu i innymi bardziej zaawansowanymi operacjami statystycznymi? Więc. czy C może wykonać zadanie – jakie narzędzia są dostępne dla zaawansowanych statystyk, uczenia maszynowego, sztucznej inteligencji i innych dziedzin nauki o danych? A może muszę stracić większość uzyskanej wydajności programowanie w C przez wywołanie skryptów R lub innych języków? Najlepszym zasobem, jaki do tej pory znalazłem w C, jest biblioteka o nazwie Shark, która daje C / C ++ możliwość korzystania z maszyn wektorów pomocniczych, regresji liniowej (nieliniowej i innej zaawansowanej regresji, takiej jak wielomian probit, itp.) Oraz krótkiej listy inne (świetne, ale) funkcje statystyczne.

A może muszę stracić większość wydajności uzyskanej przez programowanie w C, wywołując skrypty R lub inne języki? Zrób coś przeciwnego: naucz C / C ++ pisać rozszerzenia R. Używaj C / C ++ tylko do krytycznych dla wydajności sekcji nowych algorytmów, używaj R do budowania analiz, importowania danych, robienia wykresów itp. Jeśli chcesz wyjść poza R, polecam naukę Pythona. Dostępnych jest wiele bibliotek, takich jak scikit-learning dla algorytmów uczenia maszynowego lub PyBrain do budowania sieci neuronowych itp. (I używaj pylab / matplotlib do kreślenia i iPython zeszyty do opracowania analiz). Ponownie, C / C ++ jest przydatne do implementacji algorytmów krytycznych czasowo jako rozszerzeń Pythona.

Jak powiedział Andre Holzner, rozszerzenie R o rozszerzenie C / C ++ to bardzo dobry sposób na wykorzystanie tego, co najlepsze z obu stron. Możesz także wypróbować odwrotność, pracując z C ++ i od czasu do czasu wywołując funkcję R z pakietem RInside o R. Tutaj możesz dowiedzieć się, jak

http://cran.r-project.org/web/packages/RInside/index.html

http : //dirk.eddelbuettel.com/code/rinside.html

Kiedy pracujesz w C ++, masz wiele bibliotek, wiele z nich zostało zbudowanych pod kątem konkretnych problemów, inne bardziej ogólne http://www.shogun-toolbox.org/page/features/http://image.diku.dk/ shark / sphinx_pages / build / html / index.html

http://mlpack.org/

R jest jednym z kluczowych narzędzi dla analityków danych, nie przestajesz go używać. A teraz mowa o C, C ++, a nawet Javie. To dobre, popularne języki. To, czy ich potrzebujesz, czy też będziesz ich potrzebować, zależy od rodzaju wykonywanej pracy lub projektów. Z własnego doświadczenia wynika, że ​​istnieje tak wiele narzędzi dla naukowców zajmujących się danymi, że będziesz zawsze czujesz, że musisz się ciągle uczyć. Jeśli chcesz, możesz dodać Python lub Matlab do rzeczy, których chcesz się nauczyć i dodawać je dalej. Najlepszym sposobem na naukę jest podjęcie pracy nad projektem przy użyciu innych narzędzi, z którymi nie czujesz się komfortowo. Na twoim miejscu nauczyłbym się języka Python przed C. Jest bardziej używany w społeczności niż C. Ale nauka C nie jest stratą czasu.

Jak wygenerować syntetyczny zestaw danych przy użyciu modelu uczenia maszynowego nauczonego z oryginalnym zestawem danych?

Ogólnie model uczenia maszynowego jest oparty na zestawach danych. Chciałbym wiedzieć, czy istnieje sposób na wygenerowanie syntetycznego zestawu danych przy użyciu takiego wyszkolonego modelu uczenia maszynowego, który zachowuje oryginalne cechy zestawu danych? [oryginalne dane -> zbuduj model uczenia maszynowego -> użyj modelu ML do generowania danych syntetycznych…. !!!] Czy to możliwe? Jeśli to możliwe, wskaż mi powiązane zasoby.

Ogólne podejście polega na wykonaniu tradycyjnej analizy statystycznej zbioru danych w celu zdefiniowania wielowymiarowego procesu losowego, który będzie generował dane o takich samych cechach statystycznych. Zaletą tego podejścia jest to, że syntetyczne dane są niezależne od modelu ML, ale statystycznie „zbliżone” do danych. (patrz poniżej, aby zapoznać się z alternatywą). Zasadniczo szacujesz wielowymiarowy rozkład prawdopodobieństwa związany z procesem. Po oszacowaniu rozkładu możesz wygenerować dane syntetyczne za pomocą

metoda Monte Carlo lub podobne metody wielokrotnego pobierania próbek. Jeśli Twoje dane przypominają jakiś rozkład parametryczny (np. Lognormal), to podejście to jest proste i niezawodne. Najtrudniejsze jest oszacowanie zależności między zmiennymi. Widzieć:

https://www.encyclopediaofmath.org/index.php/Multidimensional_statistical_analysis.

Jeśli Twoje dane są nieregularne, metody nieparametryczne są łatwiejsze i prawdopodobnie bardziej niezawodne. Wielowymiarowe szacowanie gęstości jądra jest metodą dostępną i atrakcyjną dla osób z doświadczeniem ML. Ogólne wprowadzenie i linki do konkretnych metod można znaleźć na stronie: https://en.wikipedia.org/wiki/Nonparametric_statistics.

Aby potwierdzić, że ten proces zadziałał dla Ciebie, ponownie przechodzisz przez proces uczenia maszynowego z zsyntetyzowanymi danymi i powinieneś otrzymać model, który jest dość zbliżony do oryginału. Podobnie, jeśli umieścisz zsyntetyzowane dane w modelu ML, powinieneś otrzymać wyniki, które mają podobny rozkład jak oryginalne wyniki. Wręcz przeciwnie, proponujesz to:

[oryginalne dane -> zbuduj model uczenia maszynowego -> użyj modelu ML do generowania danych syntetycznych…. !!!]

Pozwala to osiągnąć coś innego niż metoda, którą właśnie opisałem. To rozwiązałoby odwrotny problem: „jakie dane wejściowe mogą wygenerować dany zestaw wyników modelu”. O ile model ML nie jest nadmiernie dopasowany do oryginalnych danych, te zsyntetyzowane dane nie będą wyglądać jak oryginalne dane pod każdym względem, a nawet w większości. Rozważmy model regresji liniowej. Ten sam model regresji liniowej może mieć identyczne dopasowanie do danych o bardzo różnych cechach. Myślałem, że nie mam referencji, wierzę, że ten problem może również pojawić się w logistyce regresja, uogólnione modele liniowe, SVM i grupowanie K-średnich.

Istnieją pewne typy modeli ML (np. Drzewo decyzyjne), w których można je odwrócić w celu wygenerowania danych syntetycznych, chociaż wymaga to trochę pracy. Zobacz: Generowanie danych syntetycznych w celu dopasowania wzorców wyszukiwania danych

 Jaki jest termin, kiedy model działa na modelowanej rzeczy i tym samym zmienia koncepcję?

Próbuję sprawdzić, czy istnieje konwencjonalne określenie tego pojęcia, które pomoże mi w badaniach literatury i pisaniu. Kiedy model uczenia maszynowego powoduje podjęcie działania w rzeczywistym świecie, które ma wpływ na przyszłe wystąpienia, jak to się nazywa? Myślę o czymś w rodzaju systemu rekomendacji, który poleca jeden produkt i nie poleca innego produktu. Następnie zwiększyłeś prawdopodobieństwo, że ktoś zamierza kupić pierwszy produkt, i zmniejszyłeś prawdopodobieństwo, że ktoś kupi drugi produkt. Zatem te liczby sprzedaży ostatecznie staną się instancjami szkoleniowymi, tworząc rodzaj pętli sprzężenia zwrotnego. Czy jest na to termin?

Istnieją trzy terminy z nauk społecznych, które odnoszą się do Twojej sytuacji:

  1. Refleksyjność – odnosi się do cyklicznych związków między przyczyną a skutkiem. W szczególności możesz użyć definicji terminu przyjętego przez George’a Sorosa, aby odnieść się do odwrotnej pętli przyczynowej między cenami akcji (tj. Bieżącą wartością fundamentów) a podstawami biznesowymi. W pewnym sensie cena akcji jest „modelem” podstawowych procesów biznesowych. Zwykle ludzie zakładają, że przyczynowość jest jednokierunkowa, od podstaw do ceny akcji.
  2. Performatywność – jak ujął to Donald MacKenzie (np. Tutaj), wiele modeli ekonomicznych nie jest „kamerami” – wykonującymi zdjęcia rzeczywistości ekonomicznej – ale w rzeczywistości są „silnikami” – integralną częścią konstrukcji rzeczywistości gospodarczej. Ma książkę pod tym tytułem: Silnik, nie kamera.
  3. Samospełniająca się przepowiednia – przepowiednia, która bezpośrednio lub pośrednio powoduje, że staje się prawdziwa, na podstawie samych warunków samego proroctwa, z powodu pozytywnego sprzężenia zwrotnego między przekonaniem a zachowaniem. Jest to najszerszy termin i najmniej specyficzny dla opisywanej sytuacji.

Z tych trzech terminów sugeruję, że „performatywność” MacKenziego najlepiej pasuje do twojej sytuacji. Twierdzi między innymi, że trafność modeli ekonomicznych (np. Wyceny opcji Blacka-Scholesa) została poprawiona przez samo ich wykorzystanie przez uczestników rynku, a co za tym idzie, jak to odzwierciedla się w wycenie opcji i wzorcach handlu.

Chociaż nie jest to konkretnie termin skupiony na uczeniu maszynowym, ale odniósłbym się do takiego zachowania modelu statystycznego, używając ogólnego terminu efekt uboczny (dodając kilka objaśniających przymiotników, takich jak oczekiwane lub nieoczekiwane, pożądane lub niepożądane itp. ). Jednym z alternatywnych terminów może być modelowanie wyniku lub przechodnia pętla sprzężenia zwrotnego.

Jakie typy funkcji są używane w przypadku problemu z prognozowaniem współczynnika klikalności na dużą skalę?

Coś, co często widzę w artykułach (przykładach) dotyczących uczenia się na dużą skalę, to fakt, że problemy ze współczynnikiem klikalności (CTR) mogą mieć nawet miliard funkcji w każdym przykładzie. W tym artykule Google autorzy wspominają: Funkcje używane w naszym systemie pochodzą z różnych źródeł, w tym z zapytania, tekstu reklamy i różnych metadanych związanych z reklamą. Mogę sobie wyobrazić kilka tysięcy funkcji pochodzących z tego typu źródła, myślę, że poprzez jakąś formę mieszania funkcji. Moje pytanie brzmi: jak dostać się do miliarda funkcji? W jaki sposób firmy przekładają zachowania użytkowników na funkcje, aby osiągnąć taką skalę funkcji?

To naprawdę fajne pytanie, chociaż kiedy już jesteś na Facebooku, w Google itp., Masz odwrotny problem: jak zmniejszyć liczbę funkcji z wielu miliardów, powiedzmy, około miliarda.

Naprawdę istnieją miliardy funkcji. Wyobraź sobie, że w swoim wektorze cech masz miliardy możliwych fraz, które użytkownik

mógłby wpisać do wyszukiwarki. Albo, że masz miliardy witryn internetowych, które użytkownik może odwiedzić. Albo miliony lokalizacji, z których użytkownik mógłby zalogować się do systemu. Lub miliardy kont pocztowych, na które użytkownik może wysyłać lub odbierać wiadomości. Lub, aby przełączyć się trochę na problem podobny do serwisu społecznościowego. Wyobraź sobie, że w swoim wektorze cech masz miliardy użytkowników, których określony użytkownik może znać lub być w pewnym stopniu odseparowany. Możesz dodać miliardy linków, które użytkownik mógłby zamieścić w swoim kanale SNS lub miliony stron, które użytkownik mógłby „polubić” (lub zrobić wszystko, na co pozwala SNS). Podobne problemy można znaleźć w wielu dziedzinach, od rozpoznawania głosu i obrazu po różne gałęzie biologii, chemii itp. Podoba mi się Twoje pytanie, ponieważ jest to dobre

punktem wyjścia do zagłębienia się w problemy związane z bogactwem funkcji. Powodzenia w odkrywaniu tego obszaru!

UPDATE ze względu na Twój komentarz: Korzystanie z funkcji innych niż binarne to tylko jeden krok dalej w wyobrażaniu sobie rzeczy. Możesz w jakiś sposób grupować wyszukiwania i liczyć częstotliwości wyszukiwań dla określonego klastra.

W ustawieniach SNS można zbudować wektor relacji między użytkownikami zdefiniowany jako stopień separacji, zamiast zwykłej binarnej cechy bycia lub nie bycia przyjaciółmi. Wyobraź sobie dzienniki, które globalne korporacje przechowują dla milionów swoich użytkowników. Jest wiele rzeczy, które można zmierzyć bardziej szczegółowo niż binarnie. Sprawy komplikują się jeszcze bardziej, gdy rozważamy ustawienie online. W takim w przypadku, gdy nie masz czasu na skomplikowane obliczenia i często masz do czynienia z funkcjami binarnymi, ponieważ są one tańsze. I nie, nie mówię, że problem staje się możliwy do rozwiązania, gdy zostanie zredukowany do magicznej liczby miliardów funkcji. Mówię tylko, że miliard funkcji to coś, co możesz skończyć po wielu wysiłkach zmierzających do zmniejszenia liczby wymiarów.

Na czym polega problem „umierającego ReLU” w sieciach neuronowych?

Odnosząc się do notatek z kursu Stanforda [Convolutional Neural Networks for Visual Recognition] [1], akapit mówi:

„Niestety jednostki ReLU mogą być delikatne podczas treningu i mogą„ umrzeć ”. Na przykład duży gradient przepływający przez neuron ReLU może spowodować aktualizację wag w taki sposób, że neuron już nigdy nie zostanie aktywowany w żadnym punkcie danych. Jeśli tak się stanie, gradient przepływający przez jednostkę będzie zawsze wynosił zero od tego punktu. Oznacza to, że jednostki ReLU mogą nieodwracalnie zginąć podczas treningu, ponieważ mogą zostać strąconym z kolektora danych. Na przykład może się okazać, że nawet 40% sieci może być „martwa” (tj. Neurony, które nigdy nie są aktywowane w całym zbiorze danych szkoleniowych), jeśli współczynnik uczenia się jest ustawiony zbyt wysoko. Przy odpowiednim ustawieniu współczynnika uczenia się jest to rzadziej problemem ”. Co tutaj oznacza umieranie neuronów?

Czy mógłbyś podać intuicyjne wyjaśnienie w prostszych słowach.

„Martwy” ReLU zawsze wysyła tę samą wartość (zero, jak to się dzieje, ale to nie jest ważne) dla dowolnego wejścia. Prawdopodobnie osiąga się to poprzez nauczenie się dużego negatywnego terminu dla jego wag. To z kolei oznacza, że ​​nie odgrywa on żadnej roli w rozróżnianiu danych wejściowych. Dla klasyfikacji, można wizualizować to jako płaszczyznę decyzyjną poza wszystkimi możliwymi danymi wejściowymi. Gdy ReLU znajdzie się w tym stanie, jest mało prawdopodobne, aby powrócił, ponieważ gradient funkcji przy 0 jest również równy 0, więc uczenie się zstępowania gradientu nie zmieni wag. „Leaky” ReLUs with mały dodatni gradient ujemnych danych wejściowych (y = 0,01x, gdy x <0, powiedzmy) jest jedną z prób rozwiązania tego problemu i daje szansę na poprawę. Neurony esicy i tanh mogą cierpieć z powodu podobnych problemów, ponieważ ich wartości są nasycone, ale zawsze istnieje przynajmniej niewielki gradient, który pozwala im na powrót do zdrowia w dłuższej perspektywie.

Dlaczego regresja logistyczna w Spark i R zwraca różne modele dla tych samych danych?

Porównałem modele regresji logistycznej na R (glm) i na Spark 

(LogisticRegressionWithLBFGS) na zbiorze danych 390 obs. 14 zmiennych. Wyniki są zupełnie inne w punkcie przecięcia z osią i wagach. Jak to wyjaśnić? Oto wyniki Spark (LogisticRegressionWithLBFGS):

model.intercept:

1.119830027739959

model.wagi:

GEST 0.30798496002530473

DILAT 0,28121771009716895

EFFACE 0.01780105068588628

CONSIS -0,22782058111362183

KONTRA -0,8094592237248102

MEMBRAN-1.788173534959893

WIEK -0,05285751197750732

STRAT -1.6650305527536942

GRAVID 0.38324952943210994

PARIT -0,9463956993328745

DIAB 0.18151162744507293

TRANSF -0,7413500749909346

GEMEL 1.5953124037323745

Oto wynik R:

Oszacuj Std. Wartość błędu z Pr (> | z |)

(Punkt przecięcia) 3,0682091 3,3944407 0,904 0,366052

GEST 0,0086545 0,1494487 0,058 0,953821

DYLAT 0,4898586 0,2049361 2,390 0,016835 *

EFEKCJA 0,0131834 0,0059331 2,222 0,026283 *

CONSIS 0,1598426 0,2332670 0,685 0,493196

KONTRA 0,0008504 0,5788959 0,001 0,998828

MEMBRANA -1,5497870 0,4215416 -3,676 0,000236 ***

WIEK -0,0420145 0,0326184 -1,288 0,197725

STRAT -0,3781365 0,5860476 -0,645 0,518777

GRAVID 0,1866430 0,1522925 1,226 0,220366

PARYT -0,6493312 0,2357530 -2,754 0,005882 **

DIAB 0,0335458 0,2163165 0,155 0,876760

TRANSF -0,6239330 0,3396592 -1,837 0,066219.

GEMEL 2,2767331 1,0995245 2,071 0,038391 *

Signif. kody: 0 „***” 0,001 „**” 0,01 „*” 0,05 „.” 0,1 „” 1

Szybkie spojrzenie na dokumentację LogisticRegressionWithLBFGS wskazuje, że domyślnie używa ona skalowania funkcji i L2-regularyzacji. Podejrzewam, że wartość glm R zwraca oszacowanie maksymalnego prawdopodobieństwa modelu, podczas gdy LogisticRegressionWithLBFGS Sparka zwraca regularyzowane oszacowanie modelu. Zwróć uwagę, że szacunkowe wagi modelu Spark są mniejsze pod względem wielkości niż te w modelu R. Nie jestem pewien, czy glm in R implementuje skalowanie funkcji, ale miałoby to również wpływ na różne wartości modelu.

P: Próbuję sklasyfikować / zgrupować profile użytkowników, ale nie wiem jak z moimi atrybutami

Mam zbiór danych o użytkownikach kupujących produkty w witrynie. Posiadane przeze mnie atrybuty to identyfikator użytkownika, region (stan) użytkownika, identyfikator kategorii produktu, identyfikator słowa kluczowego produktu, identyfikator słowa kluczowego witryny, kwota sprzedaży wydana na produkt. Celem jest wykorzystanie informacji o produkcie i stronie internetowej do identyfikacji użytkowników, na przykład „młody mężczyzna grający”, „mama zostaje w domu”. Załączam przykładowe zdjęcie jak poniżej.

Istnieje łącznie 1940 unikalnych kategorii i 13845 unikalnych słów kluczowych dla produktów. Witryna zawiera 13063 unikalnych słów kluczowych. Cały zbiór danych jest ogromny, ponieważ są to dane dziennego logowania. Myślę o klastrowaniu, ponieważ są one nienadzorowane, ale te identyfikatory są numerami uporządkowanymi, które nie mają znaczenia liczbowego, więc nie wiem, jak zastosować algorytm. Myślę też o klasyfikacji, jeśli dodam kolumnę z klasą opartą na wielkości sprzedaży zakupionego produktu. Myślę, że grupowanie jest bardziej preferowane. Nie wiem, jakiego algorytmu powinienem użyć w tym przypadku ponieważ wymiary identyfikatora słów kluczowych mogą przekraczać 10000 (każdy produkt może mieć wiele słów kluczowych, podobnie jak witryna). Muszę użyć Spark do tego projektu. Czy ktoś może mi pomóc z kilkoma pomysłami, sugestiami? Dziękuję bardzo!

W tej chwili mam tylko czas na bardzo krótką odpowiedź, ale spróbuję ją później rozwinąć. To, co chcesz zrobić, to grupowanie, ponieważ chcesz odkryć niektóre etykiety dla swoich danych. (W przeciwieństwie do klasyfikacji, w której miałbyś etykiety przynajmniej części danych, a resztę chciałbyś oznaczyć). Aby przeprowadzić grupowanie na swoich użytkownikach, musisz mieć je jako pewnego rodzaju punkty w abstrakcyjnej przestrzeni. Następnie zmierzysz odległości między punktami i powiesz to ,że punkty, które są „blisko”, są „podobne” i oznacz je zgodnie z ich miejscem w tej przestrzeni. Musisz przekształcić swoje dane w coś, co wygląda jak profil użytkownika, tj .: identyfikator użytkownika, po którym następuje wektor liczb reprezentujących cechy tego użytkownika. W Twoim przypadku, każda funkcja może być „kategorią witryny” lub „kategorią produktu”, a liczba ta może być kwotą wydaną na tę funkcję. Oczywiście funkcja może być połączeniem sieci i produktu. Jako przykład wyobraźmy sobie profil użytkownika z zaledwie trzema funkcjami: dolary wydane na „techniczne” strony, dolary wydane na „modowe” produkty i dolary wydane na „agresywne” gry wideo w „rodzinnych” witrynach (kto wie) . Aby zbudować te profile, musisz zmapować „kategorie” i „słowa kluczowe”, których masz zbyt wiele, na funkcje, które uważasz za istotne. Zajrzyj do tematu modelowania lub podobieństwo semantyczne, aby to zrobić. Po utworzeniu mapy będzie stwierdzać, że wszystkie dolary wydane na sieci ze słowami kluczowymi „gadżet”, „elektronika”, „programowanie” i X innych powinny zostać zebrane w naszej pierwszej funkcji; i tak dalej. Nie bój się „narzucać” funkcji! Będziesz musiał je udoskonalić i być może całkowicie zmienić je po zgrupowaniu użytkowników. Gdy masz już profile użytkowników, przejdź do grupowania ich za pomocą k-średnich lub cokolwiek innego, co uważasz za interesujące. Niezależnie od zastosowanej techniki, będziesz zainteresowany uzyskaniem „reprezentatywnego” punktu dla każdego klastra. Zwykle jest to geometryczny „środek” punktów w tej grupie. Wykreśl te „reprezentatywne” punkty, a także ich porównanie z innymi klastrami. Korzystanie z mapy radarowej jest tutaj bardzo przydatne. Wszędzie tam, gdzie występuje istotna cecha (coś w przedstawicielu, co jest bardzo wyraźne i jest również bardzo widoczne w porównaniu z innymi klastrami) jest dobrym kandydatem, który pomoże ci oznaczyć klaster jakimś chwytliwym zwrotem („nerdowie”, „fashionistki” , „Agresywne mamy”…). Pamiętaj, że problem związany z klastrami jest problemem otwartym, więc nie ma „właściwego” rozwiązania! Myślę, że moja odpowiedź jest już dość długa; sprawdź także normalizację profili i filtrowanie wartości odstających.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *