[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.

[44][Machine Learning] (4)

Pomysły na projekty Data Science

Nie wiem, czy to właściwe miejsce, aby zadać to pytanie, ale moim zdaniem najwłaściwszym miejscem powinna być społeczność poświęcona Data Science. Właśnie zacząłem od nauki o danych i uczenia maszynowego. Szukam długoterminowych pomysłów na projekty, nad którymi mógłbym pracować około 8 miesięcy. Połączenie nauki o danych i uczenia maszynowego byłoby świetne. Projekt wystarczająco duży, aby pomóc mi zrozumieć podstawowe koncepcje, a także wdrożyć je w tym samym czasie, byłby bardzo korzystny. Spróbowałbym przeanalizować i rozwiązać jeden lub więcej problemów opublikowanych na Kaggle Competitions (https://www.kaggle.com/competitions). Zwróć uwagę, że konkursy są pogrupowane według ich oczekiwanej złożoności, od 101 (na dole listy) do Badań i wyróżnionych (na górze listy). Pionowy pasek oznaczony kolorem to wizualna wskazówka dotycząca grupowania. Możesz ocenić czas, jaki możesz poświęcić na projekt, dostosowując oczekiwany czas trwania odpowiednich zawodów w oparciu o swoje umiejętności i doświadczenie. Szereg pomysłów na projekty związane z nauką o danych można znaleźć, przeglądając następujące pozycje

Strona internetowa Coursolve: https://www.coursolve.org/browse-needs?

zapytanie = Data% 20Science. Jeśli masz umiejętności i chęć pracy nad prawdziwym projektem nauki o danych, skupiającym się na skutkach społecznych, odwiedź stronę projektów DataKind: http://www.datakind.org/projects. Więcej projektów

z naciskiem na wpływy społeczne można znaleźć na stronie internetowej organizacji Data Science for Social Good: http://dssg.io/projects. Strona Science Project Ideas w witrynie My NASA Data wygląda jak inne miejsce, w którym można znaleźć inspirację: http://mynasadata.larc.nasa.gov/804-2. Jeśli chcesz korzystać z otwartych danych, ta długa lista aplikacji na Data.gov może dostarczyć Ci interesujących pomysłów na projekty z zakresu nauki o danych: http://www.data.gov/applications

Weź coś ze swojego codziennego życia. Stwórz predyktor korków w swoim regionie, spersonalizuj rekomendację muzyczną, przeanalizuj rynek samochodowy itp. Wybierz prawdziwy problem, który chcesz rozwiązać – to nie tylko zapewni Ci motywację, ale także sprawi, że przejdziesz przez cały krąg rozwoju od gromadzenia danych do testowania hipotez. Wprowadzenie do kursu Data Science, który jest prowadzony na Coursera, obejmuje teraz rzeczywiste zadania projektowe, w których firmy publikują swoje problemy, a studenci są zachęcani do ich rozwiązywania. Odbywa się to za pośrednictwem coursolve.com. Przewidując następny stan chorobowy na podstawie przeszłych stanów w danych roszczeniowych, jestem, co prawda, bardzo nowy w nauce o danych. Spędziłem mniej więcej ostatnie 8 miesięcy, ucząc się jak najwięcej o tej dziedzinie i jej metodach. Mam problemy z wyborem metod, które mam zastosować. Obecnie pracuję z dużym zbiorem danych o roszczeniach z tytułu ubezpieczenia zdrowotnego, który obejmuje niektóre roszczenia laboratoryjne i farmaceutyczne. Najbardziej spójne informacje w zbiorze danych składają się jednak z diagnozy (ICD-9CM) i kodów procedur (CPT, HCSPCS, ICD-9CM). Moje cele to:

  1. Zidentyfikować najbardziej wpływowe stany prekursorowe (choroby współistniejące) dla schorzeń, takich jak przewlekła choroba nerek;
  2. Określić prawdopodobieństwo (lub prawdopodobieństwo), że u pacjenta wystąpi stan chorobowy na podstawie warunków, jakie miał w przeszłości;
  3. Zrób to samo, co 1 i 2, ale z procedurami i / lub diagnozami.
  4. Najlepiej, aby wyniki były interpretowane przez lekarza

Przyjrzałem się takim rzeczom, jak materiały Milestone Heritage Health Prize i wiele się z nich nauczyłem, ale koncentrują się one na przewidywaniu hospitalizacji. Rzuciłem na ten problem szereg algorytmów (losowe lasy, regresja logistyczna, CART, regresje Coxa) i było to niesamowite doświadczenie edukacyjne. Nie byłem w stanie zdecydować, co „działa” lub „nie działa”, jeśli wiesz, co mam na myśli. Mam wystarczająco dużo wiedzy i umiejętności, by dać się zwieść własnej ekscytacji i naiwności; to, czego potrzebuję, to być w stanie ekscytować się czymś prawdziwym. Oto moje pytania: jakie metody Twoim zdaniem działają dobrze w przypadku takich problemów? Jakie zasoby byłyby najbardziej przydatne do poznania zastosowań i metod nauki o danych w służbie zdrowia i medycynie klinicznej?

Aby dodać tabelę tekstową: PChN jest stanem docelowym, „przewlekła choroba nerek”, „.any” oznacza, że ​​doszło do tego stanu w dowolnym momencie, „.isbefore.ckd” oznacza, że ​​mieli ten stan przed pierwszą diagnozą PChN. Pozostałe skróty odpowiadają innym stanom określonym przez zgrupowania kodów ICD-9CM. To grupowanie występuje w języku SQL podczas procesu importu. Każda zmienna, z wyjątkiem patient_age, jest binarna.

aby dodać przykładową ramkę danych:

Nigdy nie pracowałem z danymi medycznymi, ale z ogólnego rozumowania powiedziałbym, że relacje między zmiennymi w opiece zdrowotnej są dość skomplikowane. Różne modele, takie jak losowe lasy, regresja itp., Mogą uchwycić tylko część relacji i zignorować inne. W takich okolicznościach sensowne jest zastosowanie ogólnej analizy statystycznej i modelowania. Na przykład, pierwszą rzeczą, którą bym zrobił, było znalezienie korelacji między możliwymi stanami prekursorowymi a diagnozami. Na przykład. w jakim procencie przypadków przewlekła choroba nerek była poprzedzona długą grypą? Jeśli jest wysoki, nie zawsze oznacza to przyczynowość, ale daje całkiem niezłe do myślenia i pomaga lepiej zrozumieć relacje między różnymi stanami. Kolejnym ważnym krokiem jest wizualizacja danych. Czy PChN występuje częściej u mężczyzn niż u kobiet? A co z ich miejscem zamieszkania? Jaki jest rozkład przypadków CKD według wieku? Trudno jest uchwycić duży zbiór danych jako zbiór liczb, a wykreślenie ich znacznie ułatwia. Kiedy już wiesz, co się dzieje, przeprowadź testy hipotez, aby sprawdzić założenie. Jeśli odrzucisz hipotezę zerową (podstawowe założenie) na rzecz alternatywnej, gratulacje, stworzyłeś „coś prawdziwego”.

Wreszcie, gdy dobrze rozumiesz swoje dane, spróbuj stworzyć kompletny model. Może to być coś ogólnego, jak PGM (np. Ręcznie stworzona sieć bayesowska) lub coś bardziej szczegółowego, jak regresja liniowa lub SVM, lub cokolwiek innego. Ale w jakikolwiek sposób będziesz już wiedział, jak ten model odpowiada Twoim danym i jak możesz zmierzyć jego wydajność. Jako dobre źródło początkowe do nauki podejścia statystycznego polecam kurs „Wprowadzenie do statystyki” Sebastiana Thruna. Chociaż jest dość prosty i nie zawiera zaawansowanych tematów, zawiera opis najważniejszych pojęć i podaje systematyzację

Chociaż nie jestem analitykiem danych, jestem epidemiologiem pracującym w warunkach klinicznych. Twoje pytanie badawcze nie określało okresu (tj. Szans na rozwój PChN w ciągu 1 roku, 10 lat, życia?). Ogólnie rzecz biorąc, przechodziłbym przez kilka kroków, zanim jeszcze pomyślę o modelowaniu (analiza jednowymiarowa, analiza dwuwymiarowa, sprawdzanie współliniowości itp.). Jednak najczęściej używaną metodą prób przewidywania zdarzenia binarnego (przy użyciu zmiennych ciągłych LUB binarnych) jest regresja logistyczna. Jeśli chcesz spojrzeć na CKD jako wartość laboratoryjną (mocz albumina, eGFR) zastosowałbyś regresję liniową (wynik ciągły). Chociaż stosowane metody powinny być oparte na danych i pytaniach, klinicyści są przyzwyczajeni do sprawdzania współczynników szans i współczynników ryzyka, ponieważ są to najczęściej zgłaszane miary powiązań w czasopismach medycznych, takich jak NEJM i JAMA. Jeśli pracujesz nad tym problemem z perspektywy zdrowia ludzkiego (w przeciwieństwie do Business Intelligence) te modele prognozowania klinicznego firmy Steyerberg są doskonałym źródłem informacji.

„Zidentyfikuj najbardziej wpływowe stany prekursorowe (choroby współistniejące) dla schorzeń, takich jak przewlekła choroba nerek”. Nie jestem pewien, czy możliwe jest zidentyfikowanie najbardziej wpływowych schorzeń; Myślę, że to będzie zależało  od tego jakiego modelu używasz. Jeszcze wczoraj dopasowałem losowy las i wzmocnione drzewo regresji do tych samych danych, a kolejność i względne znaczenie, jakie każdy model nadał zmiennym, były zupełnie inne.

Kiedy jest wystarczająco dużo danych do uogólnienia?

Czy są jakieś ogólne zasady, na podstawie których można wywnioskować, czego można się nauczyć / uogólnić na podstawie określonego zestawu danych? Załóżmy, że zbiór danych został pobrany z próby osób. Czy te zasady można określić jako funkcje próby lub całej populacji? Rozumiem, że powyższe może być niejasne, więc scenariusz: Użytkownicy biorą udział w wyszukiwaniu zadania, w którym dane są ich zapytaniami, klikniętymi wynikami i zawartością HTML (tylko tekst) tych wyników. Każdy z nich jest oznaczony swoim użytkownikiem i sygnaturą czasową. Użytkownik może wygenerować kilka stron – do prostego zadania polegającego na ustaleniu faktów – lub setki stron – na dłuższy okres zadanie wyszukiwania, jak w przypadku raportu z zajęć. Oprócz uogólniania na temat populacji, biorąc pod uwagę próbkę, interesuje mnie uogólnienie dotyczące ogólnego zachowania osoby podczas wyszukiwania w danym przedziale czasu. Teoria i odniesienia do papieru to plus!

Rozumiem, że losowe pobieranie próbek jest obowiązkowym warunkiem dokonywania jakichkolwiek uogólnień. IMHO, inne parametry, takie jak wielkość próby, po prostu wpływają na poziom prawdopodobieństwa (ufność) uogólnienia. Ponadto, wyjaśniając komentarz @ ffriend, uważam, że musisz obliczyć potrzebną wielkość próby, w oparciu o pożądane wartości przedziału ufności, wielkości efektu, mocy statystycznej i liczby predyktorów (jest to oparte na pracy Cohena – patrz sekcja Referencje poniżej połączyć). W przypadku regresji wielokrotnej możesz skorzystać z następującego kalkulatora:

http://www.danielsoper.com/statcalc3/calc.aspx?id=1.

Więcej informacji na temat doboru, obliczania i interpretowania rozmiarów efektów można znaleźć w następującym ładnym i obszernym artykule, który jest dostępny bezpłatnie:

http://jpepsy.oxfordjournals.org/content/34/9/917.full.

Jeśli używasz R (a nawet, jeśli tego nie robisz), następująca strona internetowa dotycząca przedziałów ufności i R może okazać się interesująca i przydatna:

http://osc.centerforopenscience.org/static/CIs_in_r.html.

Na koniec poniższy kompleksowy przewodnik dotyczący próbkowania ankiet może być pomocny, nawet jeśli nie korzystasz z projektów badań ankietowych. Moim zdaniem zawiera wiele przydatnych informacji na temat metod pobierania próbek, określania wielkości próby (w tym kalkulator) i dużo więcej: http://home.ubalt.edu/ntsbarsh/stat-data/Surveys.htm.

Odpowiedź przez ssdecontrol Istnieją dwie zasady dotyczące możliwości uogólniania:

  1. Próbka musi być reprezentatywna. Oczekując przynajmniej, że rozkład cech w twojej próbie musi odpowiadać rozkładowi cech w populacji. Kiedy dopasowujesz model ze zmienną odpowiedzi, obejmuje to cechy, których nie obserwujesz, ale które mają wpływ na wszystkie zmienne odpowiedzi w modelu. Ponieważ w wielu przypadkach nie można wiedzieć, czego się nie obserwuje, stosuje się próbkowanie losowe. Idea randomizacji polega na tym, że próba losowa, aż do błędu próbkowania, musi dokładnie odzwierciedlać rozkład wszystkich cech w populacji, obserwowanych i innych. Dlatego randomizacja jest „złotym standardem”, ale jeśli kontrola próbki jest dostępna za pomocą innej techniki lub można obronić argument, że nie ma pominiętych funkcji, to nie zawsze jest to konieczne.
  2. Twoja próbka musi być na tyle duża, aby wpływ błędu próbkowania na rozkład cech był stosunkowo niewielki. Ma to ponownie na celu zapewnienie reprezentatywności. Jednak decyzja, kogo pobrać próbkę, różni się od decyzji, ile osób ma pobrać próbkę.

Ponieważ wydaje się, że dopasowujesz model, należy wziąć pod uwagę, że niektóre ważne kombinacje cech mogą występować stosunkowo rzadko w populacji. Nie jest to problem związany z możliwością uogólnienia, ale ma to duży wpływ na rozważania dotyczące wielkości próby. Na przykład pracuję teraz nad projektem z (małymi) danymi, które zostały pierwotnie zebrane w celu zrozumienia doświadczeń mniejszości na studiach. W związku z tym niezwykle ważne było zapewnienie wysokiej mocy statystycznej, szczególnie w subpopulacji mniejszościowej. Z tego powodu czarni i Latynosi byli celowo nadpróbkowani. Odnotowano jednak również proporcję, w jakiej zostały one nadpróbkowane. Są one używane do obliczania wag ankiet. Można je wykorzystać do ponownego zważenia próbki, aby odzwierciedlić szacowane proporcje populacji, w przypadku gdy wymagana jest reprezentatywna próbka. Dodatkowa uwaga pojawia się, jeśli model jest hierarchiczny. Kanoniczne zastosowanie modelu hierarchicznego to zachowanie dzieci w szkole. Dzieci są „pogrupowane” według szkoły i mają podobne cechy na poziomie szkolnym. Dlatego wymagana jest reprezentatywna próba szkół, aw każdej szkole wymagana jest reprezentatywna próba dzieci. Prowadzi to do losowania warstwowego. Ten i kilka innych projektów próbkowania są szczegółowo omówione w Wikipedii.

Aby odpowiedzieć na prostsze, ale powiązane pytanie, a mianowicie „Jak dobrze mój model może uogólniać dane, które posiadam?”, Można zastosować metodę uczenia krzywych. To jest wykład wygłoszony przez Andrew Ng na ich temat. Podstawowym pomysłem jest wykreślenie błędu zbioru testowego i błędu zbioru uczącego w funkcji złożoności modelu, którego używasz (może to być nieco skomplikowane). Jeśli model jest wystarczająco wydajny, aby w pełni „zrozumieć” dane, w pewnym momencie złożoność modelu będzie na tyle duża, że ​​wydajność zestawu uczącego będzie bliska ideału. Jednak wariancja złożonego modelu prawdopodobnie spowoduje w pewnym momencie wzrost wydajności zestawu testowego. Myślę, że ta analiza mówi wam dwie główne rzeczy. Pierwsza to górna granica wydajności. Jest mało prawdopodobne, że poradzisz sobie lepiej z danymi, których nie widziałeś, niż z danymi treningowymi.

Inną rzeczą, którą informuje, jest to, czy uzyskanie większej ilości danych może pomóc. Jeśli możesz wykazać, że w pełni rozumiesz swoje dane treningowe, zmniejszając błąd szkolenia do zera, możliwe jest, poprzez włączenie większej ilości danych, dalsze obniżenie błędu testu poprzez uzyskanie pełniejszej próbki, a następnie wyszkolenie na tej podstawie potężnego modelu. .

Rozwiązywanie układu równań z nielicznymi danymi

Próbuję rozwiązać układ równań, który ma 40 zmiennych niezależnych (x1,…, x40) i jedną zmienną zależną (y). Całkowita liczba równań (liczba wierszy) to ~ 300 i chcę rozwiązać zestaw 40 współczynników, który minimalizuje całkowitą sumę kwadratów

błąd między y a przewidywaną wartością. Mój problem polega na tym, że macierz jest bardzo rzadka i nie znam najlepszego sposobu rozwiązania układu równań z nielicznymi danymi. Przykład zbioru danych przedstawiono poniżej:

y x1 x2 x3 x4 x5 x6… x40

87169 14 0 1 0 0 2 … 0

46449 0 0 4 0 1 4 … 12

846449 0 0 0 0 0 3 … 0….

Obecnie używam algorytmu genetycznego, aby rozwiązać ten problem, a wyniki wychodzą z mniej więcej dwukrotną różnicą między obserwowaną a oczekiwaną. Czy ktoś może zasugerować różne metody lub techniki, które są w stanie rozwiązać zestaw równań przy niewielkiej ilości danych.

Jeśli dobrze rozumiem, jest to przypadek wielokrotnej regresji liniowej z rzadkimi danymi (rzadka regresja). Zakładając to, mam nadzieję, że poniższe zasoby okażą się przydatne.

1) Slajdy z wykładu NCSU na temat regresji rzadkiej z omówieniem algorytmów, uwag, wzorów, grafik i odniesień do literatury:

http://www.stat.ncsu.edu/people/zhou/courses/st810/notes/lect23sparse.pdf

2) Ekosystem R oferuje wiele pakietów przydatnych do rzadkiej analizy regresji, w tym:

* Matrix (http://cran.r-project.org/web/packages/Matrix)

* SparseM (http://cran.r-project.org/web/packages/SparseM)

* MatrixModels (http://cran.r-project.org/web/packages/MatrixModels)

* glmnet (http://cran.r-project.org/web/packages/glmnet)

* flara (http://cran.r-project.org/web/packages/flare)

3) Wpis na blogu z przykładem rozwiązania rzadkiej regresji opartego na SparseM:

http://aleph-nought.blogspot.com/2012/03/multiple-linear-regression-with-sparse.html

4) Wpis na blogu o używaniu rzadkich macierzy w R, który zawiera podkład na temat używania glmnet:

Using Sparse Matrices in R

5) Więcej przykładów i dyskusję na ten temat można znaleźć na StackOverflow:

http://stackoverflow.com/questions/3169371/large-scale-regression-in-r-with-a-sparsefeature-matrix

UPDATE (na podstawie Twojego komentarza):

Jeśli próbujesz rozwiązać problem LP z ograniczeniami, przydatny może być ten artykuł teoretyczny: http://web.stanford.edu/group/SOL/papers/gmsw84.pdf.

Sprawdź również pakiet R limSolve: http: //cran.r- project.org/web/packages/limSolve. I ogólnie sprawdzaj pakiety w widoku zadań CRAN „Optimization and Mathematical Programming”: http://cran.r-project.org/web/views/Optimization.html.

Sposób postawienia pytania sugeruje, że jest to proste, zwykłe pytanie regresji metodą najmniejszych kwadratów: minimalizowanie sumy kwadratów reszt między zmienną zależną a liniową kombinacją predyktorów. Teraz, gdy macierz projektu może zawierać wiele zer, system jako taki nie jest zbyt duży: 300 obserwacji na 40 predyktorach to nie więcej niż średniej wielkości. Możesz uruchomić taką regresję przy użyciu R bez specjalnego wysiłku w przypadku rzadkich danych. Po prostu użyj polecenia lm () (dla „modelu liniowego”). Użyj? Lm, aby wyświetlić stronę pomocy. Zauważ, że lm domyślnie po cichu doda stałą kolumnę jedynek do macierzy projektu (punkt przecięcia z osią) – dołącz -1 po prawej stronie formuły, aby to powstrzymać. Ogólnie zakładając, że wszystkie twoje dane (i nic więcej) znajdują się w data.frame o nazwie foo, możesz to zrobić:

model <- lm (y ~.-1, dane = foo)

Następnie możesz spojrzeć na szacunki parametrów itp. W ten sposób:

summary(model)

residuals(model)

Jeśli twój system jest znacznie większy, powiedzmy rzędu 10 000 obserwacji i setek predyktorów, spojrzenie na wyspecjalizowane, rzadkie solwery, zgodnie z odpowiedzią Aleksandra, może zacząć mieć sens. Wreszcie, w swoim komentarzu do odpowiedzi Aleksandra, wspominasz o ograniczeniach

równanie. Jeśli rzeczywiście jest to twój kluczowy problem, są sposoby na obliczenie najmniejszych kwadratów z ograniczeniami w R. Osobiście lubię pcls () w pakiecie mgcv. Być może chcesz zmodyfikować swoje pytanie, aby uwzględnić rodzaj ograniczeń (ograniczenia pola, ograniczenia nieujemności, ograniczenia integralności, ograniczenia liniowe,…), z którymi masz do czynienia?

Klasyfikacja wyjątków Java

Mamy algorytm klasyfikacyjny do kategoryzowania wyjątków Java w środowisku produkcyjnym. Algorytm ten jest oparty na hierarchicznych regułach definiowanych przez człowieka, więc kiedy pojawia się zbiór tekstu tworzącego wyjątek, określa, jakiego rodzaju jest wyjątek (rozwój, dostępność, konfiguracja itp.) I komponent odpowiedzialny (najbardziej wewnętrzny komponent odpowiedzialny za wyjątek). W Javie wyjątek może mieć kilka wyjątków powodujących, a całość musi zostać przeanalizowana.

Na przykład biorąc pod uwagę następujący przykładowy wyjątek:

com.myapp.CustomException: Błąd podczas drukowania…

… (stos)

Przyczyna: com.foo.webservice.RemoteException: brak możliwości komunikacji…

… (stos)

Spowodowany przez: com.acme.PrintException: PrintServer002: Timeout….

… (stos)

Po pierwsze, nasz algorytm dzieli cały stos na trzy pojedyncze wyjątki. Następnie zaczyna analizować te wyjątki, zaczynając od najbardziej wewnętrznego. W tym przypadku określa, że ​​ten wyjątek (drugi spowodowany przez) jest typu Dostępność, a odpowiedzialnym składnikiem jest „serwer druku”. Dzieje się tak, ponieważ istnieje reguła, która pasuje, zawierająca słowo Timeout skojarzone z typem dostępności. Istnieje również reguła, która pasuje do com.acme.PrintException i określa, że ​​odpowiedzialnym składnikiem jest serwer druku. Ponieważ wszystkie potrzebne informacje są określane przy użyciu tylko najbardziej wewnętrznego wyjątku, górne wyjątki są ignorowane, ale nie zawsze tak jest. Jak widać, ten rodzaj przybliżenia jest bardzo złożony (i chaotyczny), ponieważ człowiek musi tworzyć nowe reguły, gdy pojawiają się nowe wyjątki. Poza tym nowe zasady muszą być zgodne z obecnymi, ponieważ nowa zasada dotycząca klasyfikacji nowego wyjątku nie może zmieniać klasyfikacji żadnego z już sklasyfikowanych wyjątków. Myślimy o wykorzystaniu uczenia maszynowego do automatyzacji tego procesu. Oczywiście nie proszę tutaj o rozwiązanie, ponieważ znam złożoność, ale naprawdę byłbym wdzięczny za kilka rad, aby osiągnąć nasz cel.

Przede wszystkim trochę podstaw klasyfikacji (i ogólnie wszelkich nadzorowanych zadań ML), aby upewnić się, że mamy na myśli ten sam zestaw pojęć. Każdy nadzorowany algorytm ML składa się z co najmniej 2 elementów:

  1. Zbiór danych do trenowania i testowania.
  2. Algorytm (y) do obsługi tych danych.

Zbiór danych uczących składa się ze zbioru par (x, y), gdzie x jest wektorem cech, a y jest zmienną przewidywaną. Zmienna przewidywana jest właśnie tym, co chcesz wiedzieć, czyli w twoim przypadku jest to typ wyjątku. Funkcje są bardziej skomplikowane. Nie możesz po prostu wrzucić surowego tekstu do algorytmu, musisz najpierw wyodrębnić jego znaczące części i uporządkować je jako wektory cech. Wspomniałeś już o kilku przydatnych funkcjach – nazwie klasy wyjątku (np. Com.acme.PrintException) i zawartych słowach („Limit czasu”). Wszystko, czego potrzebujesz, to przetłumaczenie wyjątków wierszy (i typów wyjątków skategoryzowanych przez ludzi) na odpowiedni zbiór danych, np .:

ex_class contains_timeout … | ex_type

————————————————– ———

[com.acme.PrintException, 1, …] | Dostępność

[java.lang.Exception, 0, …] | Sieć

Ta reprezentacja jest już znacznie lepsza dla algorytmów ML. Ale który wziąć? Biorąc pod uwagę charakter zadania i obecne podejście, naturalnym wyborem jest użycie drzew decyzyjnych. Ta klasa algorytmów obliczy optymalne kryteria decyzji dla wszystkich typów wyjątków i wydrukuje drzewo wynikowe. Jest to szczególnie przydatne, ponieważ będziesz mieć możliwość ręcznego sprawdzenia, jak podejmowana jest decyzja i zobacz, w jakim stopniu odpowiada ona Twoim ręcznie stworzonym regułom. Istnieje jednak możliwość, że niektóre wyjątki z dokładnie tymi samymi funkcjami będą należeć do różnych typów wyjątków. W takim przypadku podejście probabilistyczne może działać dobrze. Pomimo swojej nazwy klasyfikator Naive Bayes działa w większości przypadków całkiem dobrze. Jest jednak jeden problem z NB i reprezentacją naszego zbioru danych: zbiór danych zawiera dane kategoryczne zmienne, a Naive Bayes może pracować tylko z atrybutami liczbowymi *. Standardowym sposobem rozwiązania tego problemu jest użycie zmiennych fikcyjnych. Krótko mówiąc, zmienne fikcyjne to zmienne binarne, które po prostu wskazują, czy dana kategoria występuje, czy nie. Na przykład pojedyncza zmienna ex_class o wartościach {com.acme.PrintException, java.lang.Exception, …} itd. Może zostać podzielona na kilka zmiennych

Ostatni algorytm do wypróbowania to Support Vector Machines (SVM). Nie zapewnia pomocnej wizualizacji ani nie jest probabilistyczna, ale często daje lepsze wyniki.

 – w rzeczywistości ani twierdzenie Bayesa, ani sam Naive Bayes nie mówią nic o typach zmiennych, ale większość pakietów oprogramowania, które przychodzą na myśl, opiera się na funkcjach numerycznych.

Czy Random Forest jest za dużo?

Czytałem o Random Forests, ale tak naprawdę nie mogę znaleźć ostatecznej odpowiedzi na temat problemu nadmiernego wyposażenia. Według oryginalnego artykułu Breimana, nie powinny one nadmiernie dopasowywać się przy zwiększaniu liczby drzew w lesie, ale wydaje się, że nie ma co do tego zgody. To wprowadza mnie w zakłopotanie w tej kwestii. Może ktoś bardziej ekspert ode mnie może udzielić mi bardziej konkretnej odpowiedzi lub wskazać mi właściwy kierunek, aby lepiej zrozumieć problem.

Możesz chcieć sprawdzić cross-validated – witrynę internetową stachexchange dla wielu rzeczy, w tym uczenia maszynowego. W szczególności na to pytanie (z dokładnie tym samym tytułem) udzielono już wielu odpowiedzi. Sprawdź te linki: http://stats.stackexchange.com/search?

q = losowy + las + przebranie

Mogę jednak udzielić Ci krótkiej odpowiedzi: tak, to przesadza i czasami musisz kontrolować złożoność drzew w swoim lesie, a nawet przycinać, gdy rosną zbyt mocno – ale to zależy od biblioteki, w której używasz budowanie lasu. Na przykład. w random Forest w R możesz tylko kontrolować złożoność

Biblioteki uczenia maszynowego dla Rubiego

Czy istnieją biblioteki uczenia maszynowego dla Rubiego, które są stosunkowo kompletne (w tym szeroki wybór algorytmów do uczenia nadzorowanego i nienadzorowanego), solidnie przetestowane i dobrze udokumentowane? Uwielbiam scikit-learn w Pythonie za niesamowitą dokumentację, ale klient wolałby pisać kod w języku Ruby, ponieważ to jest to, co jest mu znane. Idealnie szukam biblioteki lub zestawu bibliotek, które, podobnie jak scikit i numpy, mogą zaimplementować szeroką gamę struktur danych, takich jak rzadkie macierze, a także uczniów. Niektóre przykłady rzeczy, które będziemy musieli zrobić, to klasyfikacja binarna za pomocą maszyn SVM i implementacja modeli zbioru słów, które mamy nadzieję połączyć z dowolnymi danymi liczbowymi, zgodnie z tym, co opisano w tym poście Stackoverflow.

Pójdę dalej i na razie opublikuję odpowiedź; jeśli ktoś ma coś lepszego, przyjmuję jego. W tym momencie wydaje się, że najpotężniejszą opcją jest dostęp do WEKA za pomocą jRuby. Spędziliśmy wczoraj przeszukiwanie sieci, a ta kombinacja była nawet używana podczas przemówienia na RailsConf 2012, więc zgaduję, że gdyby istniał porównywalny czysty pakiet rubinowy, oni użyliby go. Zauważ, że jeśli wiesz dokładnie, czego potrzebujesz, istnieje wiele indywidualnych bibliotek, które albo opakowują samodzielne pakiety, takie jak libsvm, albo ponownie implementują niektóre indywidualne algorytmy, takie jak Naive Bayes w czystym Rubim, i oszczędzą ci używania jRuby. Ale w przypadku biblioteki ogólnego przeznaczenia WEKA i jRuby wydają się w tej chwili najlepszym wyborem.

Krótki przewodnik po treningu wysoce niezrównoważonych zestawów danych

Mam problem klasyfikacyjny z około 1000 pozytywnymi i 10000 negatywnymi próbkami w zbiorze uczącym. Więc ten zestaw danych jest dość niezrównoważony. Zwykły las losowy próbuje po prostu oznaczyć wszystkie próbki testowe jako klasę większościową. Oto kilka dobrych odpowiedzi na temat próbkowania podrzędnego i lasu losowego ważonego: Jakie są implikacje dla trenowania Zespołu Drzewa z wysoce stronniczymi zestawami danych? Które metody klasyfikacji poza RF mogą najlepiej rozwiązać problem?

* Max Kuhn dobrze to opisuje w rozdziale 16 Applied Predictive Modeling.

* Jak wspomniano w powiązanym wątku, niezrównoważone dane są zasadniczo problemem szkoleniowym wrażliwym na koszty. W związku z tym każde podejście wrażliwe na koszty ma zastosowanie do niezrównoważonych danych.

* Istnieje duża liczba takich podejść. Nie wszystkie zaimplementowane w R: C50, ważone SVM są opcjami. Jous-boost. Myślę, że Rusboost jest dostępny tylko jako kod Matlab.

* Nie używam Weka, ale uważam, że ma dużą liczbę klasyfikatorów wrażliwych na koszty.

* Obsługa niezrównoważonych zbiorów danych: przegląd: Sotiris Kotsiantis, Dimitris Kanellopoulos, Panayiotis Pintelas ”

* W przypadku problemu nierównowagi klas: Xinjian Guo, Yilong Yin, Cailing Dong, Gongping Yang, Guangtong Zhou

Podpróbkowanie klasy większości jest zwykle dobrym rozwiązaniem w takich sytuacjach. Jeśli uważasz, że masz za mało instancji klasy pozytywnej, możesz wykonać nadpróbkowanie, na przykład próbkowanie 5n instancji, zastępując je ze zbioru danych o rozmiarze n.

Ostrzeżenia:

* Niektóre metody mogą być wrażliwe na zmiany w rozkładzie klas, np. dla Naive Bayes – wpływa na wcześniejsze prawdopodobieństwa.

* Oversampling może prowadzić do overfittingu

W tym przypadku dobrym wyborem jest również wzmocnienie gradientowe. Możesz na przykład użyć klasyfikatora zwiększającego gradient w Sci-Kit Learn. Zwiększanie gradientu to oparta na zasadach metoda radzenia sobie z nierównowagą klas poprzez konstruowanie kolejnych zestawów treningowych na podstawie nieprawidłowo sklasyfikowanych przykładów.

Szukasz mocnego tematu doktorskiego z zakresu analizy predykcyjnej w kontekście Big Data

W tym roku zamierzam rozpocząć doktorat z informatyki, a do tego potrzebuję tematu badawczego. Interesuje mnie Predictive Analytics w kontekście Big Data. Interesuje mnie obszar edukacji (kursy MOOC, kursy online…). W tej dziedzinie, jakie niezbadane obszary mogą pomóc mi wybrać mocny temat?

Jako stypendysta CS Ph.D. broniąc mojej pracy doktorskiej w tym roku w temacie związanym z Big Data (zacząłem w 2012 roku), najlepszy materiał, jaki mogę Ci dać, znajduje się w linku: http://www.rpajournal.com/dev/wp-content/uploads /2014/10/A3.pdf

To jest artykuł napisany przez dwóch doktorów z MIT, którzy rozmawiali o Big Data i MOOC. Prawdopodobnie uznasz to za dobry punkt wyjścia. A tak przy okazji, jeśli naprawdę chcesz wymyślić ważny temat (który komisja i twój doradca pozwolą ci zaproponować, zbadać i obronić), musisz przeczytać WIELE i WIELE artykułów. Większość doktorów uczniowie popełniają fatalny błąd, myśląc, że jakiś „pomysł”, który mają, jest nowy, podczas gdy tak nie jest i został już wykonany. Będziesz musiał zrobić coś naprawdę oryginalnego, aby zdobyć doktorat. Zamiast skupiać się na formułowaniu pomysłu w tej chwili, powinieneś zrobić dobry przegląd literatury, a pomysły „zasugerują się”. Powodzenia! To ekscytujący czas dla Ciebie.

Podobieństwo cosinusowe dla rekomendacji ocen? Po co go używać?

Powiedzmy, że mam bazę użytkowników, którzy oceniają różne produkty w skali 1-5. Nasz silnik rekomendacji rekomenduje produkty użytkownikom na podstawie preferencji innych użytkowników, którzy są bardzo podobni. Moim pierwszym podejściem do znalezienia podobnych użytkowników było użycie podobieństwa kosinusowego i traktowanie ocen użytkowników jako komponentów wektorowych. Główny problem z tym podejściem polega na tym, że mierzy ono tylko kąty wektora i nie bierze pod uwagę skali oceny ani wielkości. Moje pytanie brzmi:

Czy są jakieś wady stosowania różnicy procentowej między składowymi wektorów dwóch wektorów jako miary podobieństwa? Jakie wady, jeśli w ogóle, napotkałbym, gdybym użył tej metody zamiast podobieństwa cosinusowego lub odległości euklidesowej?

Na przykład, dlaczego nie zrobić tego po prostu:

n = 5 gwiazdek

a = (1,4,4)

b = (2, 3, 4)

podobieństwo (a, b) = 1 – ((| 1-2 | / 5) + (| 4-3 | / 5) + (| 4-4 | / 5)) / 3 = .86667

Zamiast podobieństwa cosinusowego:

a = (1,4,4)

b = (2, 3, 4)

CosSimilarity (a, b) =

(1 * 2) + (4 * 3) + (4 * 4) / sqrt ((1 ^ 2) + (4 ^ 2) + (4 ^ 2)) * sqrt ((2 ^ 2) + (3 ^ 2) + (4 ^ 2)) = 0,9697

Odchylenie i skalę ocen można łatwo uwzględnić poprzez standaryzację. Istotą wykorzystania metryk podobieństwa euklidesowego we współ-osadzaniu w przestrzeni wektorowej jest to, że ogranicza to problem rekomendacji do znalezienia najbliższych sąsiadów, co można wykonać efektywnie zarówno dokładnie, jak iw przybliżeniu. To, czego nie chcesz robić w rzeczywistych ustawieniach, to porównywać każdą parę element / użytkownik i sortować je według kosztownych danych. To po prostu się nie skaluje. Jedną sztuczką jest użycie przybliżenia, aby ubić stado do rozsądnego rozmiaru wstępnych zaleceń, a następnie przeprowadzić na tym kosztowny ranking. edycja: Microsoft Research przedstawia artykuł, który omawia ten temat w RecSys w tej chwili: Przyspieszenie systemu rekomendacji Xbox przy użyciu transformacji euklidesowej dla przestrzeni produktów wewnętrznych

Odpowiedź buruzaemona Jeśli chodzi o oceny, myślę, że do pomiaru podobieństwa należałoby użyć korelacji rang Spearmana. Podobieństwo cosinusowe jest często używane podczas porównywania dokumentów i być może nie będzie dobrze pasować do zmiennych rang. Odległość euklidesowa jest odpowiednia dla niższych wymiarów, ale porównanie zmiennych rang zwykle wymaga Spearmana. Oto pytanie dotyczące CrossValidated dotyczące Spearman (vs Pearson), które może rzucić więcej światła na Ciebie.

P: Sztuczka haszująca – co się właściwie dzieje

Kiedy algorytmy ML, np. Vowpal Wabbit lub niektóre maszyny do faktoryzacji wygrywające konkursy współczynnika klikalności (Kaggle), wspominają, że funkcje są „zaszyfrowane”, co to właściwie oznacza dla modelu? Powiedzmy, że istnieje zmienna reprezentująca identyfikator dodatku internetowego, która przyjmuje wartości takie jak „236BG231”. Wtedy rozumiem, że ta funkcja jest haszowana do losowej liczby całkowitej. Ale moje pytanie brzmi: czy liczba całkowita jest teraz używana w modelu jako liczba całkowita (numeryczna), LUB czy wartość zaszyfrowana jest nadal traktowana jak zmienna kategorialna i zakodowana na gorąco? Zatem sztuczka polegająca na haszowaniu polega na tym, aby jakoś zaoszczędzić miejsce przy dużych danych?

Drugi punkt to wartość podczas mieszania funkcji. Haszowanie i jedno gorące kodowanie w celu uzyskania rzadkich danych oszczędza miejsce. W zależności od hash algo możesz mieć różne stopnie kolizji, co działa jako rodzaj redukcji wymiarowości. Ponadto w konkretnym przypadku mieszania funkcji Kaggle i jednego gorącego kodowania pomaga w rozszerzaniu / inżynierii funkcji poprzez pobieranie wszystkich możliwych krotek (zwykle tylko drugiego rzędu, ale czasami trzeciego) funkcji, które są następnie mieszane z kolizjami, które wyraźnie tworzą interakcje, które często są predykcyjne podczas gdy indywidualne cechy nie. W większości przypadków ta technika w połączeniu z wyborem cech i regulacją elastycznej siatki w LR działa bardzo podobnie do jednej warstwy ukrytej NN, więc sprawdza się całkiem dobrze w zawodach

Od czego zacząć w sieciach neuronowych

Przede wszystkim wiem, że to pytanie może nie pasować do tej witryny, ale byłbym wdzięczny, gdybyś podał mi kilka wskazówek. Jestem 16-letnim programistą, miałem doświadczenie z wieloma różnymi językami programowania, jakiś czas temu zacząłem kurs w Coursera, zatytułowany wprowadzenie do uczenia maszynowego i od tego momentu bardzo zmotywowałem się do nauki AI, zacząłem czytając o sieciach neuronowych i zrobiłem działający perceptron używając Javy i było naprawdę fajnie, ale kiedy zacząłem robić coś bardziej wymagającego (budowanie oprogramowania do rozpoznawania cyfr), okazało się, że muszę się dużo nauczyć matematyki, kocham matematykę, ale tutejsze szkoły niewiele nas uczą, myślisz, że teraz znam kogoś, kto jest nauczycielem matematyki ,uczenie się matematyki (w szczególności rachunku różniczkowego) jest konieczne do nauki sztucznej inteligencji, czy powinienem poczekać, aż nauczę się tych rzeczy w szkole? Jakie inne rzeczy byłyby pomocne na mojej ścieżce uczenia się AI i uczenia maszynowego? czy inne techniki (takie jak SVM) również wymagają mocnej matematyki? Przepraszam, jeśli moje pytanie jest długie, byłbym wdzięczny, gdybyś mógł mi je przekazać doświadczenie w nauce sztucznej inteligencji.

Nie, powinieneś sam nauczyć się matematyki. Będziesz musiał „tylko” nauczyć się rachunku różniczkowego, statystyki i algebry liniowej (podobnie jak reszty uczenia maszynowego). Teoria sieci neuronowych jest w tej chwili dość prymitywna – to bardziej sztuka niż nauka – więc niż myślisz, że możesz to zrozumieć, jeśli spróbujesz. I tak samo jest wiele sztuczek, których trzeba się nauczyć. Istnieje wiele skomplikowanych rozszerzeń, ale możesz się nimi martwić, gdy zajdziesz tak daleko. Kiedy już zrozumiesz zajęcia Coursera z ML i sieci neuronowych (Hinton’s), proponuję trochę poćwiczyć. To wprowadzenie może Ci się spodobać.

Powiedziałbym… to naprawdę zależy. Może być konieczne: używaj algorytmów uczenia maszynowego: będzie to przydatne w przypadku określonych aplikacji, które możesz mieć. W tej sytuacji potrzebujesz umiejętności programowania i zamiłowania do testowania (ćwiczenie doda siły). Tutaj matematyka nie jest tak bardzo wymagana, powiedziałbym, że można modyfikować istniejące algorytmy. Twoja konkretna aplikacja może nie odpowiadać zwykłym algorytmom, więc może być konieczne dostosowanie ich w celu uzyskania maksymalnej wydajności. Tutaj w grę wchodzi matematyka. zrozumieć teorię algorytmów. Tutaj matematyka jest niezbędna i pomoże ci poszerzyć wiedzę w dziedzinie uczenia maszynowego, opracować własne algorytmy, mówić tym samym językiem co twoi rówieśnicy… Teoria NN może być prymitywna, jak mówi @Emre, ale na przykład nie jest to przypadek SVM (teoria stojąca za SVM wymaga np. zrozumienia odtwarzających się przestrzeni jądra Hilberta). W połowie semestru na pewno będziesz potrzebować mocnej matematyki. Ale nie musisz czekać, aż przyjdą do ciebie, możesz zacząć od razu od algebry liniowej, która jest piękna i przydatna do wszystkiego. A jeśli napotkasz (być może tymczasowe) jakiekolwiek trudności z matematyką, ćwicz dalej w sposób, w jaki już to zrobiłeś (wiele osób może mówić o perceptronie, ale nie jest w stanie stworzyć perceptronu w Javie), jest to bardzo cenne.

[44][Machine Learning] (3)

Jakie są standardowe sposoby obliczania odległości między poszczególnymi zapytaniami?

Zadałem podobne pytanie, pytając o odległość między „dokumentami” (artykuły z Wikipedii, wiadomości itp.). Zrobiłem to osobnym pytaniem, ponieważ zapytania wyszukiwania są znacznie mniejsze niż dokumenty i są znacznie głośniejsze. Dlatego nie wiem (i wątpię), czy zostaną tutaj użyte te same metryki odległości. Preferowane są albo waniliowe, leksykalne metryki odległości, albo najnowocześniejsze semantyczne metryki odległości, przy czym bardziej preferowane są te drugie.

Z mojego doświadczenia wynika, że ​​tylko niektóre klasy zapytań można podzielić na cechy leksykalne (ze względu na niejednoznaczność języka naturalnego). Zamiast tego możesz spróbować użyć logicznych wyników wyszukiwania (witryn lub segmentów witryn, a nie dokumentów, bez rankingu) jako funkcji klasyfikacji (zamiast słów). To podejście sprawdza się dobrze w klasach, w których zapytanie zawiera dużą niejednoznaczność leksykalną, ale istnieje wiele dobrych witryn związanych z zapytaniem (np. Filmy, muzyka, zapytania reklamowe itp.).

Ponadto w przypadku klasyfikacji offline można wykonać LSI w macierzy witryny zapytań. Szczegółowe informacje można znaleźć w książce „Wprowadzenie do wyszukiwania informacji”.

Miara podobieństwa cosinusowego wykonuje dobrą (jeśli nie idealną) pracę przy kontrolowaniu długości dokumentu, więc porównanie podobieństwa 2 dokumentów lub 2 zapytań przy użyciu metryki cosinus i wag tf idf dla słów powinno działać dobrze w obu przypadkach. Poleciłbym również najpierw wykonać LSA na wagach tf idf, a następnie obliczyć cosinus odległość \ podobieństwa. Jeśli próbujesz zbudować wyszukiwarkę, polecam skorzystanie z bezpłatnej wyszukiwarki open source, takiej jak solr lub wyszukiwanie elastyczne, lub po prostu bibliotek surowego lucene, ponieważ wykonują większość pracy za Ciebie i mają dobre wbudowane metody obsługa zapytania w celu udokumentowania problemu podobieństwa.

Najlepsza biblioteka Pythona dla sieci neuronowych

Używam sieci neuronowych do rozwiązywania różnych problemów związanych z uczeniem maszynowym. Używam Pythona i pybrain, ale ta biblioteka jest prawie wycofana. Czy w Pythonie są inne dobre alternatywy?

AKTUALIZACJA: krajobraz nieco się zmienił, odkąd odpowiedziałem na to pytanie w lipcu 2014 roku, a w kosmos pojawiło się kilku nowych graczy. W szczególności polecam sprawdzić:

Lasagne: https://github.com/Lasagne/Lasagne

Keras: https://github.com/fchollet/keras

Deepy: https://github.com/uaca/deepy

Nolearn: https://github.com/dnouri/nolearn

Bloki: https://github.com/mila-udem/blocks

TensorFlow: https://github.com/tensorflow/tensorflow

Każdy z nich ma swoje mocne i słabe strony, więc daj im szansę i zobacz, który najlepiej pasuje do Twojego przypadku użycia. Chociaż rok temu poleciłbym używanie pylearn2, społeczność nie jest już aktywna, więc poleciłbym poszukać gdzie indziej. Moja pierwotna odpowiedź na odpowiedź znajduje się poniżej, ale w tym momencie jest ona w dużej mierze nieistotna. Pylearn2 jest ogólnie uważany za bibliotekę z wyboru dla sieci neuronowych i głębokiego uczenia się w Pythonie. Został zaprojektowany z myślą o łatwych eksperymentach naukowych, a nie łatwości użytkowania, więc krzywa uczenia się jest dość stroma, ale jeśli nie spiesz się i zastosujesz samouczki

Myślę, że będziesz zadowolony z jego funkcji. Zapewnione jest wszystko, od standardowych perceptronów wielowarstwowych, przez maszyny Boltzmanna z ograniczeniami, po sieci splotowe, po autenkodery. Zapewnia świetne wsparcie dla GPU i wszystko jest oparte na Theano, więc wydajność jest zazwyczaj całkiem dobra. Źródło Pylearn2 jest dostępne na github. Należy pamiętać, że Pylearn2 ma obecnie przeciwny problem do pybrain – zamiast zostać porzuconym, Pylearn2 jest w trakcie aktywnego rozwoju i podlega częstym zmianom.

Tensor Flow (docs) od Google to kolejny fajny framework, który ma automatyczne różnicowanie. Zapisałem kilka krótkich przemyśleń na temat Google Tensor Flow na moim blogu, wraz z przykładem MNIST, który mają w swoim samouczku. Lasagne (dokumentacja) jest bardzo fajna, ponieważ wykorzystuje theano (→ możesz użyć GPU) i sprawia, że ​​jest prostszy w użyciu. O ile wiem, autor lasagne wygrał wyzwanie Galaktyki Kaggle. Miło jest, gdy się nie uczysz. Oto przykładowa sieć MNIST:

#!/usr/bin/env python

import lasagne

from lasagne import layers

from lasagne.updates import nesterov_momentum

from nolearn.lasagne import NeuralNet

import sys

import os

import gzip

import pickle

import numpy

PY2 = sys.version_info[0] == 2

if PY2:

from urllib import urlretrieve

def pickle_load(f, encoding):

return pickle.load(f)

else:

from urllib.request import urlretrieve

def pickle_load(f, encoding):

return pickle.load(f, encoding=encoding)

DATA_URL = ‘http://deeplearning.net/data/mnist/mnist.pkl.gz’

DATA_FILENAME = ‘mnist.pkl.gz’

def _load_data(url=DATA_URL, filename=DATA_FILENAME):

“””Load data from `url` and store the result in `filename`.”””

if not os.path.exists(filename):

print(“Downloading MNIST dataset”)

urlretrieve(url, filename)

with gzip.open(filename, ‘rb’) as f:

return pickle_load(f, encoding=’latin-1′)

def load_data():

“””Get data with labels, split into training, validation and test set.”””

data = _load_data()

X_train, y_train = data[0]

X_valid, y_valid = data[1]

X_test, y_test = data[2]

y_train = numpy.asarray(y_train, dtype=numpy.int32)

y_valid = numpy.asarray(y_valid, dtype=numpy.int32)

y_test = numpy.asarray(y_test, dtype=numpy.int32)

return dict(

X_train=X_train,

y_train=y_train,

X_valid=X_valid,

y_valid=y_valid,

X_test=X_test,

y_test=y_test,

num_examples_train=X_train.shape[0],

num_examples_valid=X_valid.shape[0],

num_examples_test=X_test.shape[0],

input_dim=X_train.shape[1],

output_dim=10,

)

def nn_example(data):

net1 = NeuralNet(

layers=[(‘input’, layers.InputLayer),

(‘hidden’, layers.DenseLayer),

(‘output’, layers.DenseLayer),

],

# layer parameters:

input_shape=(None, 28*28),

hidden_num_units=100, # number of units in ‘hidden’ layer

output_nonlinearity=lasagne.nonlinearities.softmax,

output_num_units=10, # 10 target values for the digits 0, 1, 2, …, 9

# optimization method:

update=nesterov_momentum,

update_learning_rate=0.01,

update_momentum=0.9,

max_epochs=10,

verbose=1,

)

# Train the network

net1.fit(data[‘X_train’], data[‘y_train’])

# Try the network on new data

print(“Feature vector (100-110): %s” % data[‘X_test’][0][100:110])

print(“Label: %s” % str(data[‘y_test’][0]))

print(“Predicted: %s” % str(net1.predict([data[‘X_test’][0]])))

def main():

data = load_data()

print(“Got %i testing datasets.” % len(data[‘X_train’]))

nn_example(data)

if __name__ == ‘__main__’:

main()

Caffe jest biblioteką C ++, ale ma powiązania z Pythonem. Większość rzeczy możesz zrobić za pomocą plików konfiguracyjnych (prototxt). Ma wiele opcji i może również korzystać z GPU.

Pylearn polega na Theano i jak wspomniano w drugiej odpowiedzi, korzystanie z biblioteki jest dość skomplikowane, dopóki go nie zdobędziesz. W międzyczasie sugerowałbym skorzystanie z Theanets. Jest również zbudowany na szczycie Theano, ale jest znacznie łatwiejszy w obsłudze. Może to prawda, że ​​nie ma wszystkich funkcji Pylearn, ale do podstawowej pracy jest wystarczający. Jest to również oprogramowanie typu open source, więc jeśli się odważysz, możesz dodawać niestandardowe sieci w locie. EDYCJA: grudzień 2015 r. Ostatnio zacząłem używać Keras. Jest to nieco niższy poziom niż Theanets, ale znacznie mocniejszy. Do podstawowych testów odpowiedni jest Theanets. Ale jeśli chcesz przeprowadzić badania w dziedzinie ANN, Keras jest znacznie bardziej elastyczny. Dodatkowo Keras może używać Tensorflow jako zaplecza.

Wydajne dynamiczne grupowanie

Mam zestaw punktów danych z przedziału jednostkowego (tj. 1-wymiarowy zbiór danych z wartościami liczbowymi). Otrzymuję dodatkowe punkty danych online, a ponadto wartość niektórych punktów danych może zmieniać się dynamicznie. Szukam idealnego algorytmu grupowania, który

może skutecznie rozwiązać te problemy. Wiem, że sekwencyjne grupowanie k-średnich radzi sobie z dodawaniem nowych instancji i przypuszczam, że przy niewielkich modyfikacjach może działać z dynamicznymi wartościami instancji (tj. Najpierw pobiera zmodyfikowaną instancję z odpowiedniego klastra, następnie aktualizuje średnią klastra i na koniec podaje zmodyfikowana instancja jako dane wejściowe do algorytmu, tak jak dodanie niewidocznej instancji). Moim problemem związanym z użyciem algorytmu k-średnich jest wymóg podania liczby klastrów jako danych wejściowych. Wiem, że pokonują inne algorytmy grupowania (GA, MST, metody hierarchiczne itp.) Pod względem złożoności czasowo-przestrzennej. Szczerze mówiąc, nie jestem pewien, ale może uda mi się użyć jednego z wyżej wymienionych algorytmów. Nawet jeśli moje zbiory danych są stosunkowo duże, istnienie jednego wymiaru sprawia, że ​​zastanawiam się. Dokładniej, typowy mój przypadek testowy zawierałby około 10 000-200 1-wymiarowych punktów danych. Chciałbym zakończyć grupowanie najlepiej w ciągu sekundy. Zakłada się, że dynamiczne zmiany punktów wartości są płynne, tj. Stosunkowo niewielkie. Dlatego wysoce preferowana jest możliwość korzystania z istniejących rozwiązań (tj. Możliwość kontynuowania klastrowania na istniejącym, gdy wartość jest zmieniana lub dodawana jest nowa). Podsumowując:

Czy możesz pomyśleć o algorytmie, który zapewni najlepszy punkt między wydajnością obliczeniową a dokładnością klastrów wrt. problem zdefiniowany powyżej?

Czy jest jakaś fajna heurystyka dla algorytmu k-średnich do automatycznego obliczania wartości K wcześniej?

Myślę, że hierarchiczne grupowanie byłoby bardziej wydajne w twoim przypadku (z jednym wymiarem). W zależności od zadania możesz zaimplementować coś takiego: Posiadanie N punktów danych di z ich 1-wymiarową wartością x <sup> i </sup>:

  1. Sortuj punkty danych na podstawie ich wartości x <sup> i </sup>.
  2. Oblicz odległości między sąsiednimi punktami danych (odległości N-1). Każdej odległości należy przypisać parę oryginalnych punktów danych (d <sup> i </sup>, d <sup> j </sup>).
  3. Posortuj odległości w porządku malejącym, aby wygenerować listę par punktów danych (d <sup> i </sup>, d <sup> j </sup>), zaczynając od najbliższej.
  4. Iteracyjnie łącz punkty danych (d <sup> i </sup>, d <sup> i </sup>) w klastry, zaczynając od początku listy (najbliższa para). (W zależności od aktualnego stanu di i dj, połączenie ich oznacza: (a) utworzenie nowego klastra dla dwóch nieklastrowanych punktów danych, (b) dodanie punktu danych do istniejącego klastra oraz (c) połączenie dwóch klastrów.)
  5. Przestań się łączyć, jeśli odległość przekracza pewien próg.
  6. Utwórz pojedyncze klastry dla punktów danych, które nie dostały się do klastrów.

Ten algorytm implementuje grupowanie pojedynczych powiązań. Można go łatwo dostroić, aby wdrożyć przeciętne połączenie. Pełne powiązanie będzie mniej wydajne, ale być może łatwiejsze dadzą dobre wyniki w zależności od danych i zadania. Uważam, że dla 200 000 punktów danych musi to zająć mniej niż sekundę, jeśli używasz odpowiednich struktur danych dla powyższych operacji.

Jak wybrać cechy sieci neuronowej?

Wiem, że nie ma jednoznacznej odpowiedzi na to pytanie, ale załóżmy, że mam ogromną sieć neuronową z dużą ilością danych i chcę dodać nową funkcję na wejściu. „Najlepszym” sposobem byłoby przetestowanie sieci z nową funkcją i zobaczenie wyników, ale czy istnieje metoda sprawdzenia, czy funkcja JEST NIEPRAWDOPODOBNIE pomocna? Podobnie jak miary korelacji (http://www3.nd.edu/~mclark19/learn/CorrelationComparison.pdf) itp.?

Bardzo silna korelacja między nową funkcją a istniejącą funkcją jest dość dobrym znakiem, że nowa funkcja dostarcza niewiele nowych informacji. Prawdopodobnie preferowana jest niska korelacja między nową funkcją a istniejącymi funkcjami. Silna korelacja liniowa między nową cechą a przewidywaną zmienną to dobry znak, że nowa funkcja będzie wartościowa, ale brak wysokiej korelacji nie jest konieczny oznaką słabej cechy, ponieważ sieci neuronowe nie są ograniczone do kombinacji liniowych zmiennych. Jeśli nowy element został utworzony ręcznie z kombinacji istniejących elementów, rozważ pominięcie go. Piękno sieci neuronowych polega na tym, że wymagana jest niewielka inżynieria funkcji i wstępne przetwarzanie – zamiast tego funkcje są uczone przez warstwy pośrednie. O ile to możliwe, preferuj funkcje uczenia się od ich projektowania.

Jak zwiększyć dokładność klasyfikatorów?

Używam przykładu OpenCV letter_recog.cpp do eksperymentowania na losowych drzewach i innych klasyfikatorach. Ten przykład zawiera implementacje sześciu klasyfikatorów – drzewa losowe, wzmocnienie, MLP, kNN, naiwny Bayes i SVM. Używany jest zestaw danych rozpoznawania liter UCI z 20000 instancjami i 16 funkcjami, które dzielę na pół do celów szkoleniowych i testowych. Mam doświadczenie z SVM więc szybko ustawiłem jego błąd rozpoznawania na 3,3%. Po kilku eksperymentach otrzymałem:

Rozpoznawanie liter UCI:

*RTrees – 5.3%

*Boost – 13%

*MLP – 7.9%

*kNN(k=3) – 6.5%

*Bayes – 11.5%

*SVM – 3.3%

Zastosowane parametry:

*RTrees – max_num_of_trees_in_the_forrest=200, max_depth=20,

min_sample_count=1

*Boost – boost_type=REAL, weak_count=200, weight_trim_rate=0.95, max_depth=7

*MLP – method=BACKPROP, param=0.001, max_iter=300 (default values – too slow to experiment)

*kNN(k=3) – k=3

*Bayes – none

*SVM – RBF kernel, C=10, gamma=0.01

Następnie użyłem tych samych parametrów i przetestowałem na zestawach danych Digits i MNIST, najpierw wyodrębniając cechy gradientu (rozmiar wektora 200 elementów):

Cyfry:

*RTrees – 5.1%

*Boost – 23.4%

*MLP – 4.3%

*kNN(k=3) – 7.3%

*Bayes – 17.7%

*SVM – 4.2%

MNIST:

*RTrees – 1.4%

*Boost – out of memory

*MLP – 1.0%

*kNN(k=3) – 1.2%

*Bayes – 34.33%

*SVM – 0.6%

Jestem nowy dla wszystkich klasyfikatorów z wyjątkiem SVM i kNN, dla tych dwóch mogę powiedzieć, że wyniki wydają się dobre. A co z innymi? Spodziewałem się więcej po losowych drzewach, na MNIST kNN daje lepszą dokładność, jakieś pomysły, jak ją zwiększyć? Boost i Bayes dają bardzo niską celność. Na koniec chciałbym użyć tych klasyfikatorów do stworzenia systemu z wieloma klasyfikatorami. Jakakolwiek rada?

Redukcja wymiarowości

Inną ważną procedurą jest porównanie współczynników błędów w szkoleniu i zestawie danych testowych, aby sprawdzić, czy jesteś nadmiernie dopasowany (z powodu „przekleństwa wymiarowości”). Na przykład, jeśli poziom błędów w zestawie danych testowych jest znacznie większy niż błąd w zestawie danych uczących, byłby to jeden wskaźnik. W takim przypadku możesz wypróbować techniki redukcji wymiarowości, takie jak PCA lub LDA. Jeśli jesteś zainteresowany, o PCA, LDA i kilku innych technikach pisałem tutaj: http://sebastianraschka.com/index.html#machine_learning oraz w moim repozytorium GitHub tutaj:

https://github.com/rasbt/pattern_classification

Walidacja krzyżowa

Możesz również przyjrzeć się technikom walidacji krzyżowej, aby ocenić wydajność swoich klasyfikatorów w bardziej obiektywny sposób

Spodziewałem się więcej po losowych drzewach:

* W przypadku lasów losowych, zwykle dla funkcji N, funkcje sqrt (N) są używane do każdej konstrukcji drzewa decyzyjnego. Ponieważ w twoim przypadku N = 20, możesz spróbować ustawić max_depth (liczbę funkcji podrzędnych do skonstruowania każdego drzewa decyzyjnego) na 5.

* Zamiast drzew decyzyjnych zaproponowano i oceniono modele liniowe jako estymatory bazowe w lasach losowych, w szczególności wielomianowej regresji logistycznej i naiwnym modelu Bayesa. Może to poprawić twoją dokładność.

Na MNIST kNN daje lepszą dokładność, jakieś pomysły, jak ją zwiększyć? * Spróbuj z wyższą wartością K (powiedzmy 5 lub 7). Wyższa wartość K dostarczyłaby bardziej wspierających dowodów na temat etykiety klasy punktu.

* Możesz uruchomić PCA lub Linear Discriminant Analysis Fishera przed uruchomieniem najbliższego sąsiada. W ten sposób możesz potencjalnie pozbyć się skorelowanych cech podczas obliczania odległości między punktami, a zatem twoi sąsiedzi k byliby bardziej odporni. Wypróbuj różne wartości K dla różnych punktów w oparciu o wariancję odległości między sąsiadami K.

Grupowanie współrzędnych lokalizacji geograficznej (szer., Długie pary)

Jakie jest właściwe podejście i algorytm klastrowania do klastrowania geolokalizacji? Używam następującego kodu do grupowania współrzędnych geolokalizacji:

importuj numpy jako np

import matplotlib.pyplot as plt

z scipy.cluster.vq import kmeans2, wybielić

współrzędne = np.array ([

[szer. długa],

[szer. długa],

[lat, long]

])

x, y = kmeans2 (wybiel (współrzędne), 3, iter = 20)

plt.scatter (współrzędne [:, 0], współrzędne [:, 1], c = y);

plt.show ()

Czy słuszne jest używanie Kmeans do grupowania lokalizacji, skoro wykorzystuje odległość euklidesową, a nie formułę Haversine’a jako funkcję odległości?

W tym przypadku środki K powinny mieć rację. Ponieważ k-średnie próbuje grupować się wyłącznie na podstawie odległości euklidesowej między obiektami, otrzymasz z powrotem skupiska lokalizacji, które są blisko siebie. Aby znaleźć optymalną liczbę skupień, możesz spróbować wykonać „kolanowy” wykres wnętrza

suma grupowa odległości kwadratowej. Może to być pomocne (http://nbviewer.ipython.org/github/nborwankar/LearnDataScience/blob/master/notebooks/D3.%20KMeans%

20Clustering% 20Analysis.ipynb)

K-średnie nie są tutaj najwłaściwszym algorytmem. Powodem jest to, że k-średnie są zaprojektowane tak, aby minimalizować wariancję. To jest oczywiście pojawiające się z punktu widzenia statystyki i przetwarzania sygnałów, ale dane nie są „liniowe”. Ponieważ twoje dane są w formacie szerokości i długości geograficznej, powinieneś użyć algorytmu, który może obsługiwać dowolne funkcje odległości, w szczególności funkcje odległości geodezyjnej. Popularnymi przykładami są klastry hierarchiczne, PAM, CLARA i DBSCAN. Problemy k-średnich są łatwe do zauważenia, gdy weźmie się pod uwagę punkty bliskie zawinięcia + -180 stopni. Nawet jeśli zhakowałeś k-oznacza, aby użyć odległości Haversine, w kroku aktualizacji, gdy ponownie obliczy średnią, wynik będzie źle wkręcony. W najgorszym przypadku k-średnie nigdy się nie zbiegną!

t-SNE Implementacja Pythona: dywergencja Kullbacka-Leiblera

t-SNE, działa poprzez stopniowe zmniejszanie dywergencji Kullbacka-Leiblera (KL), aż do spełnienia określonego warunku. Twórcy t-SNE sugerują użycie dywergencji KL jako kryterium wydajności dla wizualizacji: można porównać rozbieżności Kullbacka-Leiblera, które zgłasza t-SNE. Całkiem dobrze jest dziesięciokrotnie uruchomić t-SNE i wybrać rozwiązanie o najniższej rozbieżności KL [2]. Wypróbowałem dwie implementacje t-SNE:

* python: sklearn.manifold.TSNE ().

* R: tsne, z biblioteki (tsne).

Obie te implementacje, gdy jest ustawiona gadatliwość, wyświetlają błąd (dywergencja Kullbacka-Leiblera) dla każdej iteracji. Jednak nie pozwalają użytkownikowi uzyskać tych informacji, co wydaje mi się nieco dziwne.

Na przykład kod:

importuj numpy jako np

from sklearn.manifold import TSNE

X = np.array ([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])

model = TSNE (n_components = 2, verbose = 2, n_iter = 200)

t = model.fit_transform (X)

produkuje:

[t-SNE] Obliczanie odległości parami…

[t-SNE] Obliczone prawdopodobieństwa warunkowe dla próby 4/4

[t-SNE] Średnia sigma: 1125899906842624,000000

[t-SNE] Iteracja 10: błąd = 6,7213750, norma gradientu = 0,0012028

[t-SNE] Iteracja 20: błąd = 6,7192064, norma gradientu = 0,0012062

[t-SNE] Iteracja 30: błąd = 6,7178683, norma gradientu = 0,0012114…

[t-SNE] Błąd po 200 iteracjach: 0,270186

O ile rozumiem, 0,270186 powinno być dywergencją KL. Jednak nie mogę uzyskać tych informacji, ani z modelu, ani z t (co jest prostym numpy.ndarray). Aby rozwiązać ten problem, mógłbym: i) obliczyć dywergencję KL samodzielnie, ii) zrobić coś paskudnego w Pythonie, aby przechwycić i przeanalizować wyjście funkcji TSNE (). Jednakże, ja)

byłoby całkiem głupie ponowne obliczenie dywergencji KL, skoro TSNE () już ją obliczyło, ii) byłoby nieco nietypowe pod względem kodu.

Czy masz jakieś inne sugestie? Czy istnieje standardowy sposób uzyskania tych informacji za pomocą tej biblioteki? Wspomniałem, że wypróbowałem bibliotekę tsne w języku R, ale wolałbym, aby odpowiedzi koncentrowały się na implementacji Python sklearn.

Źródło TSNE w scikit-learn jest w czystym Pythonie. Metoda Fit fit_transform () w rzeczywistości wywołuje prywatną funkcję _fit (), która następnie wywołuje prywatną funkcję _tsne (). Ta funkcja _tsne () ma lokalny błąd zmiennej, który jest drukowany na końcu dopasowania. Wygląda na to, że możesz łatwo zmienić jedną lub dwie linie kodu źródłowego, aby to mieć  wartość zwróconą do fit_transform ().

Dlaczego podczas prognozowania powinienem przejmować się danymi sezonowymi?

Mam czas z godzinowym zużyciem gazu. Chcę użyć ARiMR / ARIMA do prognozowania zużycia na następną godzinę na podstawie poprzedniej. Dlaczego powinienem analizować / znaleźć sezonowość (z dekompozycją sezonową i trendową za pomocą Loess (STL)?)?

 „Ponieważ jest tam”.

Dane mają charakter sezonowy. Więc modelujesz to. Dane mają trend. Więc modelujesz to. Może dane są skorelowane z liczbą plam słonecznych. Więc modelujesz to. Ostatecznie masz nadzieję, że nic nie zostanie do modelowania poza nieskorelowanym szumem losowym. Ale myślę, że spieprzyłeś tutaj obliczenia STL. Twoje reszty wyraźnie nie są nieskorelowane seryjnie. Podejrzewam raczej, że nie powiedziałeś funkcji, że Twoja „sezonowość” to cykl 24-godzinny, a nie roczny. Ale hej, nie podałeś nam żadnego kodu ani danych, więc tak naprawdę nie mamy pojęcia, co zrobiłeś, prawda? Jak myślisz, co w ogóle oznacza tutaj „sezonowość”? Masz jakiś pomysł? Twoje dane wydają się mieć trzy szczyty co 24 godziny. Naprawdę? Czy ten „gaz” = „benzyna” = „benzyna” czy gaz w jakimś układzie ogrzewania / zasilania elektrycznego? Tak czy inaczej, jeśli wiesz a priori, że istnieje 8-godzinny cykl lub 8-godzinny cykl oprócz 24-godzinnego cyklu, który wygląda na bardzo wysoką częstotliwość 1 lub 2-godzinny cykl, umieść to w swoim modelu. Właściwie nawet nie mówisz, jaka jest twoja oś x, więc może jej dni, a wtedy dopasowałbym cykl dzienny, tygodniowy, a potem roczny. Ale biorąc pod uwagę, jak to wszystko zmienia się w czasie = około 85, nie spodziewałbym się, że model poradzi sobie dobrze po obu stronach.

Ze statystykami (a to jest to, przepraszam, że cię zawiodłem, ale nie jesteś jeszcze naukowcem zajmującym się danymi), nie mówisz po prostu robotycznie: „I… Teraz… Dopasuj…… Model S TL…. ”. Patrzysz na swoje dane, próbujesz je zrozumieć, a następnie proponujesz model, dopasowujesz go, testujesz i wykorzystujesz parametry, które wyciąga z danych. Częścią tego jest dopasowanie cyklicznych wzorców sezonowych.

Zalety AUC w porównaniu ze standardową dokładnością

Zacząłem patrzeć na obszar pod krzywą (AUC) i jestem trochę zdezorientowany co do jego użyteczności. Kiedy po raz pierwszy mi wyjaśniono, AUC wydawało się świetną miarą wydajności, ale w moich badaniach odkryłem, że niektórzy twierdzą, że jego przewaga jest głównie marginalna, ponieważ najlepiej nadaje się do łapania “ szczęśliwych ” modeli z wysokimi standardowymi pomiarami dokładności i niskim AUC . Czy powinienem zatem unikać polegania na wartości AUC przy walidacji modeli, czy też kombinacja byłaby najlepsza? Dzięki za całą twoją pomoc.

AUC i dokładność to całkiem różne rzeczy. AUC dotyczy klasyfikatorów binarnych, które wewnętrznie mają pewne pojęcie o progu decyzyjnym. Na przykład regresja logistyczna zwraca wartość dodatnią / ujemną w zależności od tego, czy funkcja logistyczna jest większa / mniejsza niż próg, zwykle domyślnie 0,5. Kiedy wybierasz swój próg, masz klasyfikator. Musisz wybrać jedną. Dla danego progu można obliczyć dokładność, czyli odsetek prawdziwych pozytywów i negatywów w całym zbiorze danych. AUC mierzy, w jaki sposób prawdziwa dodatnia stopa (przypominanie) i fałszywie dodatnia stawka ulegają zmianie, więc w tym sensie mierzy już coś innego. Co ważniejsze, AUC nie jest funkcją progu. Jest to ocena klasyfikatora, ponieważ próg zmienia się we wszystkich możliwych wartościach. W pewnym sensie jest to szerszy miernik, testujący jakość wewnętrznej wartości, którą klasyfikator generuje, a następnie porównuje z wartością progową. Nie jest to testowanie jakości konkretnego wyboru progu. AUC ma inną interpretację, a to oznacza, że ​​jest to również prawdopodobieństwo, że losowo wybrany pozytywny przykład znajdzie się wyżej niż losowo wybrany negatywny przykład, zgodnie z wewnętrzną wartością klasyfikatora dla przykładów.

AUC można obliczyć, nawet jeśli masz algorytm, który tworzy ranking tylko na przykładach. AUC nie jest obliczalne, jeśli naprawdę masz tylko klasyfikator czarnej skrzynki, a nie taki z wewnętrznym progiem. Zwykle dyktują one, który z nich jest w ogóle dostępny dla danego problemu. Myślę, że AUC jest bardziej wszechstronną miarą, chociaż ma zastosowanie w mniejszej liczbie sytuacji. To nie jest lepsze niż dokładność; to jest inne. Zależy to po części od tego, czy bardziej zależy Ci na prawdziwych wynikach, fałszywie negatywnych wynikach, itp. F-miara bardziej przypomina dokładność w tym sensie, że jest funkcją klasyfikatora i jego ustawienia progowego. Ale mierzy precyzję vs zapamiętywanie (prawdziwie dodatni współczynnik), który nie jest taki sam jak w przypadku obu powyższych.

Statystyka + informatyka = nauka o danych?

Chcę zostać naukowcem danych. Studiowałem statystykę stosowaną (nauki aktuarialne), więc mam świetne podłoże statystyczne (regresja, proces stochastyczny, szeregi czasowe, żeby wymienić tylko kilka). Ale teraz mam zamiar zrobić tytuł magistra w dziedzinie informatyki z inteligentnych systemów. Oto mój plan nauki:

*Nauczanie maszynowe

* Zaawansowane uczenie maszynowe

* Eksploracja danych

*Logika rozmyta

* Systemy rekomendacji

* Rozproszone systemy danych

*Chmura obliczeniowa

* Odkrycie wiedzy

* Business Intelligence

*Wyszukiwanie informacji

* Wydobywanie tekstu

Na koniec, przy całej mojej wiedzy statystycznej i informatycznej, czy mogę nazywać siebie naukowcem danych? czy się mylę?

To zależy od tego, do jakiego rodzaju „nauki o danych” chcesz się dostać. W przypadku podstawowych analiz i raportowania statystyki z pewnością pomogą, ale w przypadku uczenia maszynowego i sztucznej inteligencji będziesz potrzebować kilku dodatkowych umiejętności

* Teoria prawdopodobieństwa – musisz mieć solidne podstawy w zakresie czystego prawdopodobieństwa, aby móc rozłożyć każdy problem, widziany wcześniej lub nie, na zasady probabilistyczne. Statystyka bardzo pomaga w przypadku już rozwiązanych problemów, ale nowe i nierozwiązane problemy wymagają głębokiego zrozumienia prawdopodobieństwa, aby można było zaprojektować odpowiednie techniki.

Teoria informacji – to (w stosunku do statystyki) dziedzina całkiem nowa (choć wciąż licząca dziesiątki lat), najważniejsza praca była autorstwa Shannona, ale jeszcze ważniejsza i często zaniedbywana uwaga w literaturze to praca Hobsona, która dowiodła, że ​​Kullback-Leibler Divergence jest jedyną matematyczną definicją, która naprawdę oddaje pojęcie „miary informacji”. Obecnie podstawą sztucznej inteligencji jest możliwość ilościowego określenia informacji.

Teoria złożoności – dużym problemem, z którym boryka się wielu naukowców zajmujących się danymi, który nie ma solidnego tła w teorii złożoności, jest to, że ich algorytmy nie skalują się lub po prostu zajmują bardzo dużo czasu na dużych danych. Weźmy na przykład PCA, ulubioną odpowiedź wielu ludzi na pytanie podczas rozmowy kwalifikacyjnej „jak zmniejszyć liczbę funkcji w naszym zbiorze danych”, ale nawet jeśli powiesz kandydatowi, że „zbiór danych jest naprawdę bardzo duży”, nadal proponują różne formy PCA, które są O (n ^ 3). Jeśli chcesz się wyróżniać, chcesz być w stanie samodzielnie rozwiązać każdy problem, a NIE rzucać na to rozwiązania z podręcznika, które zostało zaprojektowane na długo, zanim Big Data stało się tak modne. W tym celu musisz zrozumieć, jak długo to trwa, nie tylko teoretycznie, ale praktycznie – jak wykorzystać klaster komputerów do dystrybucji algorytmu lub które struktury danych zajmują mniej pamięci. Umiejętności komunikacyjne – ogromną częścią nauki o danych jest zrozumienie biznesu. Niezależnie od tego, czy chodzi o wynalezienie produktu opartego na nauce o danych, czy o dostarczanie informacji biznesowych opartych na nauce o danych, bardzo ważna jest umiejętność dobrej komunikacji zarówno z kierownikami projektów, jak i produktów, zespołami technicznymi i innymi naukowcami zajmującymi się danymi. Możesz mieć niesamowity pomysł, powiedzmy niesamowite rozwiązanie AI, ale jeśli nie możesz skutecznie (a) komunikować DLACZEGO, co przyniesie firmie zyski, (b) przekonać kolegów, że to zadziała oraz (c) wyjaśnić pracownikom technicznym, jak potrzebujesz ich pomocy w jego budowie, a wtedy to się nie uda.

Naukowiec danych (dla mnie) duży termin parasolowy. Naukowca danych postrzegałbym jako osobę, która potrafi biegle posługiwać się technikami z zakresu eksploracji danych, uczenia maszynowego, klasyfikacji wzorców i statystyki. Jednak terminy te są ze sobą powiązane: uczenie maszynowe jest powiązane z klasyfikacją wzorców, a eksploracja danych nakłada się, jeśli chodzi o znajdowanie wzorców w danych. Wszystkie techniki mają swoje podstawowe zasady statystyczne. Zawsze wyobrażam sobie to jako diagram Venna z dużym przecięciem. Informatyka jest również związana z tymi wszystkimi dziedzinami. Powiedziałbym, że do prowadzenia badań komputerowo-naukowych potrzebne są techniki „nauki o danych”, ale wiedza informatyczna niekoniecznie jest implikowana w „nauce o danych”. Jednak umiejętności programistyczne – postrzegam programowanie i informatykę jako różne zawody, w których programowanie jest bardziej narzędziem służącym do rozwiązywania problemów – są również ważne przy pracy z danymi i przeprowadzaniu analizy danych. Masz naprawdę fajny plan nauki i wszystko ma sens. Ale nie jestem pewien, czy „chcesz” nazywać siebie po prostu „naukowcem danych”, mam wrażenie, że „naukowiec danych” to termin tak niejednoznaczny, że może oznaczać wszystko albo nic. Chcę przekazać, że staniesz się kimś więcej – bardziej „wyspecjalizowanym” – niż „tylko” naukowcem zajmującym się danymi.

Czy powinienem wybrać „zrównoważony” zestaw danych, czy „reprezentatywny” zestaw danych?

Moje zadanie „uczenia maszynowego” polega na oddzieleniu nieszkodliwego ruchu internetowego od szkodliwego ruchu. W prawdziwym świecie większość (powiedzmy 90% lub więcej) ruchu internetowego jest niegroźna. Dlatego poczułem, że powinienem korzystać z podobnego rodzaju danych do trenowania moich modeli. Ale potem natknąłem się na jeden lub dwa artykuły badawcze (w mojej dziedzinie), które wykorzystywały wyważone dane do trenowania modeli, sugerując równą liczbę przypadków nieszkodliwego i złośliwego ruchu. Ogólnie rzecz biorąc, jeśli buduję modele ML, czy powinienem wybrać zestaw danych, który jest reprezentatywny dla rzeczywistego problemu, czy też zbalansowany zestaw danych lepiej nadaje się do budowania modeli (ponieważ niektóre klasyfikatory nie zachowują się dobrze w przypadku nierównowagi klas lub z powodu z innych nieznanych mi przyczyn)? Czy ktoś może rzucić więcej światła na zalety i wady obu wyborów oraz jak zdecydować, na który z nich się zdecydować?

Powiedziałbym, że odpowiedź zależy od twojego przypadku użycia. Na podstawie mojego doświadczenia:

* Jeśli próbujesz zbudować reprezentatywny model – taki, który opisuje dane, a nie musi przewidywać – sugerowałbym użycie reprezentatywnej próbki danych.

* Jeśli chcesz zbudować model predykcyjny, szczególnie taki, który działa dobrze według miary AUC lub kolejności rang i planujesz użyć podstawowego frameworka ML (tj. Drzewo decyzyjne, SVM, Naive Bayes itp.), To sugeruję ramy zbalansowanego zbioru danych. W znacznej części literatury na temat nierównowagi klas stwierdza się, że losowe niedopróbowanie (zmniejszanie próby z klasy większości do rozmiaru klasy mniejszościowej) może prowadzić do wzrostu wydajności.

* Jeśli budujesz model predykcyjny, ale używasz bardziej zaawansowanej struktury (tj. Czegoś, co określa parametry próbkowania poprzez opakowanie lub modyfikację struktury pakowania, która próbkuje do równoważności klas), sugerowałbym ponowne podanie reprezentatywnej próbki i pozwalając algorytmowi zająć się zbilansowaniem danych do treningu.

Myślę, że to zawsze zależy od scenariusza. Korzystanie z reprezentatywnego zestawu danych nie zawsze jest rozwiązaniem. Załóżmy, że zestaw treningowy zawiera 1000 negatywnych przykładów i 20 pozytywnych przykładów. Bez jakiejkolwiek modyfikacji klasyfikatora algorytm będzie miał tendencję do klasyfikowania wszystkich nowych przykładów jako negatywnych. W niektórych scenariuszach jest to w porządku. Jednak w wielu przypadkach koszty braku pozytywnych przykładów są wysokie, więc musisz znaleźć na to rozwiązanie. W takich przypadkach można użyć wrażliwego na koszty algorytmu uczenia maszynowego. Na przykład w przypadku analizy danych z diagnostyki medycznej. Podsumowując: błędy klasyfikacyjne nie mają takiego samego kosztu!

Zawsze istnieje rozwiązanie umożliwiające wypróbowanie obu podejść i zachowanie tego, które maksymalizuje oczekiwane wyniki. W twoim przypadku założyłbym, że wolisz zminimalizować fałszywie ujemne wyniki kosztem fałszywie pozytywnych wyników, więc chcesz odnieść swój klasyfikator do silnego negatywu wcześniejszego i zająć się nierównowagą, zmniejszając liczbę negatywnych przykładów w zestawie uczącym. Następnie oblicz dokładność / rozpoznawalność, czułość / specyficzność lub dowolne kryterium, które Ci odpowiada w pełnym, niezrównoważonym zbiorze danych, aby upewnić się, że nie zignorowałeś znaczącego wzorca występującego w rzeczywistych danych podczas budowania modelu na podstawie zredukowanych danych.

[44][Machine Learning] (2)

Różnica między używaniem RMSE i nDCG do oceny systemów rekomendujących

Jakiego rodzaju miary błędów podają RMSE i nDCG podczas oceny systemu rekomendacji i skąd mam wiedzieć, kiedy stosować jeden nad drugim? Gdybyś mógł podać przykład, kiedy używać każdego z nich, byłoby to również świetne!

nDCG służy do oceny złotej listy rankingowej (zazwyczaj ocenianej przez ludzi) w porównaniu z listą rankingową wyników. Im większa jest korelacja między dwiema listami rankingowymi, tj. Im bardziej podobne są rangi odpowiednich pozycji na obu listach, tym wartość nDCG jest bliższa 1.

RMSE (Root Mean Squared Error) jest zwykle używany do oceny problemów z regresją, w których wynik (przewidywana wartość skalarna) jest porównywany z prawdziwą wartością skalarną wyjściową dla danego punktu danych.

Tak więc, jeśli po prostu rekomendujesz partyturę (na przykład rekomendujesz ocenę filmu), użyj RMSE. Natomiast jeśli polecasz listę pozycji (na przykład listę powiązanych filmów), użyj nDCG.

nDCG jest miernikiem rankingu, a RMSE nim nie jest. W kontekście systemów rekomendujących użyjesz miernika rankingu, gdy twoje oceny są niejawne (np. Przedmiot pominięty a produkt zużyty), a nie jawny (użytkownik podaje rzeczywistą liczbę, a la Netflix).

Wybór wskaźnika uczenia się

Obecnie pracuję nad wdrożeniem Stochastic Gradient Descent (SGD) dla sieci neuronowych za pomocą propagacji wstecznej i chociaż rozumiem jej cel, mam kilka pytań dotyczących wyboru wartości współczynnika uczenia się.

* Czy tempo uczenia się jest powiązane z kształtem gradientu błędu, ponieważ dyktuje on tempo opadania?

* Jeśli tak, w jaki sposób wykorzystujesz te informacje do podjęcia decyzji o wartości?

* Jeśli nie jest to, jakie wartości mam wybrać i jak mam je wybrać?

* Wygląda na to, że chciałbyś mieć małe wartości, aby uniknąć przekroczenia wartości, ale jak wybrać taką, aby nie utknąć na lokalnych minimach lub zbyt długo zejść?

* Czy ma sens posiadanie stałego wskaźnika uczenia się, czy też powinienem użyć jakiejś metryki, aby zmienić jej wartość, gdy zbliżam się do minimum w gradiencie?

W skrócie: Jak wybrać kurs nauki dla SGD?

Poniżej znajduje się bardzo dobra uwaga (strona 12) dotycząca szybkości uczenia się w sieciach neuronowych (propagacja wsteczna) autorstwa Andrew Ng. Znajdziesz szczegółowe informacje dotyczące współczynnika uczenia się. http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf

Jeśli chodzi o Twój czwarty punkt, masz rację, że zwykle trzeba wybrać „zrównoważony” współczynnik uczenia się, który nie powinien ani przekraczać, ani zbiegać zbyt wolno. Można wykreślić współczynnik uczenia się w.r.t. zejście funkcji kosztu w celu zdiagnozowania / dostrojenia. W praktyce Andrew zwykle używa algorytmu L-BFGS (wspomnianego na stronie 12), aby uzyskać „dostatecznie dobry” współczynnik uczenia się.

Szukam na przykład stosów infrastruktury / przepływów pracy / potoków

Próbuję zrozumieć, jak wszystkie komponenty „dużych zbiorów danych” współgrają ze sobą w przypadku użycia w świecie rzeczywistym, np. hadoop, monogodb / nosql, storm, kafka,… Wiem, że to dość szeroka gama narzędzi używanych do różnych typów, ale chciałbym dowiedzieć się więcej o ich interakcji w aplikacjach, np. myślenie maszynowe dla aplikacji, aplikacji internetowej, sklepu internetowego. Mam odwiedzających / sesję, dane transakcji itp. I przechowuję je; ale jeśli chcę wydawać zalecenia w locie, nie mogę uruchamiać powolnej mapy / zmniejszać zadań związanych z tym w dużej bazie danych dzienników, które mam. Gdzie mogę dowiedzieć się więcej o aspektach infrastruktury? Myślę, że większość narzędzi mogę używać samodzielnie, ale podłączanie ich do siebie wydaje się sztuką samą w sobie. Czy są dostępne publiczne przykłady / przypadki użycia itp.? Rozumiem, że poszczególne potoki silnie zależą od przypadku użycia i użytkownika, ale tylko przykłady będą dla mnie bardzo przydatne.

Aby zrozumieć różne sposoby integracji uczenia maszynowego z aplikacjami produkcyjnymi, myślę, że warto przyjrzeć się projektom open source i artykułom / postom na blogach firm opisujących ich infrastrukturę. Wspólnym motywem, który mają te systemy, jest oddzielenie uczenia modelu od aplikacji modelowej. W systemach produkcyjnych aplikacja modelu musi być szybka, rzędu 100s ms, ale istnieje większa swoboda w tym, jak często należy aktualizować dopasowane parametry modelu (lub quivalent).

Ludzie korzystają z szerokiej gamy rozwiązań do szkolenia i wdrażania modeli:

* Zbuduj model, a następnie wyeksportuj go i wdróż za pomocą PMML

-AirBnB opisuje szkolenie modelu w R / Python i wdrażanie .Modele PMML za pośrednictwem OpenScoring.

-Pattern. Wzorzec to projekt związany z kaskadowaniem, który może wykorzystywać język PMML i wdrażać modele predykcyjne.

* Zbuduj model w MapReduce i uzyskaj dostęp do wartości w niestandardowym systemie

-Conjecture to projekt open source firmy Etsy, który umożliwia szkolenie modeli za pomocą Scalding, łatwiejsze w użyciu opakowanie Scala wokół MapReduce i wdrażanie za pośrednictwem PHP.

-Kiji to projekt open source firmy WibiData, który umożliwia ocenianie modeli (aplikacji) w czasie rzeczywistym, a także funkcjonalność utrwalania danych użytkownika i modeli szkoleniowych na tych danych za pośrednictwem skalowania.

Skorzystaj z systemu online, który pozwala na ciągłą aktualizację parametrów modelu.

-Google wydało świetny artykuł na temat wspólnego filtrowania online, które wdrożyli w celu radzenia sobie z rekomendacjami w Google News.

Jedno z najbardziej szczegółowych i jasnych wyjaśnień dotyczących konfigurowania złożonego potoku analitycznego pochodzi od ludzi z Twitch.

Podają szczegółowe motywacje dotyczące wyboru architektury gromadzenia, transportu, koordynacji, przetwarzania, przechowywania i wykorzystywania ich danych. Fascynująca lektura!

Airbnb i Etsy niedawno opublikowały szczegółowe informacje o swoich przepływach pracy.

Jakie są implikacje dla trenowania zbioru drzew z wysokim stronniczym  zbiorem danych?

Mam wysoce stronniczy binarny zbiór danych – mam 1000 razy więcej przykładów klasy negatywnej niż pozytywnej. Chciałbym wyszkolić zbiór drzew (taki jak Extra Random Trees lub Random Forest) na tych danych, ale trudno jest stworzyć zestawy danych szkoleniowych, które zawierają wystarczającą liczbę przykładów pozytywnych klas. Jakie byłyby konsekwencje zastosowania metody losowania warstwowego w celu znormalizowania liczby pozytywnych i negatywnych przykładów? Innymi słowy, czy złym pomysłem jest, na przykład, sztuczne zawyżanie (przez ponowne próbkowanie) liczby pozytywnych przykładów klas w zbiorze uczącym?

Tak, to problematyczne. Jeśli przesadzisz mniejszość, ryzykujesz nadmiernym dopasowaniem. Jeśli podpróbujesz większość, ryzykujesz pominięciem aspektów klasy większości. Próbkowanie warstwowe jest równoważne przypisywaniu niejednolitych kosztów błędnej klasyfikacji. Alternatywy:

(1) Niezależne próbkowanie kilku podzbiorów z klasy większości i tworzenie wielu klasyfikatorów poprzez łączenie każdego podzbioru ze wszystkimi danymi klas mniejszości, jak sugeruje odpowiedź z @Debasis i opisano w tym artykule EasyEnsemble,

(2) SMOTE (Synthetic Minority Oversampling Technique) lub SMOTEBoost (łączące SMOTE ze wzmocnieniem) w celu stworzenia syntetycznych instancji klasy mniejszościowej poprzez tworzenie najbliższych sąsiadów w przestrzeni funkcji. SMOTE jest zaimplementowany w R w pakiecie DMwR.

Poleciłbym szkolenie na bardziej zrównoważonych podzbiorach danych. Trenowanie losowego lasu na zestawach losowo wybranych pozytywnych przykładów z podobną liczbą próbek negatywnych. W szczególności, jeśli cechy rozróżniające wykazują dużą zmienność, będzie to dość skuteczne i pozwoli uniknąć nadmiernego dopasowania. Jednak w rozwarstwieniu ważne jest, aby znaleźć równowagę, ponieważ nadmierne dopasowanie może stać się problemem niezależnie od tego. Sugerowałbym, aby zobaczyć, jak model radzi sobie z całym zbiorem danych, a następnie stopniowo zwiększać stosunek próbek pozytywnych do negatywnych, zbliżając się do równego stosunku, i wybierać ten, który maksymalizuje miernik wydajności na niektórych reprezentatywnych danych. Ten artykuł wydaje się dość istotny ttp: //statistics.berkeley.edu/sites/default/files/techreports/

666.pdf mówi o ważonym Losowym Lesie, który w większym stopniu penalizuje błędną klasyfikację klasy mniejszości.

Szybkim, łatwym i często skutecznym sposobem podejścia do tej nierównowagi byłoby losowe podpróbkowanie większej klasy (która w twoim przypadku jest klasą ujemną), przeprowadzenie klasyfikacji N wiele razy ze składnikami z dwóch klas (jednej pełnej, a drugiej podpróbka) i podają średnie wartości metryki, przy czym średnia jest obliczana na podstawie N (powiedzmy 1000) iteracji. Bardziej metodycznym podejściem byłoby wykonanie algorytmu Mapping Convergence (MC), który obejmuje identyfikację podzbioru silnie ujemnych próbek za pomocą jednoklasowego klasyfikatora, takiego jak OSVM lub SVDD, a następnie iteracyjne wykonanie klasyfikacji binarnej zbioru silnie negatywnych i pozytywnych próbek.

Czy GLM to model statystyczny czy uczenia maszynowego?

Myślałem, że uogólniony model liniowy (GLM) będzie uważany za model statystyczny, ale znajomy powiedział mi, że niektóre artykuły klasyfikują go jako technikę uczenia maszynowego. Który z nich jest prawdziwy (lub bardziej precyzyjny)? Wszelkie wyjaśnienia będą mile widziane

GLM jest absolutnie modelem statystycznym, ale modele statystyczne i techniki uczenia maszynowego nie wykluczają się wzajemnie. Ogólnie statystyki bardziej dotyczą wnioskowania o parametrach, podczas gdy w uczeniu maszynowym przewidywanie jest ostatecznym celem.

Jeśli chodzi o przewidywanie, statystyki i nauki o uczeniu maszynowym zaczęły rozwiązywać ten sam problem z różnych perspektyw. Zasadniczo statystyka zakłada, że ​​dane zostały wygenerowane przez dany model stochastyczny. Zatem z perspektywy statystycznej zakłada się model i przy różnych założeniach, błędy są traktowane, a parametry modelu i inne pytania są wywnioskowane. Uczenie maszynowe pochodzi z perspektywy informatyki. Modele są algorytmiczne i zwykle wymaga się bardzo niewielu założeń dotyczących danych. Pracujemy z przestrzenią hipotez i błędem uczenia się. Najlepszy opis uczenia maszynowego, jaki znalazłem, znajduje się w książce Toma Mitchella zatytułowanej Machine Learning. Aby uzyskać bardziej wyczerpujący i kompletny pomysł dotyczący dwóch kultur, możesz przeczytać artykuł Leo Broimana zatytułowany Modelowanie statystyczne: dwie kultury Jednak należy dodać, że nawet jeśli te dwie nauki zaczynały z różnych perspektyw, teraz obie z nich dzielą uczciwe ilość powszechnej wiedzy i technik. Dlaczego, ponieważ problemy były takie same, ale narzędzia były inne. Więc teraz uczenie maszynowe jest głównie traktowane z perspektywy statystycznej (patrz książka Hastie, Tibshirani, Friedman The Elements of Statistical Learning from a machine

punkt widzenia uczenia się z potraktowaniem statystycznym i być może książka Kevina P. Murphy’ego Machine Learning: A probabilistyczna perspektywa, by wymienić tylko kilka z najlepszych dostępnych obecnie książek). Nawet historia rozwoju tej dziedziny pokazuje korzyści płynące z tego połączenia

perspektywy. Opiszę dwa wydarzenia. Pierwszym jest stworzenie drzew CART, które zostało stworzone przez Breimana na solidnym tle statystycznym. Mniej więcej w tym samym czasie Quinlan opracował ID3, C45, See5 i tak dalej, pakiet drzew decyzyjnych z bardziej informatycznym zapleczem. Teraz zarówno te rodziny drzew, jak i metody zespołowe, takie jak worki i lasy, stają się całkiem podobne.

Druga historia dotyczy wzmocnienia. Początkowo zostały opracowane przez Freunda i Shapire’a, kiedy odkryli AdaBoost. Wybory dotyczące projektowania AdaBoost były dokonywane głównie z perspektywy obliczeniowej. Nawet autorzy nie rozumieli dobrze, dlaczego to działa.

Dopiero 5 lat później Breiman (ponownie!) Opisał model adaboost z perspektywy statystycznej i wyjaśnił, dlaczego to działa. Od tego czasu różni wybitni naukowcy, z oboma typami doświadczeń, dalej rozwijali te pomysły, prowadząc do Plejad algorytmów wzmacniających, takich jak zwiększanie logistyczne, zwiększanie gradientowe, łagodne zwiększanie i tak dalej. Trudno teraz myśleć o zwiększaniu bez solidnego tła statystycznego. GLM to rozwój statystyczny. Jednak nowe metody Bayesa umieszczają ten algorytm również w środowisku uczenia maszynowego. Dlatego uważam, że oba twierdzenia mogą być słuszne, ponieważ interpretacja i sposób traktowania tego, jak to działa, mogą być różne.

Oprócz odpowiedzi Bena subtelne rozróżnienie między modelami statystycznymi a modelami uczenia maszynowego polega na tym, że w modelach statystycznych przed utworzeniem modelu wyraźnie decydujesz o strukturze równania wyjściowego. Model jest zbudowany w celu obliczenia parametrów / współczynników.

Weźmy na przykład model liniowy lub GLM,

y = a1x1 + a2x2 + a3x3

Twoje zmienne niezależne to x1, x2, x3, a współczynniki do określenia to a1, a2, a3. W ten sposób definiujesz strukturę swojego równania przed zbudowaniem modelu i obliczasz a1, a2, a3. Jeśli uważasz, że y jest w jakiś sposób skorelowane z x2 w sposób nieliniowy, możesz spróbować czegoś takiego.

y = a1x1 + a2 (x2) ^ 2 + a3x3.

W ten sposób wprowadzasz ograniczenie w zakresie struktury wyjściowej. Z natury modele statystyczne są modelami liniowymi, chyba że jawnie zastosujesz transformacje, takie jak sigmoida lub jądro, aby uczynić je nieliniowymi (GLM i SVM). W przypadku modeli uczenia maszynowego rzadko określa się strukturę wyników, a algorytmy, takie jak drzewa decyzyjne, są z natury nieliniowe i działają wydajnie. W przeciwieństwie do tego, co zauważył Ben, modele uczenia maszynowego to nie tylko przewidywanie, lecz także klasyfikacja, regresja itp., Które można wykorzystać do prognozowania, które są również wykonywane przez różne modele statystyczne.

Word2Vec do rozpoznawania nazwanych jednostek

Chcę skorzystać z implementacji word2vec Google, aby zbudować system rozpoznawania jednostek o określonej nazwie. Słyszałem, że rekurencyjne sieci neuronowe z wsteczną propagacją przez strukturę dobrze nadają się do zadań rozpoznawania nazwanych jednostek, ale nie udało mi się znaleźć przyzwoitej implementacji ani przyzwoitego samouczka dla tego typu modelu. Ponieważ pracuję z nietypowym korpusem, standardowe narzędzia NER w NLTK i podobne działały bardzo słabo i wygląda na to, że będę musiał wyszkolić własny system. Krótko mówiąc, jakie zasoby są dostępne dla tego rodzaju problemu? Czy jest dostępna standardowa rekurencyjna implementacja sieci neuronowej?

Zamiast „rekurencyjnych sieci neuronowych z propagacją wsteczną” można rozważyć podejście zastosowane przez Frantziego i in. glin. w National Center for Text Mining (NaCTeM) na University of Manchester for Termine (patrz: http://www.nactem.ac.uk/index.php i http://personalpages.manchester.ac.uk/staff/sophia. ananiadou / IJODL2000.pdf) Zamiast głębokich sieci neuronowych „łączą informacje językowe i statystyczne”. Dwie ostatnie publikacje wykorzystują architekturę głębokiego uczenia o nazwie CharWNN, aby rozwiązać ten problem. CharWNN został po raz pierwszy użyty do uzyskania najnowocześniejszych wyników (bez ręcznie wykonanych funkcji) w tagowaniu części mowy (POS) w korpusie angielskim. Drugi artykuł tego samego autora wykorzystuje tę samą (lub podobną) architekturę do przewidywania, czy słowo należy do 10 klas nazwanych jednostek, z widocznymi wynikami najnowszej wiedzy.

Jakiego modelu statystycznego należy użyć, aby przeanalizować prawdopodobieństwo, że pojedyncze zdarzenie wpłynęło na dane dotyczące zmian w czasie.

Próbuję znaleźć formułę, metodę lub model do analizy prawdopodobieństwa, że ​​określone zdarzenie wpłynęło na niektóre dane dotyczące zmian w czasie. Trudno mi się dowiedzieć, czego szukać w Google. Oto przykładowy scenariusz: Wyobraź sobie, że jesteś właścicielem firmy, która ma średnio 100 klientów dziennie. Pewnego dnia decydujesz, że chcesz zwiększyć liczbę klientów przychodzących codziennie do Twojego sklepu, więc robisz szalony wyczyn przed sklepem, aby zwrócić na siebie uwagę. W ciągu następnego tygodnia widzisz średnio 125 klientów dziennie. W ciągu następnych kilku miesięcy ponownie decydujesz, że chcesz zdobyć więcej klientów i być może utrzymać je nieco dłużej, więc próbujesz innych przypadkowych rzeczy, aby przyciągnąć więcej klientów do swojego sklepu. Niestety, nie jesteś najlepszym marketerem, a niektóre z twoich taktyk mają niewielki lub żaden wpływ, a inne mają nawet negatywny wpływ.

Jakiej metodologii mogę użyć do określenia prawdopodobieństwa, że ​​jedno zdarzenie wpłynie pozytywnie lub negatywnie na liczbę klientów, którzy przychodzą do sklepu? W pełni zdaję sobie sprawę, że korelacja niekoniecznie oznacza związek przyczynowy, ale jakich metod mogę użyć, aby określić prawdopodobny wzrost lub spadek codziennego spaceru klienta po określonym wydarzeniu? Nie jestem zainteresowany analizowaniem, czy istnieje korelacja między twoimi próbami zwiększenia liczby klientów przychodzących, ale raczej, czy jedno zdarzenie, niezależne od wszystkich innych, miało wpływ.

Zdaję sobie sprawę, że ten przykład jest dość wymyślny i uproszczony, więc podam również krótki opis rzeczywistych danych, których używam:

Próbuję określić wpływ, jaki dana agencja marketingowa wywiera na witrynę swojego klienta, gdy publikuje nowe treści, prowadzi kampanie w mediach społecznościowych itp. W przypadku jednej określonej agencji mogą mieć od 1 do 500 klientów. Każdy klient ma

witryny o wielkości od 5 stron do znacznie ponad 1 miliona. W ciągu ostatnich 5 lat każda agencja opisywała całą swoją pracę dla każdego klienta, w tym rodzaj wykonanej pracy, liczbę stron internetowych w witrynie, na które miało to wpływ, liczbę spędzonych godzin itp. powyższe dane, które zgromadziłem w hurtowni danych (umieszczone w zestawie schematów gwiazda / płatek śniegu), muszę określić, jak prawdopodobne było, że jakakolwiek praca (jedno zdarzenie w czasie) miała wpływ na ruch trafiający na dowolne / wszystkie strony, na które ma wpływ określona praca. Stworzyłem modele dla 40 różnych typów treści, które można znaleźć na stronie internetowej, które opisują typowy wzorzec ruchu, jaki może wystąpić na stronie o tym typie zawartości od daty uruchomienia do chwili obecnej. Znormalizowana względem odpowiedniego modelu, muszę określić najwyższą i najniższą liczbę zwiększonych lub zmniejszonych odwiedzających daną stronę otrzymaną w wyniku wykonania określonej pracy.

Chociaż mam doświadczenie z podstawową analizą danych (regresja liniowa i wielokrotna, korelacja itp.), Nie wiem, jak podejść do rozwiązania tego problemu. Podczas gdy w przeszłości zazwyczaj analizowałem dane z wieloma pomiarami dla danej osi (na przykład temperatura vs pragnienie vs zwierzę i określałem wpływ na pragnienie, jakie ma podwyższona temperatura u zwierząt), czuję, że powyżej próbuję przeanalizować wpływ pojedynczego zdarzenia w pewnym momencie dla nieliniowego, ale przewidywalnego (lub przynajmniej możliwego do modelowania),

zestaw danych podłużnych. Jestem zdumiony :(. Każda pomoc, wskazówki, wskazówki, zalecenia lub wskazówki byłyby niezwykle pomocne i byłbym wdzięczny na zawsze!

W czasach moich analityków danych ten typ problemu był dość typowy. Zasadniczo każdy w marketingu wpadłby na szalony pomysł, że sprzedaż wyższej kadrze jako jedno zdarzenie, które zwiększy KPI o 2000%. Przełożeni akceptowali ich, a potem rozpoczynali „test”. Wyniki wróciły, a kierownictwo zrzuciło je do analityków danych, aby ustalić, co zadziałało i kto to zrobił. Krótka odpowiedź brzmi: naprawdę nie możesz wiedzieć, czy nie został on uruchomiony jako losowy test w stylu A / B w podobnych okresach. Ale zdaję sobie sprawę, jak ułomna jest ta odpowiedź, zwłaszcza jeśli fakt, że nie ma czystej odpowiedzi, nie ma znaczenia dla pilności przyszłych decyzji biznesowych. Oto kilka technik, których użyłbym, aby uratować analizę w tej sytuacji, pamiętaj, że jest to bardziej sztuka niż nauka.

* Uchwyty Uchwyt to coś, co istnieje w danych, którego możesz się trzymać. Z tego, co mi mówisz w swojej sytuacji, masz wiele informacji o tym, kim jest agencja marketingowa, kiedy próbowała taktyki i do której witryny ją zastosowała. To jest twój punkt wyjścia i

informacje takie jak ta będą kamieniem węgielnym Twojej analizy.

* Metodologia Metodologia prawdopodobnie będzie miała największy wpływ na to, którym agencjom przypisuje się wszelkie zyski, więc będziesz musiał upewnić się, że jest ona jasno zarysowana, a wszyscy interesariusze zgadzają się, że ma to sens. Jeśli nie możesz tego zrobić, ludziom trudno będzie zaufać twojej analizie. Przykładem tego są konwersje. Powiedzmy, że dział marketingu kupuje kilka potencjalnych klientów i trafiają na naszą stronę docelową, śledzimy je przez 3 dni, a jeśli w tym czasie dokonają zakupu, uznamy je za przekonwertowane. Dlaczego 3 dni, dlaczego nie 5 lub 1? To nie jest ważne, o ile wszyscy się zgadzają, teraz masz definicję, na której możesz zbudować.

* Porównania Idealnie byłoby, gdybyś miał fajny test A / B, aby udowodnić ostateczną zależność. Zakładam, że brakuje ci tych danych, ale możesz się czegoś nauczyć z prostego porównania podobnych danych. Kiedy firmy próbują określić skuteczność reklamy radiowej, często wyświetlają reklamy w miesiącach offsetowych na tym samym rynku lub przez kilka miesięcy na jednym rynku i porównują to z wynikami na innym, ale podobnym rynku. To nie uchodzi za naukę, ale nawet przy całym tym hałasie silne wyniki będą prawie zawsze zauważalne. Połączyłbym je w twoim przypadku, aby określić, jak długo trwa wydarzenie, aby zarejestrować efekt. Gdy masz już dane z tego okresu, porównaj je z modelowaną prognozą ruchu, wzrostem z tygodnia na tydzień, z miesiąca na miesiąc itp., Co pozwoli na sensowne porównanie agencji i różnych okresów.

* Pragmatyzm Dążeniem jest być w stanie zapewnić głębokie zrozumienie przyczyny i skutku, ale prawdopodobnie nie jest to realistyczne. Ze względu na to, jak chaotyczne czynniki zewnętrzne wpływają na twoją analizę, jesteś

nieustannie napotykamy na pytanie: czy to wydarzenie zwiększyło wolumen / sprzedaż / liczbę kliknięć, czy w ogóle zrobienie czegoś przyniosłoby ten sam efekt? Najlepszą radą, jaką mogę w tej sprawie, jest ustalenie bardzo realistycznych celów dla tego, czego szukasz

pomiar. Dobrym punktem wyjścia jest, w ramach posiadanej metodologii, które wydarzenie miało największy wpływ. Kiedy już je otworzysz, stamtąd.

Podsumowanie

Po rozważeniu wszystkich tych aspektów możesz przystąpić do tworzenia ogólnego rozwiązania, które można następnie zautomatyzować. Zaletą projektowania rozwiązania w ten sposób jest to, że logika biznesowa jest już wbudowana. Dzięki temu Twoje wyniki będą znacznie bardziej przystępne i intuicyjne dla nietechnicznych liderów biznesu.

Edycja: Ostrzeżenie, zostawiam wiadomość, ale moja odpowiedź wydaje się błędna, sprawdź komentarz poniżej! Nie jestem ekspertem, ale wydaje mi się, że głównym problemem jest odpowiedź na pytanie: czy jakieś zdarzenie wpłynęło na liczbę trafień w określonym dniu? Ale nie wiem, jak traktować wiele zdarzeń, więc spróbuję odpowiedzieć na to pytanie: Czy zdarzenie X wpłynęło na liczbę trafień w określonym dniu? Na co można odpowiedzieć za pomocą testowania hipotez z wartościami p (co naukowcy robią, aby ocenić na przykład, czy lek wpływa na chorobę, czy nie). Używając wartości p, można określić, czy liczba trafień w danym dniu była po prostu przypadkowa i akceptowalna w normalnych okolicznościach, czy też musi odpowiadać zmianie w modelu. Więcej o wartościach p przeczytasz w Otwartym wprowadzeniu do Statistics Book. Stamtąd dowiedziałem się o nich więcej. Następnie pozostałe części problemu dotyczą tego, jak zidentyfikować swoje zdarzenia i obliczyć niezbędne parametry, aby odpowiedzieć na twoje pytanie (średnia / mediana, wariancja itp.), A także jak zachować to aktualne i działające.

Jak dobrać algorytmy do metod zespołowych?

Istnieje ogólne zalecenie, że algorytmy w kombinacjach uczenia się w zespołach powinny mieć inny charakter. Czy istnieje tabela klasyfikacyjna, skala lub jakieś reguły, które pozwalają ocenić, jak daleko są od siebie algorytmy? Jakie są najlepsze kombinacje?

Ogólnie w zespole starasz się łączyć opinie wielu klasyfikatorów. Pomysł jest jak poproszenie grupy ekspertów o to samo. Otrzymujesz wiele opinii i później musisz połączyć ich odpowiedzi (np. Za pomocą schematu głosowania). Aby ta sztuczka zadziałała, klasyfikatory różnią się od siebie, czyli nie chcesz dwukrotnie pytać tego samego „eksperta” o tę samą rzecz. W praktyce klasyfikatory nie muszą być różne w sensie innego algorytmu. Możesz wytrenować ten sam algorytm z innym podzbiorem danych lub innym podzbiorem funkcji (lub obydwoma). Jeśli używasz różnych zestawów treningowych, otrzymujesz różne modele i różne „niezależne” klasyfikatory. Nie ma złotej zasady określającej, co ogólnie działa najlepiej. Musisz spróbować sprawdzić, czy istnieje poprawa dla twojego konkretnego problemu.

Z reguły proponuję trzy różne opcje:

* Użyj techniki uczenia się w workach, podobnej do tej, po której stosuje się Random Forest. Technika ta umożliwia uczenie „małych” klasyfikatorów, które widzą niewielką część całych danych. Następnie prosty schemat głosowania (jak w Random Forest) doprowadzi Cię do bardzo interesującej i solidnej klasyfikacji.

* Użyj dowolnej techniki związanej z łączeniem informacji lub fuzją probabilistyczną. Jest to bardzo odpowiednie rozwiązanie, aby połączyć różne prawdopodobieństwa z różnych klasyfikatorów.

* Moja ostatnia sugestia to użycie logiki rozmytej, bardzo odpowiedniego narzędzia do prawidłowego łączenia informacji z perspektywy probabilistycznej (przynależności). Wybór konkretnych metod lub strategii będzie w ogromnym stopniu zależał od danych.

Binarny model klasyfikacji rzadkich / stronniczych danych

Mam zbiór danych z następującymi specyfikacjami:

* Zbiór danych treningowych z 193176 próbkami z 2821 pozytywami

* Zestaw danych testowych z 82887 próbkami z 673 pozytywami

* Istnieje 10 funkcji.

Chcę przeprowadzić klasyfikację binarną (powiedzmy 0/1). Problem, z którym się zmagam, polega na tym, że dane są bardzo stronnicze lub raczej skąpe. Po normalizacji i skalowaniu danych wraz z inżynierią funkcji i przy użyciu kilku różnych algorytmów, są to najlepsze wyniki, jakie mogłem osiągnąć:

średni błąd kwadratowy: 0,00804710026904

Macierz zamieszania: [[82214 667]

[0 6]]

czyli tylko 6 poprawnych trafień pozytywnych. To używa regresji logistycznej. Oto różne rzeczy. Próbowałem z tym:

* Różne algorytmy, takie jak RandomForest, DecisionTree, SVM

* Zmiana wartości parametrów w celu wywołania funkcji

* Pewna inżynieria funkcji oparta na intuicji, obejmująca funkcje złożone

Teraz moje pytania to:

  1. Co mogę zrobić, aby zwiększyć liczbę pozytywnych trafień?
  2. Jak można ustalić, czy w takim przypadku występuje overfit? (Próbowałem kreślić itp.)
  3. W którym momencie można by wywnioskować, czy jest to najlepsze możliwe dopasowanie, jakie mogłem mieć? (co wydaje się smutne, biorąc pod uwagę tylko 6 trafień na 673)
  4. Czy istnieje sposób, aby sprawić, by pozytywne instancje próbki ważyły ​​więcej, aby rozpoznawanie wzorców poprawiło się, prowadząc do większej liczby trafień?
  5. Które wykresy graficzne mogą pomóc wykryć wartości odstające lub jakąś intuicję co do tego, który wzór będzie najlepiej pasował?

Używam biblioteki scikit-learn w Pythonie i wszystkie implementacje są funkcjami bibliotecznymi.

Oto wyniki z kilkoma innymi algorytmami:

Losowy klasyfikator lasu (n_estimators = 100)

[[82211 667]

[3 6]]

Drzewa decyzyjne:

[[78611 635]

[3603 38]]

  1. Czy od czasu przeprowadzania klasyfikacji binarnej próbowałeś dostosować próg klasyfikacji? Ponieważ twój algorytm wydaje się raczej niewrażliwy, spróbuję go obniżyć i sprawdzić, czy jest poprawa.
  2. Zawsze możesz użyć krzywych uczenia się lub wykresu jednego parametru modelu względem błędu uczenia i walidacji, aby określić, czy model jest nadmiernie dopasowany. Wygląda na to, że w twoim przypadku jest to niedopasowane, ale to tylko intuicja.
  3. Cóż, ostatecznie zależy to od zbioru danych i różnych modeli, które wypróbowałeś. W tym momencie i bez dalszych testów nie może być jednoznacznej odpowiedzi.
  4. Nie twierdząc, że jesteś ekspertem w temacie, istnieje wiele różnych technik, które możesz zastosować (wskazówka: pierwszy link w google), ale moim zdaniem powinieneś najpierw upewnić się, że wybrałeś swoją funkcję kosztów, aby reprezentuje to, czego faktycznie szukasz.
  5. Nie jesteś pewien, co masz na myśli mówiąc o intuicji wzorowej, czy możesz to rozwinąć? A propos, jakie były twoje wyniki przy użyciu różnych algorytmów, które wypróbowałeś? Czy były inne?

Obsługa regularnie rosnącego zestawu funkcji

Pracuję nad systemem wykrywania oszustw. Na tym polu regularnie pojawiają się nowe oszustwa, więc na bieżąco trzeba dodawać nowe funkcje do modelu. Zastanawiam się, jak najlepiej sobie z tym poradzić (z perspektywy procesu deweloperskiego)? Samo dodanie nowej funkcji do wektora cech i ponowne szkolenie klasyfikatora wydaje się być naiwnym podejściem, ponieważ zbyt dużo czasu zostanie poświęcone na ponowne nauczenie się starych funkcji. Zastanawiam się nad wytrenowaniem klasyfikatora dla każdej cechy (lub kilku powiązanych cech), a następnie połączeniem wyników tych klasyfikatorów z ogólnym klasyfikatorem. Czy są jakieś wady tego podejścia? Jak mogę wybrać algorytm dla ogólnego klasyfikatora?

W idealnym świecie zachowujesz wszystkie swoje dane historyczne i rzeczywiście uruchamiasz nowy model z nową funkcją wyodrębnioną wstecz z danych historycznych. Twierdziłbym, że zasoby obliczeniowe wydane na to są w rzeczywistości całkiem przydatne. Czy to naprawdę problem? Tak, jest to powszechnie akceptowana technika tworzenia zespołu klasyfikatorów i łączenia ich

wyniki. Możesz zbudować nowy model równolegle tylko na nowych funkcjach i przeciętnie w jego prognozach. Powinno to zwiększyć wartość, ale nigdy nie uchwycisz interakcji między nowymi i starymi funkcjami w ten sposób, ponieważ nigdy nie pojawią się one razem w klasyfikatorze.

Oto pomysł, który właśnie wyskoczył niespodziewanie – co zrobić, jeśli użyjesz losowego próbkowania podprzestrzeni (jak w rzeczywistości zasugerował już Sean Owen), aby wyszkolić kilka nowych klasyfikatorów za każdym razem, gdy pojawi się nowa funkcja (używając losowego podzbioru funkcji, w tym nowy zestaw funkcji). Możesz trenować te modele również na podzbiorze próbek, aby zaoszczędzić trochę czasu na szkolenie. W ten sposób możesz mieć nowe klasyfikatory, które mogą przyjmować zarówno nowe, jak i stare funkcje, i zachowując jednocześnie stare klasyfikatory. Możesz nawet, używając techniki walidacji krzyżowej, mierzyć wydajność każdego klasyfikatora, po pewnym czasie zabić te najgorsze, aby uniknąć rozdętego modelu.

Jakie są standardowe sposoby obliczania odległości między plikami dokumentów?

Kiedy mówię „dokument”, mam na myśli strony internetowe, takie jak artykuły z Wikipedii i wiadomości. Wolę odpowiedzi, które zawierają albo waniliowe, leksykalne metryki odległości, albo najnowocześniejsze semantyczne metryki odległości, z silniejszą preferencją dla tych ostatnich. Jest na to wiele różnych sposobów, w zależności od tego, ile dokładnie informacji semantycznych chcesz zachować i jak łatwo tokenizować dokumenty (dokumenty html byłyby prawdopodobnie dość trudne do tokenizacji, ale można sobie wyobrazić coś z tagami i kontekstem .) Niektóre z nich zostały wspomniane przez ffriend, a wektory akapitowe użytkownika1133029 są naprawdę solidne, ale pomyślałem, że zagłębię się w plusy i minusy różnych podejść.

Odległość cosinusowa – wypróbowana, prawdziwa odległość cosinusowa jest prawdopodobnie najpowszechniejszą miarą odległości używaną ogólnie w wielu dziedzinach. Mając to na uwadze, jest bardzo mało informacji dotyczących odległości cosinusowych, które w rzeczywistości można odwzorować z powrotem na cokolwiek semantyczne, co wydaje się nie być idealne w tej sytuacji.

Odległość Levenshteina – znana również jako odległość edycji, jest zwykle używana na poziomie pojedynczego tokena (słowa, bigramy itp.). Generalnie nie polecałbym tej metryki, ponieważ nie tylko odrzuca ona wszelkie informacje semantyczne, ale także bardzo podobnie traktuje bardzo różne zmiany słów, ale jest to niezwykle powszechna metryka za tego typu rzeczy

LSA – jest częścią dużego arsenału technik służących do oceny podobieństwa dokumentów zwanego modelowaniem tematycznym. LSA wyszedł z mody całkiem niedawno iz mojego doświadczenia wynika, że ​​nie jest to najmocniejsze podejście do modelowania tematycznego, ale jest stosunkowo proste do wdrożenia i ma kilka wdrożeń open source

LDA – jest również techniką używaną do modelowania tematycznego, ale różni się od LSA tym, że w rzeczywistości uczy się wewnętrznych reprezentacji, które wydają się być bardziej płynne i intuicyjne. Ogólnie rzecz biorąc, wyniki uzyskane z LDA są lepsze do modelowania podobieństwa dokumentów niż LSA, ale nie są tak dobre, aby nauczyć się silnego rozróżniania tematów.

Alokacja Pachinko – to naprawdę zgrabne rozszerzenie oprócz LDA. Ogólnie jest to po prostu znacznie ulepszona wersja LDA, z jedynym minusem jest to, że trenowanie zajmuje nieco więcej czasu, a implementacje open-source są nieco trudniejsze do zdobycia

word2vec – Google pracuje nad serią technik inteligentnego redukowania słów i dokumentów do bardziej rozsądnych wektorów niż rzadkie wektory uzyskiwane za pomocą technik takich jak Count Vectorizers i TF-IDF. Word2vec jest świetny, ponieważ ma wiele implementacji open source. Gdy już mamy wektor, można zastosować dowolną inną metrykę podobieństwa (np. Odległość cosinus) ze znacznie większą skutecznością.

* doc2vec – znany również jako wektory akapitowe, jest to najnowszy i największy z serii artykułów Google, poświęcony gęstym reprezentacjom wektorowym dokumentów. Biblioteka gensim w Pythonie ma implementację word2vec, która jest na tyle prosta, że można ją dość rozsądnie wykorzystać do zbudowania doc2vec, ale pamiętaj o licencji, jeśli chcesz iść tą drogą Mam nadzieję, że to pomoże, daj mi znać, jeśli masz jakieś pytania.

Istnieje wiele semantycznych miar odległości, z których każda ma swoje wady i zalety. Oto tylko kilka z nich:

* odległość cosinusowa, iloczyn skalarny między wektorami cech dokumentu; * LSA, inny model oparty na wektorze, ale wykorzystujący SVD do usuwania szumów z oryginalnej macierzy dokumentów terminowych;

* Oparty na WordNet, zweryfikowany przez człowieka, choć trudno go rozszerzyć.

Zacznij od najprostszego podejścia, a następnie przejdź dalej w oparciu o problemy w Twoim konkretnym przypadku.

Wydaje się, że najnowszym stanem techniki są „wektory akapitowe” wprowadzone w niedawnym artykule:

http://cs.stanford.edu/~quocle/paragraph_vector.pdf. Odległość kosinusowa / euklidesowa między wektorami akapitu prawdopodobnie działałaby lepiej niż jakiekolwiek inne podejście. Prawdopodobnie nie jest to jeszcze możliwe z powodu braku implementacji open source. Kolejną najlepszą rzeczą jest odległość cosinusowa między wektorami LSA lub odległość cosinusowa między surowymi wektorami BOW. Czasami lepiej jest wybrać różne schematy ważenia, takie jak TFIDF.

[44][Machine Learning]

Z książki The Discipline of Machine Learning autorstwa Toma Mitchella:

Dziedzina uczenia maszynowego stara się odpowiedzieć na pytanie „Jak możemy budować systemy komputerowe, które automatycznie ulepszają się wraz z doświadczeniem i jakie są podstawowe prawa rządzące wszystkimi procesami uczenia się?” To pytanie obejmuje szeroki zakres zadań edukacyjnych, takich jak projektowanie autonomicznych robotów mobilnych, które uczą się nawigować na podstawie własnego doświadczenia, jak przeszukiwać historyczną dokumentację medyczną, aby dowiedzieć się, którzy przyszli pacjenci będą najlepiej reagować na które terapie i jak budować wyszukiwarki, które automatycznie dostosowują się do zainteresowań ich użytkowników. Mówiąc dokładniej, mówimy, że maszyna uczy się w odniesieniu do konkretnego zadania T, miernika wydajności P i rodzaju doświadczenia E, jeśli system niezawodnie poprawia wydajność P w zadaniu T, po doświadczeniu E. W zależności od tego, jak określimy T, P i E, zadanie uczenia się może być również nazywane nazwami, takimi jak eksploracja danych, autonomiczne wykrywanie, aktualizacja bazy danych, programowanie według przykładów itp.

PYTANIA:

Użyj liblinear w przypadku dużych zbiorów danych do analizy semantycznej

Używam Libsvm do trenowania danych i przewidywania klasyfikacji na problem analizy semantycznej. Ale ma to problem z wydajnością w przypadku danych o dużej skali, ponieważ analiza semantyczna dotyczy problemu z wymiarami. W zeszłym roku Liblinear został wydany i może rozwiązać wąskie gardło wydajności. Ale kosztowało to zbyt dużo pamięci. Czy MapReduce to jedyny sposób rozwiązania problemu analizy semantycznej w przypadku dużych zbiorów danych? A może są jakieś inne metody, które mogą poprawić wąskie gardło pamięci w Liblinear?

ODPOWIEDZI:

Zauważ, że istnieje wczesna wersja LIBLINEAR przeportowana do Apache Spark. Zobacz komentarze na liście mailingowej, aby uzyskać wczesne szczegóły i witrynę projektu.

Możesz sprawdzić wabbit samogłosek. Jest dość popularny w przypadku uczenia się na dużą skalę i zawiera równoległe przepisy. Z ich strony internetowej:

VW to kwintesencja szybkości w uczeniu maszynowym, umożliwiająca łatwe uczenie się na podstawie zestawów danych terafeature. Poprzez uczenie równoległe może przekroczyć przepustowość dowolnego interfejsu sieciowego maszyny podczas uczenia liniowego, pierwszego spośród algorytmów uczenia się.

Dlaczego nadmierne dopasowanie jest złe w uczeniu maszynowym?

Logika często stwierdza, że ​​nadmierne dopasowanie modelu ogranicza jego zdolność do uogólniania, chociaż może to oznaczać tylko, że nadmierne dopasowanie powstrzymuje model przed ulepszaniem po określonej złożoności. Czy nadmierne dopasowanie powoduje pogorszenie się modeli niezależnie od złożoności danych, a jeśli tak, to dlaczego tak się dzieje? Powiązane: Kontynuacja powyższego pytania: „Kiedy model jest niedopasowany? ”

Przebudowanie jest empirycznie złe. Załóżmy, że masz zbiór danych, który podzielisz na dwie części, test i uczenie. Model nadmiernie dopasowany to taki, który działa znacznie gorzej na zestawie danych testowych niż na zestawie danych uczących. Często obserwuje się, że takie modele również generalnie wypadają gorzej na dodatkowych (nowych) testowych zestawach danych niż modele, które nie są nadmiernie wyposażone.

Jednym ze sposobów zrozumienia tego intuicyjnie jest to, że model może wykorzystywać pewne istotne części danych (sygnał) i niektóre nieistotne części (szum). Model z nadmiernym wyposażeniem wykorzystuje więcej hałasu, co zwiększa jego wydajność w przypadku znanego hałasu (dane treningowe) i zmniejsza jego wydajność w przypadku nowego hałasu (dane testowe). Różnica w wydajności między danymi treningowymi i testowymi wskazuje, ile szumów wychwytuje model; a wychwycenie szumu bezpośrednio przekłada się na gorszą wydajność danych testowych (w tym przyszłych danych). Podsumowanie: nadmierne dopasowanie jest złe z definicji, nie ma to wiele wspólnego ze złożonością lub zdolnością do generalizacji, ale raczej z pomyleniem szumu z sygnałem.

P.S. Jeśli chodzi o „zdolność do uogólniania” pytania, bardzo możliwe jest posiadanie modelu, który ma z natury ograniczoną zdolność do uogólniania ze względu na strukturę modelu (np. Liniowa SVM,…), ale nadal jest podatny na nadmierne dopasowanie. W pewnym sensie nadmierne dopasowanie jest tylko jednym ze sposobów, w jakie uogólnianie może się nie powieść.

Overfitting, w skrócie, oznacza branie pod uwagę zbyt dużej ilości informacji z twoich danych i / lub wcześniejszej wiedzy i wykorzystanie ich w modelu. Aby uprościć sprawę, rozważ następujący przykład: niektórzy naukowcy zatrudniali cię, aby dostarczyć im model do przewidywania wzrostu jakiegoś rodzaju roślin. Naukowcy przez cały rok przekazywali Wam informacje zebrane podczas pracy z takimi roślinami i na bieżąco będą informować o przyszłym rozwoju ich plantacji. Więc przeglądasz otrzymane dane i budujesz na ich podstawie model. Załóżmy teraz, że w swoim modelu uwzględniłeś możliwie jak najwięcej cech, aby zawsze określić dokładne zachowanie roślin, które widziałeś w początkowym zbiorze danych. Teraz jako produkcja

kontynuuje, zawsze będziesz brać pod uwagę te cechy i uzyskasz bardzo szczegółowe wyniki. Jeśli jednak plantacja w końcu ulegnie zmianie sezonowej, wyniki, które otrzymasz, mogą pasować do twojego modelu w taki sposób, że twoje prognozy zaczną zawodzić (albo mówiąc, że wzrost spowolni, podczas gdy faktycznie przyspieszy, lub przeciwieństwo). Oprócz tego, że nie można wykryć tak małych odchyleń i zwykle nieprawidłowo klasyfikować wpisy, drobnoziarnisty model, tj. Duża liczba zmiennych, może spowodować, że przetwarzanie będzie zbyt kosztowne. Teraz wyobraź sobie, że Twoje dane są już złożone. Nadmierne dopasowanie modelu do danych nie tylko sprawi, że klasyfikacja / ocena będzie bardzo złożona, ale najprawdopodobniej sprawi, że błędnie przewidujesz najmniejszą zmienność danych wejściowych, jaką możesz mieć. Edycja: Równie dobrze może to być przydatne, być może dodając dynamiki do powyższego wyjaśnienia

To dlatego, że coś nazywa się dylematem odchylenia i wariancji. Przekrojony model oznacza, że będziemy mieć bardziej złożoną granicę decyzyjną, jeśli damy więcej wariancji w modelu. Chodzi o to, że nie tylko zbyt proste modele, ale także złożone modele mogą ujawnić sklasyfikowane wyniki na niewidocznych danych. W konsekwencji model z nadmiernym dopasowaniem nie jest tak dobry jak model niedopasowany. Dlatego nadmierne dopasowanie jest złe i musimy dopasować model gdzieś pośrodku.

Czy istnieją interfejsy API do przeszukiwania streszczeń papieru?

Jeśli mam bardzo długą listę nazw artykułów, w jaki sposób mogę uzyskać streszczenie tych artykułów z Internetu lub dowolnej bazy danych? Nazwy artykułów są jak „Ocena użyteczności w eksploracji sieciowej w dziedzinie zdrowia publicznego”.

Czy ktoś zna jakieś API, które może dać mi rozwiązanie? Próbowałem zaindeksować Google Scholar, jednak Google zablokowało mojego robota.

Sprawdź to na:

*Google Scholar

* Citeseer

Jeśli trafisz dokładnie w jeden tytuł, prawdopodobnie znalazłeś właściwy artykuł i możesz podać tam resztę informacji. Oba zapewniają linki do pobierania i wyjście w stylu bibtex. To, co prawdopodobnie chciałbyś zrobić, aby uzyskać doskonałe metadane, to pobrać i przeanalizować plik PDF (jeśli istnieje) i poszukać identyfikatora w stylu DOI. Jeśli to zrobisz, bądź miły i ogranicz stawki.

arXiv ma interfejs API i pobieranie zbiorcze, ale jeśli chcesz coś dla płatnych czasopism, trudno będzie go zdobyć bez płacenia indeksatorowi, takim jak pubmed, elsevier lub tym podobnym.

Techniki uczenia maszynowego do szacowania wieku użytkowników na podstawie ulubionych witryn na Facebooku

Mam bazę danych z mojej aplikacji na Facebooku i próbuję wykorzystać uczenie maszynowe do oszacowania wieku użytkowników na podstawie tego, jakie strony na Facebooku lubią. Moja baza danych ma trzy kluczowe cechy:

rozkład wieku w moim zestawie treningowym (łącznie 12 tys. użytkowników) jest wypaczony w kierunku młodszych użytkowników (tj. mam 1157 użytkowników w wieku 27 lat i 23 użytkowników w wieku 65 lat); wiele witryn ma nie więcej niż 5 polubień (odfiltrowałem strony FB z mniej niż 5 polubieniami). jest o wiele więcej funkcji niż próbek. Tak więc moje pytania są następujące: jaką strategię byś zaproponował, aby przygotować dane do dalszej analizy? Czy powinienem dokonać jakiejś redukcji wymiarowości? Która metoda ML byłaby najbardziej odpowiednia do zastosowania w tym przypadku? Używam głównie Pythona, więc wskazówki specyficzne dla Pythona byłyby bardzo mile widziane.

Jedną rzeczą, od której warto zacząć, byłoby k-NN. Chodzi o to, że masz macierz użytkowników / pozycji, a dla niektórych użytkowników masz zgłoszony wiek. Wiek osoby w macierzy elementów użytkownika może być dobrze określony przez coś w rodzaju średniego lub mediany wieku niektórych osób

najbliżsi sąsiedzi w obszarze przedmiotów. Więc masz każdego użytkownika wyrażonego jako wektor w przestrzeni przedmiotów, znajdź k najbliższych sąsiadów i przypisz do danego wektora jakąś sumaryczną statystykę najbliższych sąsiadów. Możesz wybrać k na odcięciu odległości lub, bardziej realistycznie, przez iteracyjne przypisywanie wieku pociągowi i wybranie k, które minimalizuje błąd w tym przypisaniu. Jeśli wymiarowość jest problemem, możesz łatwo przeprowadzić redukcję w tej konfiguracji przez dekompozycję pojedynczych wartości, wybierając m wektorów, które wychwytują największą wariancję w całej grupie. We wszystkich przypadkach, ponieważ każda cecha jest binarna, wydaje się, że podobieństwo cosinusowe będzie miarą odległości. Muszę trochę więcej pomyśleć o innych podejściach (regresja, rf itp.), Biorąc pod uwagę wąski zakres twojej przestrzeni funkcji (wszystkie warianty tego samego działania, upodobanie). Myślę, że podejście użytkownik / przedmiot może być najlepsze. Jedna uwaga, jeśli wiek, który masz na szkolenie, jest zgłaszany przez samego siebie, być może będziesz musiał poprawić niektóre z nich. Osoby na Facebooku zwykle podają wiek w dekadzie urodzenia. Sporządź histogram dat urodzenia (na podstawie wieku) i zobacz, czy masz skoki w dekadach, takich jak lata 70., 80., 90.

Niedawno zrobiłem podobny projekt w Pythonie (przewidywanie opinii przy użyciu danych podobnych do FB) i miałem dobre wyniki w następującym podstawowym procesie:

  1. Wczytaj zestaw uczący (n = N), wykonując iterację po oddzielonych przecinkami, takich jak rekordy wiersz po wierszu, i użyj licznika, aby zidentyfikować najpopularniejsze strony
  2. Dla każdej z K najpopularniejszych stron (użyłem około 5000, ale możesz bawić się różnymi wartościami), użyj pandy.DataFrame.isin, aby sprawdzić, czy każda osoba w zestawie treningowym lubi każdą stronę, a następnie zrób N x K dataframe wyników (nazwę ją xdata_train)
  3. Utwórz serię (nazwę ją ydata_train) zawierającą wszystkie zmienne wynikowe (w moim przypadku opinie w Twoim wieku) z tym samym indeksem co xdata_train
  4. Skonfiguruj losowy klasyfikator lasu za pomocą scikit-learn, aby przewidzieć ydata_train na podstawie xdata_train
  5. Użyj testów krzyżowej walidacji scikit-learn, aby dostosować parametry i poprawić dokładność (poprawianie liczby popularnych stron, liczby drzew, minimalnego rozmiaru liści itp.)
  6. Wyprowadź losowy klasyfikator lasu i listę najpopularniejszych stron z marynatą (lub zachowaj w pamięci, jeśli robisz wszystko na raz)
  7. Wczytaj pozostałe dane, załaduj listę popularnych stron (jeśli to konieczne) i powtórz krok 2, aby utworzyć xdata_new
  8. Załaduj losowy klasyfikator lasu (jeśli to konieczne) i użyj go do przewidywania wartości danych xdata_new
  9. Prześlij przewidywane wyniki do nowego pliku CSV lub innego wybranego formatu wyjściowego

Powinieneś także pamiętać o najbardziej niesamowitej funkcji lasów losowych w Pythonie: natychmiastowa równoległość! Ci z nas, którzy zaczęli to robić w R, a potem przenieśli się tam, są zawsze zdumieni, zwłaszcza gdy zaczynasz pracować na maszynie z kilkudziesięcioma rdzeniami. Na koniec zwróć uwagę, że byłaby to doskonała aplikacja do analizy sieci, jeśli masz dane o znajomych, a także o samych osobach. Jeśli potrafisz przeanalizować wiek znajomych użytkownika, wiek użytkownika prawie na pewno będzie mniejszy o rok lub dwa od mediany wśród jego znajomych, zwłaszcza jeśli użytkownicy są wystarczająco młodzi, aby zbudować

ich sieci znajomych jeszcze w szkole (ponieważ większość z nich to koledzy z klasy). Ta prognoza prawdopodobnie przewyższyłaby wszystko, co można uzyskać z modelowania – jest to podręcznikowy przykład problemu, w którym za każdym razem właściwe dane> właściwy model.

Inną sugestią jest przetestowanie regresji logistycznej. Dodatkową korzyścią jest to, że wagi (współczynniki) modelu dają wyobrażenie o tym, które witryny mają wpływ na wiek. Sklearn oferuje pakiet sklearn.linear_model.LogisticRegression, który jest przeznaczony do

obsługują również rzadkie dane. Jak wspomniano w komentarzach, w omawianym przypadku, przy większej liczbie zmiennych wejściowych niż próbek, należy uregulować model (za pomocą sklearn.linear_model.LogisticRegression użyj argumentu kara = „l1”).

 Czy nauka o danych to tylko trend, czy też koncepcja długoterminowa?

Widzę wiele kursów z zakresu Data Science pojawiających się w ciągu ostatnich 2 lat. Nawet duże uniwersytety, takie jak Stanford i Columbia, oferują stwardnienie rozsiane w szczególności w naukach o danych. Ale jak długo widzę, wygląda na to, że nauka o danych jest po prostu połączeniem technik informatycznych i statystycznych. Dlatego zawsze o tym myślę. Jeśli to tylko trend i za 10 lat ktoś nadal będzie wymieniał naukę o danych jako całą dziedzinę lub tylko temat / temat w CS lub statystykach. Co myślisz?

Jedno można powiedzieć na pewno: nikt nie może tego powiedzieć na pewno. I rzeczywiście może do pewnego stopnia opierać się na opiniach. Wprowadzenie terminów takich jak „duże zbiory danych”, które niektórzy uważają za „hipnotyzujące” lub „modne słowa”, nie ułatwia sformułowania właściwej odpowiedzi. Ale spróbuję. Ogólnie rzecz biorąc, wydaje się, że dziedziny interdyscyplinarne często mają problem z brakiem traktowania ich poważnie w żadnej z dziedzin, którymi się zajmują. Jednak im więcej badań inwestuje się w daną dziedzinę, tym większa jest potrzeba podzielenia tej dziedziny na kilka podtematów. I te podtematy, które były później znane, muszą zostać ponownie połączone w nowy sposób, aby zapobiec nadmiernej specjalizacji oraz aby zwiększyć i poszerzyć zastosowanie technik opracowanych przez (ponad?) Wyspecjalizowanych ekspertów w różnych dziedzinach. Uważam „naukę o danych” za takie podejście, które łączy wiedzę specjalistyczną i odkrycia z różnych dziedzin. Opisałeś to jako… połączenie technik informatycznych i statystycznych I rzeczywiście, kilka pytań ma na celu rozróżnienie między nauką o danych a statystyką. Jednak czysty statystyka najprawdopodobniej nie będzie w stanie skonfigurować klastra Hadoop i pokazać wyników swojej analizy na interaktywnym pulpicie nawigacyjnym HTML5. A ktoś, kto potrafi zaimplementować ładny pulpit nawigacyjny HTML5, może nie być tak zaznajomiony z matematycznym tłem testu Chi-kwadrat. Rozsądne jest założenie, że przekazanie studentom wystarczającej wiedzy do zastosowania najważniejszych technik z różnych dziedzin, które są objęte nauką o danych, doprowadzi do nowych zastosowań tych technik i przyniesie korzyści – także „purystom” w tych dziedzinach. Połączenie tych technik w wielu przypadkach nie jest proste i może uzasadniać własną gałąź badań. Zapytałeś również, czy za 10 lat nauka o danych będzie traktowana jako „tylko temat w informatyce”. Ponownie: nikt nie może tego powiedzieć na pewno. Ale zastanawiam się, w którym momencie ludzie przestali zadawać sobie pytanie, czy „Informatyka” będzie kiedyś traktowana tylko jako mieszanka (lub przedmiot) elektrotechniki i matematyki…

Jak określić ważne atrybuty?

Załóżmy, że zbiór danych o luźnej strukturze (np. Tabele internetowe / połączone otwarte dane), składający się z wielu źródeł danych. Nie ma wspólnego schematu, po którym następują dane, a każde źródło może używać atrybutów synonimów do opisu wartości (np. „Narodowość” czy „urodzony w”). Moim celem jest znalezienie „ważnych” atrybutów, które w jakiś sposób „definiują” byty, które opisują. Kiedy więc znajdę tę samą wartość dla takiego atrybutu, będę wiedział, że te dwa opisy najprawdopodobniej dotyczą tego samego podmiotu (np. Tej samej osoby). Na przykład atrybut „lastName” jest bardziej dyskryminujący niż atrybut „nationality”. Jak mogę (statystycznie) znaleźć takie atrybuty, które są ważniejsze od innych? Naiwnym rozwiązaniem byłoby przyjęcie średniej wartości IDF wartości każdego atrybutu i uczynienie z tego współczynnika „ważności” atrybutu. Podobnym podejściem byłoby policzenie, ile różnych wartości pojawia się dla każdego atrybutu. Widziałem termin cecha lub wybór atrybutów w uczeniu maszynowym, ale nie chcę odrzucać pozostałych atrybutów, chcę po prostu nadać większą wagę najważniejszym.

Właściwie jest więcej niż jedno pytanie, na które należy odpowiedzieć:

  1. Jak pracować na danych bez schematów / luźnych / brakujących danych
  2. Jak oznaczyć osobę (z tego, co rozumiem bez nadzoru) i stworzyć identyfikator
  3. Jak wyszkolić swój system, aby mógł powiedzieć, jakich atrybutów należy użyć, aby zidentyfikować osobę

Jak wspomniał Rubens, możesz użyć metod drzew decyzyjnych, w szczególności Random Forests, do obliczania najważniejszych atrybutów na podstawie uzyskanych informacji, jeśli już znalazłeś sposób na określenie, jak nazwać osobę. Jeśli jednak nie masz żadnych informacji o etykiecie, możesz użyć widoku eksperta do wstępnego wyboru atrybutów. Następnie dokonujesz nienadzorowanej klasyfikacji, aby odzyskać swoje etykiety. Na koniec możesz wybrać najważniejsze pola za pomocą Random Forest lub innych metod, takich jak Bayesian Belief Networks.

Aby to wszystko osiągnąć, potrzebujesz również pełnego zestawu danych. Jeśli twój zestaw danych jest luźny, musisz ręcznie lub heurystycznie znaleźć sposób na połączenie atrybutów wskazujących to samo z różnymi nazwami. Co więcej, możesz użyć technik imputacji, takich jak metoda maksymalizacji oczekiwań i uzupełnić zestaw danych. Możesz też pracować z sieciami bayesowskimi i pozostawić brakujące pola bez zmian.

Algorytm generowania reguł klasyfikacji

Mamy więc potencjał dla aplikacji do uczenia maszynowego, która dość dobrze pasuje do tradycyjnej domeny problemu rozwiązanej przez klasyfikatory, tj. Mamy zestaw atrybutów opisujących element i „wiadro”, w którym kończą. Jednak zamiast tworzyć modele prawdopodobieństw, jak w Naiwnych Bayesach lub podobnych klasyfikatorach, chcemy, aby nasz wynik był zbiorem

reguły czytelne dla człowieka, które mogą być przeglądane i modyfikowane przez użytkownika końcowego. Uczenie się reguł asocjacyjnych wygląda jak rodzina algorytmów, które rozwiązują tego typu problemy, ale wydaje się, że algorytmy te koncentrują się na identyfikowaniu typowych kombinacji cech i nie uwzględniają koncepcji końcowego segmentu, na który te cechy mogą wskazywać. Na przykład nasz zestaw danych wygląda mniej więcej tak:

Pozycja A {4-drzwiowa, mała, stalowa} => {sedan}

Pozycja B {2-drzwiowe, duże, stalowe} => {ciężarówka}

Pozycja C {2-drzwiowe, małe, stalowe} => {coupe}

Chcę tylko reguł, które mówią „jeśli jest duży i 2-drzwiowy, to ciężarówka”, a nie reguł, które mówią „jeśli to jest 4-drzwiowe, to jest też małe”. Jednym ze sposobów obejścia tego problemu jest po prostu użycie algorytmów uczenia się reguł asocjacyjnych i

zignoruj ​​zasady, które nie obejmują segmentu końcowego, ale wydaje się to trochę hakerskie. Czy przegapiłem jakąś rodzinę algorytmów? A może na początku podchodzę do problemu nieprawidłowo?

C45 firmy Quinlan jest w stanie stworzyć regułę przewidywania. Sprawdź tę stronę Wikipedii. Wiem, że w Weka nazywa się J48. Nie mam pojęcia, które są implementacjami w R lub Pythonie. W każdym razie z tego rodzaju drzewa decyzyjnego powinieneś być w stanie wywnioskować reguły przewidywania. Możesz również być zainteresowany algorytmami do bezpośredniego wnioskowania reguł klasyfikacji. RIPPER to taki, który ponownie w Weka otrzymał inną nazwę JRip.

W rzeczywistości jest to jeszcze prostsze, z tego, co opisujesz – po prostu szukasz podstawowego algorytmu drzewa klasyfikacyjnego (więc nie ma potrzeby stosowania nieco bardziej złożonych wariantów, takich jak C4.5, które są zoptymalizowane pod kątem dokładności przewidywania). Tekst kanoniczny to:

Jest to łatwo zaimplementowane w R:

http://cran.r-project.org/web/packages/tree/tree.pdf

i Python:

http://scikit-learn.org/stable/modules/tree.html

Możesz rzucić okiem na ucznia reguły CN2 w Orange 2

Rozpoznawanie aktywności człowieka za pomocą zestawu danych smartfonów Jestem nowy w tej społeczności i mam nadzieję, że moje pytanie będzie tu dobrze pasować. W ramach mojego licencjackiego kursu analityki danych zdecydowałem się wykonać projekt dotyczący rozpoznawania działalności człowieka za pomocą zestawów danych smartfonów. Jeśli chodzi o mnie, ten temat dotyczy uczenia maszynowego i maszyn wektorów wsparcia. Nie znam jeszcze dobrze tych technologii, więc będę potrzebować pomocy. Zdecydowałem się podążać za tym pomysłem na projekt http://www.inf.ed.ac.uk/teaching/courses/dme/2014/datasets.html (pierwszy projekt na górze) Celem projektu jest określenie, jaką aktywność wykonuje dana osoba angażowanie się (np. WALKING, WALKING_UPSTAIRS, WALKING_DOWNSTAIRS, SITTING, STANDING, LAYING) z danych zarejestrowanych przez smartfon (Samsung Galaxy S II) w talii badanego. Korzystając z wbudowanego akcelerometru i żyroskopu, dane obejmują 3-osiowe przyspieszenie liniowe i 3-osiową prędkość kątową przy stałej częstotliwości 50 Hz. Cały zestaw danych znajduje się w jednym folderze z opisem i etykietami funkcji. Dane są podzielone na pliki „testowe” i „pociągowe”, w których dane są reprezentowane w następującym formacie:

2.5717778e-001 -2.3285230e-002 -1.4653762e-002 -9.3840400e-001 -9.2009078e-001 -6.6768331e-001 -9.5250112e-

A to tylko bardzo mała próbka zawartości pliku. Naprawdę nie wiem, co reprezentują te dane i jak można je zinterpretować. Jakich narzędzi będę potrzebować również do analizy, klasyfikacji i grupowania danych? Czy jest jakiś sposób, w jaki mogę umieścić te dane w programie Excel z dołączonymi etykietami i na przykład użyć R lub Pythona do wyodrębnienia przykładowych danych i pracy nad tym? Wszelkie wskazówki / wskazówki byłyby bardzo mile widziane.

Definicje zestawu danych znajdują się na stronie tutaj:

Informacje o atrybutach na dole lub możesz zobaczyć w folderze ZIP plik o nazwie activity_labels, który zawiera nagłówki kolumn, upewnij się, że uważnie przeczytałeś README, zawiera on kilka dobrych informacji. Możesz łatwo wprowadzić plik .csv do R za pomocą polecenia read.csv. Na przykład, jeśli nazwiesz plik samsungdata, możesz otworzyć R i uruchomić to polecenie:

data <- read.csv (“katalog / gdzie / plik / jest / znajduje / samsungdata.csv”, nagłówek = PRAWDA)

Lub jeśli jesteś już w katalogu roboczym w R, możesz po prostu uruchomić następujące

dane <- read.csv (“samsungdata.csv”, nagłówek = TRUE)

Gdzie dane nazwy można zmienić na cokolwiek chcesz nazwać swoim zestawem danych.

Wygląda na to, że ten (lub bardzo podobny zestaw danych) jest używany do kursów Coursera. Czyszczenie tego zestawu danych jest zadaniem pobierania i czyszczenia danych, ale jest również używane w studium przypadku do analizy danych eksploracyjnych. Film z tego studium przypadku jest dostępny w postaci nagrań wideo z 4 tygodnia materiałów szkoleniowych EDA. Może ci pomóc zacząć od tych danych.

Czy algorytmy uczenia maszynowego mogą przewidywać wyniki sportowe lub gry?

Mam wiele zbiorów danych dotyczących NFL, które moim zdaniem mogą stanowić dobry projekt poboczny, ale jeszcze nic z nimi nie zrobiłem. Wejście na tę stronę sprawiło, że pomyślałem o algorytmach uczenia maszynowego i zastanawiałem się, jak dobre mogą one być w przewidywaniu wyniku meczów piłkarskich lub nawet następnego meczu. Wydaje mi się, że można by było zidentyfikować pewne trendy – przy trzeciej próbie i pierwszej, drużyna z silnym biegiem teoretycznie powinna mieć w tej sytuacji tendencję do prowadzenia piłki. Punktacja może być trudniejsza do przewidzenia, ale zwycięska drużyna może być. Moje pytanie brzmi, czy są to dobre pytania do rzucenia na algorytm uczenia maszynowego. Możliwe, że tysiące osób próbowało tego wcześniej, ale natura sportu sprawia, że ​​jest to niewiarygodny temat.

Jest wiele dobrych pytań na temat piłki nożnej (i ogólnie sportu), które fajnie byłoby rzucić na algorytm i zobaczyć, co z niego wyjdzie. Najtrudniejsze jest wiedzieć, co wrzucić do algorytmu. Drużyna z dobrym RB mogłaby po prostu spasować na trzecim i krótkim miejscu tylko dlatego, że na przykład przeciwnicy prawdopodobnie oczekiwaliby runu. Tak więc, aby faktycznie uzyskać jakieś wartościowe wyniki, rozbiję problem na mniejsze części i przeanalizuję je statystycznie, rzucając je do maszyn! Istnieje kilka (dobrych) witryn internetowych, które próbują zrobić to samo. Sprawdź je i skorzystaj z wszelkich znalezionych informacji, aby Ci pomóc:

* Football Outsiders

* Zaawansowana analiza piłki nożnej

A jeśli naprawdę chcesz poznać analizę danych sportowych, zdecydowanie powinieneś sprawdzić filmy z konferencji Sloan Sports Conference

Tak. Dlaczego nie?! Przy tak dużej ilości danych zapisywanych w każdym sporcie w każdej grze, inteligentne wykorzystanie danych może doprowadzić nas do uzyskania ważnych informacji na temat wyników graczy. Kilka przykładów:

Baseball: W filmie Moneyball (będącym adaptacją książki MoneyBall) Brad Pitt gra postać, która analizuje statystyki graczy, aby stworzyć drużynę, która radzi sobie niezwykle dobrze! Było to przedstawienie prawdziwej historii życia drużyny baseballowej Oakland Athletics. Aby uzyskać więcej informacji, http://www.theatlantic.com/entertainment/archive/2013/09/forget-2002-this-yearsoakland- as-are-the-real-em-moneyball-em-team / 279927 /

Krykiet: SAP Labs opracowało narzędzie do analizy aukcji, które dostarczyło wglądu w wpływ graczy, których warto kupić na aukcji Indian Premier League w 2014 roku dla zespołu Kolkata Knight Riders, który ostatecznie wygrał IPL Championship 2014. Aby uzyskać więcej informacji, http://scn.sap.com/community/hana-inmemory/blog/2014/06/10/sap-hana-academy-cricket-demo—how-sap-hana-poweredthe- kolkata-knight- mistrzostwa-zawodników-ipl.

Zatem tak, analiza statystyczna zapisów graczy może dać nam wgląd w to, którzy gracze są bardziej skłonni do wykonania, ale nie którzy zagrają. Tak więc uczenie maszynowe, bliski kuzyn analizy statystycznej, okaże się przełomem.

Zdecydowanie tak. Mogę skierować cię do ładnego papieru. Kiedyś użyłem go do implementacji algorytmu przewidywania wyników ligi piłkarskiej, przede wszystkim mając na celu uzyskanie pewnej wartości dla bukmacherów.

Ze streszczenia artykułu:

dynamiczny uogólniony model Bayesa do szacowania zależnych od czasu umiejętności wszystkich drużyn w lidze i przewidywania meczów piłkarskich w przyszły weekend.

Słowa kluczowe:

Modele dynamiczne, uogólnione modele liniowe, modele graficzne, metody Monte Carlo łańcucha Markowa, przewidywanie meczów piłkarskich

Jakie są łatwe do nauczenia aplikacje do uczenia maszynowego?

Będąc nowicjuszem w uczeniu maszynowym, chciałbym zacząć się bawić i zobaczyć, jakie są możliwości. Jestem ciekawy, jakie aplikacje możesz polecić, które zapewniłyby najszybszy czas

od instalacji do uzyskania znaczącego wyniku. Będą również mile widziane wszelkie zalecenia dotyczące dobrych materiałów początkowych na temat uczenia się maszynowego.

Poleciłbym zacząć od kursu MOOC na temat uczenia maszynowego. Na przykład kurs Andrew Ng na Coursera. Warto też przyjrzeć się aplikacji Orange. Ma interfejs graficzny i prawdopodobnie łatwiej jest zrozumieć niektóre techniki ML przy jego użyciu.

Szczerze mówiąc, myślę, że robienie niektórych projektów nauczy Cię znacznie więcej niż zrobienie pełnego kursu. Jednym z powodów jest to, że robienie projektu jest bardziej motywujące i otwarte niż wykonywanie zadań. Kurs, jeśli masz czas ORAZ motywację (prawdziwą motywację), jest lepszy niż robienie projektu. Inni komentatorzy wydali dobre rekomendacje platformy dotyczące technologii. Myślę, że z punktu widzenia projektu fajnego powinieneś zadać pytanie i zdobyć komputer, aby nauczył się odpowiadać. Niektóre dobre klasyczne pytania, które mają dobre przykłady, to:

* Sieci neuronowe do rozpoznawania odręcznych cyfr

* Klasyfikacja spamu przy użyciu regresji logistycznej

* Klasyfikacja obiektów za pomocą modeli mieszanin Gaussa

* Niektóre zastosowanie regresji liniowej, być może prognozowanie cen artykułów spożywczych w poszczególnych dzielnicach

Te projekty mają już zrobioną matematykę, zrobiony kod i można je łatwo znaleźć w Google. Możesz robić inne fajne tematy!

Na koniec zajmuję się robotyką, więc dla mnie najbardziej ZABAWNE aplikacje są behawioralne. Przykłady mogą obejmować (jeśli potrafisz bawić się arduino) Stwórz aplikację, która prawdopodobnie wykorzystuje regresję logistyczną, która uczy się, kiedy wyłączyć i włączyć wentylator, biorąc pod uwagę temperaturę wewnętrzną i stan światła w pomieszczeniu. Stwórz aplikację, która uczy robota poruszania siłownikiem, np. Kołem, na podstawie danych wejściowych z czujnika (np. Naciśnięcia przycisku), przy użyciu modeli mieszanin Gaussa (ucząc się z demonstracji). W każdym razie te są dość zaawansowane. Chodzi mi o to, że jeśli wybierzesz projekt, który (naprawdę) ci się podoba i spędzisz nad nim kilka tygodni, nauczysz się bardzo dużo i zrozumiesz o wiele więcej niż wykonanie kilku zadań.

Odpowiedź iliasfl Myślę, że Weka to dobry punkt wyjścia. Możesz zrobić wiele rzeczy, takich jak nadzorowane uczenie się lub grupowanie i łatwo porównać duży zestaw algorytmów z metodologiami. Podręcznik Weka to w rzeczywistości książka o uczeniu maszynowym i eksploracji danych, której można użyć jako materiału wprowadzającego

[43][Big Data] (2)

Zastosowania bazy danych NoSQL w nauce o danych

Jak można wykorzystać bazy danych NoSQL, takie jak MongoDB, do analizy danych? Jakie funkcje w nich mogą sprawić, że analiza danych będzie szybsza i skuteczniejsza?

Szczerze mówiąc, większość baz danych NoSQL nie nadaje się zbyt dobrze do zastosowań w dużych zbiorach danych. W przypadku większości aplikacji do obsługi dużych zbiorów danych wydajność MongoDB w porównaniu z relacyjną bazą danych, taką jak MySQL, jest na tyle niska, że ​​gwarantuje całkowite trzymanie się z dala od czegoś takiego jak MongoDB. Mając to na uwadze, istnieje kilka naprawdę przydatnych właściwości baz danych NoSQL, które z pewnością działają na twoją korzyść podczas pracy z dużymi zbiorami danych, chociaż prawdopodobieństwo tych korzyści przeważa ogólnie słabą wydajność NoSQL w porównaniu z SQL do odczytu intensywne operacje (najbardziej podobne do typowych przypadków użycia dużych zbiorów danych) są niskie.

* Brak schematu – jeśli pracujesz z dużą ilością nieustrukturyzowanych danych, podjęcie decyzji w sprawie schematu i sztywne zastosowanie go może być trudne. Bazy danych NoSQL w ogólności bardzo to wspierają i pozwalają na wstawianie dokumentów bez schematu w locie, co z pewnością nie jest czymś, co obsługuje baza danych SQL.

* JSON – jeśli pracujesz z dokumentami w stylu JSON zamiast z plikami CSV, zobaczysz dużą korzyść z używania czegoś takiego jak MongoDB jako warstwy bazy danych. Ogólnie rzecz biorąc, oszczędności związane z przepływem pracy nie przeważają jednak nad wydłużonymi czasami zapytań.

Łatwość obsługi – nie twierdzę, że bazy danych SQL są zawsze trudne w użyciu lub że Cassandra jest najłatwiejszą rzeczą na świecie, ale generalnie bazy danych NoSQL są łatwiejsze w konfiguracji i obsłudze niż bazy danych SQL. MongoDB jest tego szczególnie mocnym przykładem, znanym z tego, że jest jedną z najłatwiejszych w użyciu warstw bazy danych (poza SQLite). SQL radzi sobie także z normalizacją i istnieje spora część najlepszych praktyk SQL, które po prostu spowalniają proces programowania. Osobiście mogę zasugerować również sprawdzenie graficznych baz danych, takich jak Neo4j, które wykazują naprawdę dobrą wydajność dla niektórych typów zapytań, jeśli chcesz wybrać zaplecze dla aplikacji do nauki danych

Jedną z zalet podejścia NoSQL bez schematu jest to, że nie zatwierdzasz przedwcześnie i możesz zastosować odpowiedni schemat w czasie zapytania za pomocą odpowiedniego narzędzia, takiego jak Apache Drill. Zobacz tę prezentację po szczegóły. MySQL nie byłby moim pierwszym wyborem w kontekście dużych zbiorów danych.

Skalowalne wykrywanie wartości odstających / anomalii

Próbuję skonfigurować infrastrukturę Big Data przy użyciu Hadoop, Hive, Elastic Search (między innymi) i chciałbym uruchomić niektóre algorytmy na tych zbiorach danych. Chciałbym, żeby same algorytmy były skalowalne, co wyklucza używanie narzędzi takich jak Weka, R czy nawet RHadoop. Biblioteka Apache Mahout wydaje się być dobrą opcją i zawiera algorytmy dla zadań regresji i grupowania. To, co staram się znaleźć, to rozwiązanie do wykrywania anomalii lub wartości odstających. Ponieważ Mahout zawiera ukryte modele Markowa i różne techniki grupowania (w tym K-średnie), zastanawiałem się, czy byłoby możliwe zbudowanie modelu do wykrywania wartości odstających w szeregach czasowych, używając któregokolwiek z nich. Byłbym wdzięczny, gdyby ktoś z doświadczeniem w tej dziedzinie mógł mi doradzić a) jeśli to możliwe i jeśli jest b) jak to zrobić, plus c) oszacowanie nakładu pracy id) dokładność / problemy tego podejścia .

Przyjrzałbym się algorytmowi T-Digest. Został scalony z mahoutem, a także częścią niektórych innych bibliotek  do przesyłania strumieniowego dużych ilości danych .

Jak radzić sobie z kontrolą wersji dużych ilości (binarnych) danych

Jestem doktorantem geofizyki i pracuję z dużymi ilościami danych obrazowych (setki GB, dziesiątki tysięcy plików). Dość dobrze znam svn i git i doceniam historię projektu w połączeniu z możliwością łatwej współpracy i ochrony przed uszkodzeniem dysku. Uważam, że git jest również niezwykle pomocny w tworzeniu spójnych kopii zapasowych, ale wiem, że git nie może wydajnie obsługiwać dużych ilości danych binarnych. Podczas studiów magisterskich pracowałem na zestawach danych o podobnej wielkości (także obrazach) i miałem wiele problemów ze śledzeniem różnych wersji na różnych serwerach / urządzeniach. Rozróżnianie 100 GB w sieci naprawdę nie jest zabawne i kosztuje mnie dużo czasu i wysiłku. Wiem, że inni naukowcy mają podobne problemy, ale nie mogłem znaleźć dobrego rozwiązania. Chcę skorzystać z pamięci mojego instytutu, więc potrzebuję czegoś, co może korzystać z „głupiego” serwera. Chciałbym też mieć dodatkową kopię zapasową na przenośnym dysku twardym, ponieważ w miarę możliwości chciałbym uniknąć przesyłania setek GB przez sieć. Dlatego potrzebuję narzędzia, które może obsłużyć więcej niż jedną zdalną lokalizację. Wreszcie, naprawdę potrzebuję czegoś, z czego mogą korzystać inni badacze, więc nie musi to być super proste, ale powinno być możliwe do nauczenia się w ciągu kilku godzin. Oceniłem wiele różnych rozwiązań, ale żadne nie wydaje się pasować do rachunku: svn jest nieco nieefektywny i potrzebuje inteligentnego serwera hg bigfile / largefile może używać tylko jednego pilota git bigfile / media może również używać tylko jednego pilota, ale również nie jest zbyt wydajny. strych nie wydaje się mieć dziennika lub różnych możliwości bup wygląda naprawdę dobrze, ale potrzebuje do działania „inteligentnego” serwera. Próbowałem git-Annex, który robi wszystko, czego potrzebuję (i wiele więcej), ale jest bardzo trudny w użyciu i nie jest dobrze udokumentowany. Używałem go przez kilka dni i nie mogłem się tego obejść, więc wątpię, czy jakikolwiek inny współpracownik byłby zainteresowany. Jak badacze radzą sobie z dużymi zbiorami danych i czego używają inne grupy badawcze? Żeby było jasne, interesuje mnie przede wszystkim, jak inni badacze radzą sobie z tą sytuacją, a nie tylko ten konkretny zbiór danych. Wydaje mi się, że prawie każdy powinien mieć ten problem, ale nie znam nikogo, kto go rozwiązał. Czy powinienem po prostu zachować kopię zapasową oryginalnych danych i zapomnieć o całej tej kontroli wersji? Czy to właśnie robią wszyscy inni?

Miałem do czynienia z podobnymi problemami z bardzo dużymi zbiorami danych z biologii syntetycznej, gdzie mamy wiele, wiele GB danych cytometrii przepływowej rozrzuconych na wiele, wiele tysięcy plików i musimy je konsekwentnie utrzymywać między współpracującymi grupami w (wielu) różnych instytucjach. Typowa kontrola wersji, taka jak svn i git, nie jest praktyczna w takich okolicznościach, ponieważ po prostu nie jest zaprojektowana dla tego typu zbioru danych. Zamiast tego zaczęliśmy używać rozwiązań „przechowywania w chmurze”, w szczególności DropBox i Bittorrent Sync. DropBox ma tę zaletę, że wykonuje przynajmniej prymitywne logowanie i kontrolę wersji oraz zarządza serwerami za Ciebie, ale wadą jest to, że jest to usługa komercyjna, musisz zapłacić za dużą pamięć masową i umieszczasz swoje niepublikowane dane na komercyjne przechowywanie; nie musisz jednak dużo płacić, więc jest to opłacalna opcja. Bittorrent Sync ma bardzo podobny interfejs, ale uruchamiasz go samodzielnie na własnych serwerach pamięci masowej i nie ma on żadnej kontroli wersji. Oba zraniły moją duszę programisty, ale są to najlepsze rozwiązania, jakie moi współpracownicy i ja znaleźliśmy do tej pory.

Użyłem funkcji wersjonowania w zasobnikach Amazon S3 do zarządzania 10-100 GB w 10-100 plikach. Przesyłanie może być powolne, więc pomogło kompresować i przesyłać równolegle lub po prostu uruchamiać obliczenia na EC2. Biblioteka boto zapewnia przyjemny interfejs Pythona.

Spróbuj spojrzeć na Git Large File Storage (LFS). Jest nowy, ale warto się temu przyjrzeć. Jak widzę, dyskusja w Hacker News wspomina o kilku innych sposobach radzenia sobie z dużymi plikami:

* git-Annex (i np. używanie go z Amazon S3)

* Rozszerzenie Mercurual Largefiles

Co to jest „stara nazwa” naukowca danych?

Terminy takie jak „nauka o danych” i „naukowiec danych” są obecnie coraz częściej używane. Wiele firm zatrudnia „naukowców zajmujących się danymi”. Ale nie sądzę, żeby to była zupełnie nowa praca. Istnieją dane z przeszłości i ktoś miał do czynienia z danymi. Wydaje mi się, że termin „naukowiec danych” staje się bardziej popularny, ponieważ brzmi bardziej fantazyjnie i „seksownie”. Jak nazywano naukowców zajmujących się danymi w przeszłości?

W odwrotnym porządku chronologicznym: eksplorator danych, statystyka, matematyk (stosowany).

Terminy, które obejmowały mniej więcej te same tematy, które obejmuje dziś Data Science:

*Rozpoznawanie wzorców

*Nauczanie maszynowe

* Eksploracja danych

* Metody ilościowe

Myślę, że jest to nowa praca, w zasadzie analityk danych musi stosować algorytmy matematyczne do danych z dużymi ograniczeniami pod względem 1) Czas działania aplikacji 2) Wykorzystanie zasobów aplikacji. Gdyby tych ograniczeń nie było, nie nazwałbym pracy nauką o danych. Co więcej, algorytmy te często trzeba uruchamiać w systemach rozproszonych, co stanowi kolejny wymiar problemu. Oczywiście czyniono to już wcześniej, w pewnym połączeniu statystyki, matematyki i programowania, ale nie było to szeroko rozpowszechnione, aby zapoczątkować nowy termin. Prawdziwy wzrost nauki o danych wynika z możliwości gromadzenia dużych ilości danych, a zatem konieczności ich przetwarzania.

Odniesienie o eksploracji danych w sieciach społecznościowych

Nie zajmuję się nauką o danych, ale chciałbym dogłębnie zbadać tę dziedzinę, aw szczególności chciałbym rozpocząć od analizy danych z sieci społecznościowych. Próbuję znaleźć dobre referencje, zarówno papierowe, jak i strony internetowe, i książki, aby zacząć poznawać temat. W internecie można znaleźć wiele stron, forów, artykułów na ten temat, ale nie jestem w stanie rozróżnić dobrych i  złych lektur. Jestem użytkownikiem R, Matlab, SAS i znam trochę język Python. Czy mógłbyś zasugerować jakieś referencje, od których mógłbym zacząć studiować i pogłębiać branżę?

Moje ulubione miejsce, w którym można znaleźć informacje na temat analizy sieci społecznościowych, pochodzi z SNAP, Stanford Network Analysis Project. Zespół studentów i profesorów, kierowany przez Jure Leskovec, stworzył narzędzia programowe, zebrał zbiory danych i opublikował artykuły dotyczące analizy sieci społecznościowych. http://snap.stanford.edu/. Zbiór prac badawczych jest tam znakomity. Mają też narzędzie Python, które możesz wypróbować. http://snap.stanford.edu/snappy/index.html Skupiono się na analizie wykresów, ponieważ sieci społecznościowe dobrze pasują do tego modelu. Jeśli jesteś nowy , aby przeprowadzić analizę wykresów, proponuję wziąć udział w kursie matematyki dyskretnej na poziomie licencjackim lub zapoznać się z moją ulubioną książką na temat „Teoria wykresów z algorytmami i jej zastosowaniami” autorstwa Santanu Ray.

Aby zapoznać się z praktycznym podejściem do analizy sieci społecznościowych, zapoznaj się z „Mining the Social Web” autorstwa Matthew A Russella. Zawiera przykłady, które pokazują, jak zbierać i analizować dane z głównych sieci społecznościowych, takich jak Twitter, Facebook i LinkedIn. To Jure Leskovec początkowo podekscytował mnie tą dziedziną. Ma wiele świetnych prelekcji na YouTube.

Zamierzam kontynuować następującą serię kursów online na Coursera: Zostań naukowcem społecznym: metody i statystyki na Uniwersytecie w Amsterdamie. Dobra wiadomość – to nic nie kosztuje, albo możesz dostać ładnie wyglądający certyfikat za około 49 $. Zła wiadomość – najbliższa rejestracja to 31.08.2015. Będziesz miał okazję zdobyć dużo informacji w skondensowany sposób w krótkim czasie i będziesz zmuszony do faktycznego zastosowania wiedzy w ćwiczeniach, quizach i zadaniach projektowych. Będziesz miał również okazję omówić lekcje / projekty na forum z wieloma innymi studentami i wykładowcami.

Myślę, że Social Media Mining: An Introduction autor: Zafarani to doskonały punkt wyjścia. Dostępna jest również bezpłatna wersja PDF. Najpierw omawia podstawy teorii grafów i eksploracji danych. Obejmuje bardziej zaawansowane tematy w zakresie eksploracji wykresów, analizy sieci społecznościowych, systemów rekomendacji itp. Poza tym widziałem kilka kursów online w Coursera (przykład). Nie jestem jednak pewien ich jakości. Na koniec należy zauważyć, że analiza sieci społecznościowych to eksploracja danych dla danych z mediów społecznościowych, takich jak Facebook. To wcale nie jest nauka społeczna; to jest informatyka. Chociaż możesz w końcu pożyczyć od nich kilka pomysłów, to, co ostatecznie zrobisz, jest dalekie od tego, co robią ludzie z nauk społecznych. Tak więc przechodzenie przez kursy i książki z nauk społecznych prawdopodobnie nie jest w tym momencie dobrym pomysłem.

Jaki jest skuteczny sposób porównywania i grupowania milionów nazw sklepów?

Jestem całkowitym amatorem, jeśli chodzi o naukę o danych i próbuję znaleźć sposób na porównanie ciągów w dużym zbiorze danych. Mam tabelę Google BigQuery, w której są przechowywane transakcje handlowe, ale nazwy sklepów są na całej planszy. Na przykład może istnieć „Wal-Mart Super Center” i „Wal-Mart SC # 1234” lub „McDonalds F2222” i „McDonalds # 321”. To, co muszę zrobić, to zgrupować WSZYSTKIE „Wal-mart” i „McDonalds” i cokolwiek innego. Moje pierwsze podejście polegało na rekurencyjnym sprawdzeniu reg-ex, ale trwało to wieczność i ostatecznie minęło.

Jakie jest najlepsze podejście do zrobienia tego w przypadku tabeli zawierającej ponad 20 milionów wierszy? Jestem otwarty na wypróbowanie każdej technologii, która pasowałaby do tej pracy.

Jest to rozwiązanie encji, czyli powiązanie rekordów, czyli problem z dopasowaniem danych. Rozwiązałbym to, usuwając wszystkie niealfabetyczne znaki, w tym liczby, rzutując na wszystkie wielkie litery, a następnie stosując dopasowanie hierarchiczne. Najpierw dopasuj dokładne przypadki, a następnie przejdź do strzelania Levenshteina między polami. Podejmij jakąś decyzję o tym, jak duży wynik pozwoli uzyskać Levenshtein lub znormalizowany wynik Levenshtein, zanim stwierdzisz, że coś jest niezgodne. Przypisz każdemu wierszowi identyfikator, a gdy znajdziesz dopasowanie, ponownie przypisz niższy z identyfikatorów obu członkom dopasowania. Algorytm odległości Levenshteina jest prosty, ale genialny (wzięty stąd):

def levenshtein(a,b):

“Calculates the Levenshtein distance between a and b.”

n, m = len(a), len(b)

if n > m:

# Make sure n <= m, to use O(min(n,m)) space

a,b = b,a

n,m = m,n

current = range(n+1)

for i in range(1,m+1):

previous, current = current, [i]+[0]*n

for j in range(1,n+1):

add, delete = previous[j]+1, current[j-1]+1

change = previous[j-1]

if a[j-1] != b[i-1]:

change = change + 1

current[j] = min(add, delete, change)

return current[n]

Ta książka o dopasowywaniu danych jest dobrym źródłem i jest bezpłatna przez siedem dni w Amazon.

Nominalnie jest to algorytm bez wykorzystania niektórych wydajności sortowania, więc spodziewałbym się, że będę musiał używać wielu rdzeni w rzędach. Ale powinno to działać dobrze na 8-rdzeniowej instancji AWS. Ostatecznie zakończy się na jednym rdzeniu, ale może to zająć kilka godzin.

Naprawdę miałbym ochotę być leniwym i zastosować starą technologię do szybkiego i brudnego rozwiązania bez programowania, używając polecenia linux sort. To da ci listę posortowaną leksykograficznie. Jeśli nazwy sklepów nie są pierwszym polem, zmień ich kolejność lub powiedz sortowi, aby używał innego pola za pomocą przełącznika -k. Zapisz dane w zwykłym pliku tekstowym CSV, a następnie posortuj je:

$ sort myStores.csv> sortByStore.csv

Możesz pomóc sortować, przydzielając mu dużo pamięci, w tym przypadku 16 GB:

$ sort -S16G myStores.csv> sortByStore.csv

Możesz pójść dalej i utworzyć listę unikalnych nazw sklepów i liczby ich wystąpień, aby pomóc Ci zrozumieć, jak wyglądają dane:

$ sort -S16G myStores.csv | wytnij -f1 -d, | uniq -c> storeIdsAndCounts.csv

Lub unikaj uciekania się i posiadaj tylko unikalne identyfikatory:

$ cat sortByStore.csv | wytnij -f1 -d, | uniq> storeIds.csv

Oryginalne znaczenie „Inteligencji” w „Business Intelligence”

Co pierwotnie oznacza termin „Intelligence” w „Business Intelligence”? Czy oznacza to użyte w „Sztucznej inteligencji” czy w „Agencji Wywiadu”? Innymi słowy, czy „Business Intelligence” oznacza: „Działaj mądrze i inteligentnie w biznesie” czy „Gromadzenie danych i informacji o firmie”? To pytanie było tematem debaty między niektórymi członkami naszego zespołu nauk o danych, więc pomyślałem, że zapytam o nie innych ekspertów. Można by powiedzieć, że oba znaczenia mają zastosowanie, ale proszę o pierwotne zamierzone znaczenie tego słowa, jak zaproponowano w latach osiemdziesiątych. Akceptowalna odpowiedź powinna zdecydowanie cytować oryginalne odniesienia, a osobiste opinie nie są tym, czego szukam.

Uważa się, że Howard Dresner w 1989 r. Ukuł termin „Business Intelligence”, aby opisać „koncepcje i metody usprawnienia podejmowania decyzji biznesowych przy użyciu systemów wsparcia opartych na faktach”. Kiedy był w Gartner Group. To powszechna mantra rozpowszechniana w sieci. Nie udało mi się jeszcze znaleźć dokładnego źródła tego pochodzenia. Wielu twierdzi, że nie był w grupie Gartnera w 1989 roku, co potwierdza poniższy wywiad. W swojej książce z 2008 r. „Rewolucja w zarządzaniu wydajnością: poprawa wyników dzięki widoczności i wgląd w działania, termin jest definiowany jako:

BI to wiedza zdobyta dzięki dostępowi i analizie informacji biznesowych.

Streszczenie: Opracowywany jest automatyczny system rozpowszechniania informacji do różnych sekcji dowolnej organizacji przemysłowej, naukowej lub rządowej. Ten inteligentny system będzie wykorzystywał maszyny przetwarzające dane do auto-abstrakcji i automatycznego kodowania dokumentów oraz do tworzenia profili zainteresowań dla każdego z „punktów akcji” w organizacji. Zarówno dokumenty przychodzące, jak i generowane wewnętrznie są automatycznie abstrakcyjne, charakteryzowane za pomocą wzorca słów i wysyłane automatycznie do odpowiednich punktów akcji. W artykule przedstawiono elastyczność takiego systemu w identyfikowaniu znanych informacji, znajdowaniu, kto powinien je znać, oraz w rozpowszechnianiu skutecznie, albo w formie abstrakcyjnej, albo jako kompletny dokument. Autor twierdzi, że: Techniki proponowane tutaj, aby to umożliwić to:

  1. Autoabstrakcja dokumentów;
  2. Automatyczne kodowanie dokumentów;
  3. Automatyczne tworzenie i aktualizowanie profili punktów akcji.

Wszystkie te techniki opierają się na procedurach statystycznych, które można wykonać na współczesnych maszynach do przetwarzania danych. Wraz z odpowiednim wyposażeniem komunikacyjnym i sprzętem wejścia-wyjścia można zbudować kompleksowy system, aby uwzględnić wszystkie problemy informacyjne organizacji. Nazywamy to Biznesowym Systemem Inteligencji. Podaje również wyjaśnienie terminów „biznes” i „wywiad”: w tym artykule biznes jest zbiorem działań prowadzonych w jakimkolwiek celu, czy to w nauce, technologii, handlu, przemyśle, prawie, rządzie, obronie itd. . Urządzenie komunikacyjne służące do prowadzenia biznesu (w szerokim znaczeniu) można nazwać systemem wywiadowczym. Pojęcie inteligencji jest tu również definiowane, w bardziej ogólnym sensie, jako „umiejętność uchwycenia wzajemnych powiązań przedstawionych faktów w taki sposób, aby kierować działaniami do pożądanego celu”. Zatem idea „powiązania faktów” jest już obecna w artykule H. P. Luhna. Według wielu źródeł, Howard Dresner ponownie wynalazł „Business Intelligence”, aby zmienić system wspomagania decyzji marki (DSS) i system informacji kierowniczej (EIS), gdy był zatrudniony w DEC, a termin ten stał się sławny dzięki wpływowi grupy Gartner. Najwyraźniej termin ten był już używany znacznie wcześniej, jak w książce Wholesale Business Intelligence and Southern and Western Merchants ‘Pocket Directory to the Principal Mercantile Houses in the City of Philadelphia, na rok 1839. Ponieważ nie mogłem pobrać tego źródła, będę trzymać się akceptacji Luhna / Dresnera. Odnosi się do etymologii inteligencji: późny XIV w. „Zdolność rozumienia”, od starofrancuskiej inteligencji (12c.), Od łacińskiej inteligencja, inteligencja „rozumienie, moc rozeznawania; sztuka, umiejętność, gust ”, od Intelligem (mianownik inteligencji),„ rozeznający ”, obecny imiesłów inteligencji,„ rozumieć, rozumieć ”, od między-„ między ”(patrz inter-) + legere„ wybierać, wybierać

Wywiad wojskowy:

Definicja Business Intelligence: doświadczenie CIA nie jest wymagane Więc czym do cholery jest wywiad biznesowy? W istocie BI to dowolne działanie, narzędzie lub proces służący do uzyskiwania najlepszych informacji wspierających proces podejmowania decyzji. Dla naszych celów BI obraca się wokół wykorzystania mocy obliczeniowej (wysoce wyspecjalizowanego oprogramowania w połączeniu z innymi, bardziej powszechnymi zasobami technologicznymi), aby pomóc w dokonywaniu najlepszych wyborów dla Twojej organizacji. Analiza biznesowa jest zasadniczo aktualna, dokładna, wartościowa i możliwa do wykonania spostrzeżenia biznesowe oraz procesy pracy i technologie wykorzystywane do ich uzyskania. Dlatego skłaniałbym się ku „zbieraniu danych i informacji o biznesie”, a może bardziej „w celu lepszego prowadzenia biznesu”. Dodatkowe uwagi historyczne można znaleźć w dziale Ojciec BI? Czy on się śmieje ?!

[43][Big Data](1)

PYTANIA :

Jak duże są duże zbiory danych?

Wiele osób używa terminu big data w raczej komercyjny sposób, aby wskazać, że w obliczeniach zaangażowane są duże zbiory danych, a zatem potencjalne rozwiązania muszą mieć dobrą wydajność. Oczywiście duże zbiory danych zawsze mają powiązane terminy, takie jak skalowalność i wydajność, ale co dokładnie definiuje problem jako problem dużych zbiorów danych? Czy obliczenia muszą być związane z jakimś zestawem konkretnych celów, takich jak eksploracja danych / wyszukiwanie informacji, czy też algorytm ogólnych problemów z grafami można nazwać dużymi danymi, jeśli zestaw danych byłby wystarczająco duży? Poza tym, jak duże jest wystarczająco duże (jeśli można to określić)?

Dla mnie (wywodzę się z relacyjnej bazy danych), „Big Data” nie dotyczy przede wszystkim rozmiaru danych (czyli większości tego, co dotychczas dotyczyło innych odpowiedzi). „Big Data” i „Bad Data” są ze sobą ściśle powiązane. Relacyjne bazy danych wymagają „nieskazitelnych danych”. Jeśli dane znajdują się w bazie danych, są dokładne, czyste i w 100% wiarygodne. Relacyjne bazy danych wymagają „świetnych danych” oraz poświęcenia ogromnej ilości czasu, pieniędzy i odpowiedzialności, aby upewnić się, że dane są dobrze przygotowane przed załadowaniem ich do bazy danych. Jeśli dane znajdują się w bazie danych, są to „ewangelie”, które definiują systemowe rozumienie rzeczywistości. „Big Data” rozwiązuje ten problem z innej strony. Dane są słabo zdefiniowane, wiele z nich może być niedokładnych, a wielu może faktycznie brakować. Struktura i układ danych są liniowe, a nie relacyjne. Big Data musi mieć wystarczającą ilość, aby ilość złych lub brakujących danych stała się statystycznie nieistotna. Kiedy błędy w danych są na tyle powszechne, że wykluczają się wzajemnie, a brakujące dane są proporcjonalnie na tyle małe, że można je pominąć. Kiedy Twoje wymagania i algorytmy dostępu do danych działają nawet przy niekompletnych i niedokładnych danych, masz „Big Data”. W „Big Data” tak naprawdę nie chodzi o ilość, chodzi o charakterystykę danych.

Jak słusznie zauważyłeś, w dzisiejszych czasach „duże zbiory danych” to coś, co każdy chce powiedzieć, że ma, co pociąga za sobą pewną luźność w definiowaniu tego terminu. Ogólnie rzecz biorąc, powiedziałbym, że z pewnością masz do czynienia z dużymi zbiorami danych, jeśli skala jest taka, że ​​nie jest już możliwe aby radzić sobie z bardziej tradycyjnymi technologiami, takimi jak RDBMS, przynajmniej bez uzupełniania ich technologiami Big Data, takimi jak Hadoop. Jak duże muszą być Twoje dane, aby tak się stało, jest dyskusyjne. Oto (nieco prowokacyjny) post na blogu, w którym stwierdzono, że tak naprawdę nie jest w przypadku mniej niż 5 TB danych. (Żeby było jasne, nie stwierdza się, że „mniej niż 5 TB to nie duże zbiory danych”, ale po prostu „mniej niż 5 TB to za mało, abyś potrzebował Hadoop”). Ale nawet w przypadku mniejszych zbiorów danych technologie Big Data podobnie jak Hadoop, może mieć inne zalety, w tym być dobrze przystosowanym do operacji wsadowych, dobrze bawić się danymi nieustrukturyzowanymi (a także danymi, których struktura nie jest znana z góry lub może się zmienić), skalowalność poziomą (skalowanie poprzez dodawanie większej liczby węzłów zamiast wzmacniania Twoje istniejące serwery) i (jako jeden z komentujących w notatkach do postów, do których prowadzi powyższy link) możliwość integracji przetwarzania danych z zewnętrznymi zbiorami danych (pomyśl o map-reduku, w którym mapper wykonuje wywołanie innego serwera). Inne technologie związane z dużymi zbiorami danych, takie jak bazy danych NoSql, kładą nacisk na szybką wydajność i stałą dostępność podczas obsługi dużych zbiorów danych, a także możliwość obsługi danych częściowo nieustrukturyzowanych i skalowania w poziomie. Oczywiście tradycyjne RDBMS mają swoje zalety, w tym gwarancje ACID (atomowość, spójność, izolacja, trwałość) i lepszą wydajność dla niektórych operacji, a także są bardziej znormalizowane, bardziej dojrzałe i (dla wielu użytkowników) bardziej znane. Dlatego nawet w przypadku bezsprzecznie „dużych” danych sensowne może być załadowanie przynajmniej części danych do tradycyjnej bazy danych SQL i wykorzystanie ich w połączeniu z technologiami dużych zbiorów danych. Tak więc, bardziej hojna byłaby definicja, że ​​masz duże zbiory danych, o ile są one na tyle duże, że technologie dużych zbiorów danych zapewniają pewną wartość dodaną. Ale jak widać, może to zależeć nie tylko od rozmiaru danych, ale także od tego, jak chcesz z nimi pracować i jakie masz wymagania w zakresie elastyczności, spójności i wydajności. To, w jaki sposób wykorzystujesz swoje dane, jest bardziej istotne dla pytania niż do czego ich używasz (np. Eksploracja danych). To powiedziawszy, zastosowania takie jak eksploracja danych i uczenie maszynowe z większym prawdopodobieństwem przyniosą użyteczne wyniki, jeśli masz wystarczająco duży zestaw danych do pracy.

Całkowita ilość danych na świecie: 2,8 zetabajtów w 2012 r., Szacowana na 8 zetabajtów do 2015 r., z czasem podwojenia wynoszącym 40 miesięcy. Nie może być większe 🙂 Jako przykład pojedynczej dużej organizacji, Facebook pobiera 500 terabajtów dziennie do magazynu o wielkości 100 petabajtów i wykonuje 70 tys. zapytań dziennie od 2012 r. Ich obecny magazyn to > 300 petabajtów. Big data to prawdopodobnie dobry ułamek liczb na Facebooku (1/100 prawdopodobnie tak, 1/10000 prawdopodobnie nie: to widmo, a nie pojedyncza liczba). Oprócz rozmiaru, niektóre z funkcji, które sprawiają, że jest duży, to:

* jest aktywnie analizowany, a nie tylko przechowywany (cytat „Jeśli nie korzystasz z dużych zbiorów danych, to nie masz dużych zbiorów danych, masz tylko stos danych”

 * budowa i prowadzenie hurtowni danych to duży projekt infrastrukturalny

* rośnie w znacznym tempie

* nie ma struktury lub ma nieregularną strukturę

Definicja firmy Gartner: „Duże zbiory danych to duże ilości danych, szybkie i / lub różnorodne zasoby informacyjne, które wymagają nowych form przetwarzania” (3V). Dlatego też uważają, że „ogrom” nie dotyczy wyłącznie rozmiaru zbioru danych, ale także o prędkości i strukturze oraz rodzaju potrzebnych narzędzi.

Czy język R jest odpowiedni dla Big Data

R ma wiele bibliotek, które są przeznaczone do analizy danych (np. JAGS, BUGS, ARULES itp.) I jest wymieniany w popularnych podręcznikach. Widziałem wytyczne dotyczące 5 TB dla zbioru danych, który można uznać za Big Data. Moje pytanie brzmi: czy R jest odpowiedni dla ilości danych typowych dla problemów związanych z Big Data? Czy istnieją strategie, które należy zastosować podczas korzystania z języka R z zestawem danych o takim rozmiarze?

Właściwie to się zbliża. Jest kilka obejść, które należy wykonać, ponieważ R wykonuje całą swoją pracę w pamięci, więc zasadniczo ogranicza się ilość pamięci RAM, którą masz do dyspozycji. Dojrzały projekt dla R i Hadoop to RHadoop RHadoop został podzielony na kilka podprojektów, rhdfs, rhbase, rmr2, plyrmr i quickcheck (wiki).

Głównym problemem związanym z używaniem języka R dla dużych zestawów danych jest ograniczenie pamięci RAM. Powodem przechowywania wszystkich danych w pamięci RAM jest to, że zapewnia znacznie szybszy dostęp i przetwarzanie danych niż przechowywanie na dyskach twardych. Jeśli chcesz poprawić wydajność, to tak, praca z dużymi zbiorami danych w języku R jest dość praktyczna.

Pakiet RODBC: umożliwia połączenie z zewnętrzną bazą danych z R w celu pobierania i obsługi danych. W związku z tym manipulowane dane są ograniczone do pamięci RAM. Ogólny zestaw danych może być znacznie większy. Pakiet ff umożliwia korzystanie z zestawów danych większych niż pamięć RAM, wykorzystując strony mapowane w pamięci.

BigLM: buduje uogólnione modele liniowe w oparciu o duże zbiory danych. Ładuje dane do pamięci w fragmentach.

bigmemory: pakiet R, który umożliwia wydajne i wydajne pod względem pamięci równoległe analizy i eksplorację ogromnych zestawów danych. Umożliwia przechowywanie dużych obiektów (matryc itp.) W pamięci (w pamięci RAM) przy użyciu zewnętrznych obiektów wskaźnikowych w celu odniesienia się do nich.

R doskonale nadaje się do „dużych zbiorów danych”! Potrzebujesz jednak przepływu pracy, ponieważ R jest ograniczony (z pewnym uproszczeniem) przez ilość pamięci RAM w systemie operacyjnym. Podejście, które stosuję, polega na interakcji z relacyjną bazą danych (zobacz pakiet RSQLite do tworzenia i interakcji z bazą danych SQLite), uruchamianiu zapytań w stylu SQL w celu zrozumienia struktury danych, a następnie wyodrębnianiu poszczególnych podzbiorów danych do celów obliczeniowych- intensywna analiza statystyczna. To tylko jedno podejście: istnieją pakiety, które umożliwiają interakcję z innymi bazami danych (np. Monet) lub uruchamianie analiz w języku R z mniejszymi ograniczeniami pamięci (np. Patrz pbdR).

 Kiedy wartości p są mylące?

Na jakie warunki dotyczące danych powinniśmy uważać, gdzie wartości p mogą nie być najlepszym sposobem decydowania o istotności statystycznej? Czy istnieją określone typy problemów, które należą do tej kategorii?

Pytasz o pogłębianie danych, co dzieje się podczas testowania bardzo dużej liczby hipotez w zestawie danych lub testowania hipotez w odniesieniu do zestawu danych, które zostały zasugerowane przez te same dane. W szczególności sprawdź hazard z wieloma hipotezami i testowanie hipotez sugerowanych przez dane. Rozwiązaniem jest użycie pewnego rodzaju korekty współczynnika fałszywych odkryć lub współczynnika błędów Familywise, na przykład metody Scheffégo lub (bardzo starej) poprawki Bonferroniego. W nieco mniej rygorystyczny sposób może pomóc filtrowanie odkryć według przedziału ufności dla ilorazu szans (OR) dla każdego wyniku statystycznego. Jeśli 99-procentowy przedział ufności dla ilorazu szans wynosi 10-12, to OR jest <= 1 z bardzo małym prawdopodobieństwem, zwłaszcza jeśli wielkość próby jest również duża. Jeśli znajdziesz coś takiego, prawdopodobnie jest to silny efekt, nawet jeśli wyszedł z testu milionów hipotez.

Nie powinieneś rozważać wartości p poza kontekstem. Jedną raczej podstawową kwestią (jak ilustruje xkcd) jest to, że musisz rozważyć, ile testów, które faktycznie przeprowadzasz. Oczywiście nie należy być zszokowanym, widząc p <0,05 dla jednego na 20 testów, nawet jeśli hipoteza zerowa za każdym razem jest prawdziwa. Bardziej subtelny przykład tego występuje w fizyce wysokich energii i jest znany jako efekt patrzenia gdzie indziej. Im większą przestrzeń parametrów szukasz sygnału, który może reprezentować nową cząstkę, tym większe jest prawdopodobieństwo, że zobaczysz pozorny sygnał, który w rzeczywistości jest wynikiem przypadkowych fluktuacji.

Jedną rzeczą, o której powinieneś wiedzieć, jest wielkość próbki, której używasz. Bardzo duże próbki, takie jak ekonomiści korzystający z danych ze spisu powszechnego, doprowadzą do deflowanych wartości p.

Który stos technologii Big Data najlepiej nadaje się do przetwarzania tweetów, wyodrębnianie / rozwijanie adresów URL i wysyłanie (tylko) nowych linków do systemu innej firmy?

Uważam, że rozumiem ogólny cel pytania, w wyniku czego prawdopodobnie będę w stanie odpowiedzieć na wszelkie pytania, które mogą pop-up.) Który stos technologii Big Data najlepiej nadaje się do przetwarzania tweetów, wyodrębniania / rozszerzania adresów URL i wysyłania (tylko) nowych linków do systemu innej firmy? Proponuję Apache Kafka jako magazyn wiadomości i dowolne wybrane rozwiązanie do przetwarzania strumieni, takie jak Apache Camel lub Twitter Storm

W jaki sposób zapytanie do ogromnej bazy danych powraca z pomijalnym wynikiem czasu oczekiwania?

Na przykład podczas wyszukiwania czegoś w Google wyniki zwracają się niemal natychmiast. Rozumiem, że Google sortuje i indeksuje strony za pomocą algorytmów itp., Ale wyobrażam sobie, że nie jest możliwe indeksowanie wyników każdego możliwego zapytania (a wyniki są spersonalizowane, co czyni to jeszcze bardziej niewykonalnym)? Co więcej, czy opóźnienie sprzętowe w sprzęcie Google nie byłoby ogromne? Nawet jeśli dane w Google wszystkie były przechowywane na dyskach SSD TB / s, wyobrażam sobie, że opóźnienie sprzętowe jest ogromne, biorąc pod uwagę samą ilość danych do przetworzenia.

Czy MapReduce pomaga rozwiązać ten problem?

EDYCJA: OK, więc rozumiem, że popularne wyszukiwania można przechowywać w pamięci. Ale co z niepopularnymi wyszukiwaniami? Nawet w przypadku najbardziej niejasnego wyszukiwania, jakie przeprowadziłem, nie sądzę, aby było ono kiedykolwiek zgłaszane jako dłuższe niż 5 sekund. Jak to jest możliwe?

MapReduce nie ma nic wspólnego z działaniem w czasie rzeczywistym. Jest to platforma przetwarzania zorientowana na partię, odpowiednia dla niektórych zadań offline, takich jak ETL i tworzenie indeksów. Google wycofał się z MapReduce w większości zadań, a nawet ekosystem Hadoop robi to podobnie. Odpowiedzią na małe opóźnienie jest zazwyczaj przechowywanie w pamięci wstępnie obliczonych wskaźników. Wszystko, co dotyka dysku, jest trudne do wykonania szybko i na dużą skalę. W ten sposób silniki SQL nowej generacji oparte na Hadoop, takie jak Impala, uzyskują tak dużą prędkość w porównaniu do opartych na MapReduce na przykład infrastruktura, taka jak Hive. Infrastruktura wyszukiwania nie może buforować wyników każdego zapytania. Ale z pewnością może buforować wyniki pośrednie lub bardziej kompletne wyniki dla najpopularniejszych zapytań. Przy odrobinie buforowania możesz podawać wyniki dla znacznej mniejszości wszystkich zapytań. Wyszukiwanie jest również podzielone na serwery. Tak więc jedna maszyna może delegować do 100, aby uzyskać część wyniku, a następnie połączyć je. Możesz także uciec z pewnym stopniem przybliżenia. Google nie tworzy dosłownie tysiąca stron wyników wyszukiwania; wystarczy, że pierwsza strona będzie prawidłowa. Pamiętaj, że Google ma miliony komputerów na całym świecie. Twoje zapytania trafiają do centrum danych, które znajduje się w pobliżu Ciebie i obsługuje tylko Twoją lokalizację. Eliminuje to większość opóźnień, które są związane z siecią, a nie czasem przetwarzania w centrum danych.

MapReduce nie jest używane do wyszukiwania. Został użyty dawno temu do budowy indeksu; ale jest to platforma przetwarzania wsadowego, a większość sieci nie zmienia się cały czas, więc nowsze architektury mają charakter przyrostowy, a nie wsadowy. Wyszukiwanie w Google będzie w dużej mierze działać tak samo, jak w Lucene i Elastic Search, z wyjątkiem wielu precyzyjnie dostrojonych dodatkowych obciążeń i optymalizacji. Ale w głębi serca użyją jakiejś formy odwróconego indeksu. Innymi słowy, nie przeszukują kilku terabajtów po wpisaniu zapytania wyszukiwania (nawet jeśli nie jest ono zapisane w pamięci podręcznej). Prawdopodobnie w ogóle nie patrzą na rzeczywiste dokumenty. Ale używają tabeli odnośników, która zawiera listę dokumentów pasujących do zapytania (z preprocesorami, błędami pisowni, synonimami itp.). Prawdopodobnie pobierają listę 10000 najpopularniejszych dokumentów dla każdego słowa (10 tys. Liczb całkowitych – tylko kilka kb!) I obliczają na jej podstawie najlepsze dopasowania. Tylko jeśli na tych listach nie ma dobrych dopasowań, rozwijają się one do następnych takich bloków itp. Zapytania dotyczące typowych słów można łatwo przechowywać w pamięci podręcznej; dzięki wstępnemu przetwarzaniu możesz zbudować listę 10k najlepszych wyników, a następnie uporządkować je zgodnie z profilem użytkownika. Nie ma też nic do zyskania obliczając „dokładną” odpowiedź. Spojrzenie na pierwszych 10 000 wyników jest prawdopodobnie wystarczające; nie ma poprawnej odpowiedzi; a jeśli lepszy wynik gdzieś na pozycji 10001 zostanie pominięty, nikt nie będzie wiedział ani nie zauważył (ani nie przejmował się). Prawdopodobnie został już w rankingu niżej w przetwarzaniu wstępnym i nie znalazłby się w pierwszej 10, która jest prezentowana użytkownikowi na końcu (lub w pierwszej trójce, na którą faktycznie patrzy użytkownik). Z drugiej strony rzadkie terminy nie są zbyt popularne wyzwanie – jedna z list zawiera tylko kilka pasujących dokumentów, a wszystkie pozostałe możesz od razu odrzucić.

Gdy relacyjna baza danych ma lepszą wydajność niż nie relacyjne

Kiedy relacyjna baza danych, taka jak mySQL, ma lepszą wydajność niż nierelacyjna, taka jak mongo? Widziałem kiedyś pytanie na Quorze, dlaczego Quora nadal używa mySQL jako swojego zaplecza. I jak ich wydajność jest nadal dobra.

To zależy od Twoich danych i tego, co z nimi robisz. Na przykład, jeśli przetwarzanie, które musisz wykonać, wymaga synchronizacji transakcji między węzłami, prawdopodobnie szybsze będzie użycie transakcji zaimplementowanych w RDBMS niż samodzielne implementowanie ich na bazach danych NoSQL, które nie obsługują go natywnie.

Dlaczego trudno jest zapewnić wydajność podczas korzystania z bibliotek?

Każde przetwarzanie małej bazy danych może być łatwo rozwiązane przez skrypty Python / Perl /…, które używają bibliotek i / lub nawet narzędzi z samego języka. Jednak jeśli chodzi o wydajność, ludzie zwykle sięgają po języki C / C ++ / niskiego poziomu. Możliwość dostosowania kodu do potrzeb wydaje się być tym, co czyni te języki tak atrakcyjnymi dla BigData – czy to w odniesieniu do zarządzania pamięcią, równoległości, dostępu do dysku, czy nawet optymalizacji niskiego poziomu (poprzez konstrukcje asemblacyjne na poziomie C / C ++). Oczywiście taki zestaw korzyści nie obywałby się bez kosztów: pisanie kodu, a czasem nawet wymyślanie na nowo koła, może być dość drogie / męczące. Chociaż dostępnych jest wiele bibliotek, ludzie mają skłonność do samodzielnego pisania kodu, gdy tylko potrzebują wydajności. Co uniemożliwia asercjom wydajności korzystanie z bibliotek podczas przetwarzania dużych baz danych? Na przykład rozważmy przedsiębiorstwo, które nieustannie przeszukuje strony internetowe i analizuje zebrane dane. Dla każdego przesuwanego okna na wyodrębnionych danych są uruchamiane różne algorytmy eksploracji danych. Dlaczego programiści mieliby zrezygnować z korzystania z dostępnych bibliotek / frameworków (czy to do indeksowania, przetwarzania tekstu i eksploracji danych)? Korzystanie z już zaimplementowanych rzeczy nie tylko zmniejszyłoby ciężar kodowania całego procesu, ale także zaoszczędziłoby dużo czasu.

W jednym ujęciu:

* co sprawia, że ​​samodzielne napisanie kodu jest gwarancją wykonania?

* dlaczego poleganie na frameworkach / bibliotekach jest ryzykowne, skoro musisz zapewnić wysoką wydajność?

Nie sądzę, żeby wszyscy sięgali po C/C++, gdy problemem była wydajność. Zaletą pisania kodu niskiego poziomu jest użycie mniejszej liczby cykli procesora lub czasami mniej pamięci. Ale chciałbym zauważyć, że języki wyższego poziomu mogą odwoływać się do języków niższego poziomu i robią to, aby uzyskać część tej wartości. Języki Python i JVM mogą to zrobić. Naukowiec zajmujący się danymi, korzystający na przykład ze scikit-learn na swoim komputerze, już wywołuje mocno zoptymalizowane natywne procedury, aby wykonać obliczenia. Nie ma sensu pisać nowego kodu szybkości. W kontekście rozproszonych „dużych zbiorów danych” częściej stanowisz wąskie gardło w przenoszeniu danych:

transfer sieciowy i I / O. Kod natywny nie pomaga. Pomaga nie pisanie tego samego kodu, aby działał szybciej, ale pisanie mądrzejszego kodu. Języki wyższego poziomu pozwolą Ci zaimplementować bardziej wyrafinowane rozproszone algorytmy w danym czasie programisty niż C / C ++. Na dużą skalę inteligentniejszy algorytm zapewniający lepszy przepływ danych pokona głupi kod natywny. Zwykle jest też prawdą, że czas programisty i błędy kosztują dużo więcej niż nowy sprzęt. Rok starszego programisty może być w pełni obciążony 200 000 USD; ponad rok, który również wynajmuje setki serwerów na czas obliczeniowy. W większości przypadków po prostu nie ma sensu zawracać sobie głowy optymalizacją, zamiast rzucać więcej sprzętu. Nie rozumiem dalszych informacji na temat „przyznania”, „wyłączenia” i „potwierdzenia”?

Jak wszyscy wiemy, w świecie cyfrowym jest wiele sposobów na wykonanie tej samej pracy / uzyskanie oczekiwanych rezultatów. A odpowiedzialność / ryzyko wynikające z kodu spoczywa na barkach programistów. Jest to małe, ale myślę, że bardzo przydatny przykład z Świat .NET .. Tak wielu programistów .NET używa wbudowanego BinaryReader – BinaryWriter do serializacji danych w celu uzyskania wydajności / uzyskania kontroli nad procesem. To jest kod źródłowy CSharp wbudowanej w FrameWork klasy BinaryWriter.

przeciążone metody zapisu:

// Zapisuje wartość logiczną do tego strumienia. W strumieniu zapisywany jest pojedynczy bajt

// z wartością 0 reprezentującą fałsz lub wartością 1 reprezentującą prawdę.

//

public virtual void Write (wartość bool)

{

// Bufor _ to tablica bajtów zadeklarowana w kodach ctor / init klasy

_buffer = ((bajt) (wartość? 1: 0));

// OutStream to instancja strumienia, do której BinaryWriter zapisuje wartości.

OutStream.WriteByte (_buffer [0]);

}

Jak widać, ta metoda mogłaby zostać napisana bez dodatkowego przypisywania do zmiennej _buffer:

public virtual void Write (wartość bool)

{

OutStream.WriteByte ((bajt) (wartość? 1: 0));

}

Bez przypisywania moglibyśmy zyskać kilka milisekund… Te kilka milisekund można zaakceptować jako „prawie nic”, ale co, jeśli jest wiele tysięcy zapisów (tj. W procesie serwera)? Załóżmy, że „kilka” to 2 (milisekundy), a wiele tysięcy wystąpień to tylko 2 000 .. Oznacza to 4 sekundy więcej czasu przetwarzania..4 sekundy później powrót .. Jeśli nadal będziemy tematować z .NET i czy możesz sprawdzić kody źródłowe BCL – .NET Base Class Library – z MSDN widać wiele strat wydajności ze strony dewelopera.

Dowolny punkt ze źródła BCL To normalne, że programista zdecydował się na użycie pętli while() lub foreach(), które mogłyby zaimplementować szybszą pętlę for() w swoim kodzie. Te małe zyski dają nam całkowitą wydajność .. A jeśli wrócimy do metody BinaryWriter.Write() .. W rzeczywistości dodatkowe przypisanie do implementacji _buffer nie jest błędem nadrzędnym… To jest właśnie decyzja o „pozostaniu w bezpiecznym miejscu”! Załóżmy, że zdecydowaliśmy się nie używać _buffer i zdecydowaliśmy się zaimplementować drugą metodę. Jeśli spróbujemy wysłać wiele tysięcy bajtów przez przewód (tj. Załadować / pobrać dane BLOB lub CLOB) drugą metodą, może się to nie udać, ponieważ utraty połączenia, ponieważ staramy się przesyłać wszystkie dane bez żadnych sprawdzeń i mechanizmów kontrolnych. W przypadku utraty połączenia, zarówno serwer, jak i Klient nigdy nie wiedzą, czy wysłane dane są kompletne, czy nie. Jeśli deweloper zdecyduje się „pozostać bezpiecznym”, zwykle oznacza to, że koszty wydajności zależą od zaimplementowanego mechanizmu (ów) „pozostań bezpieczny”. Ale jeśli programista zdecyduje się „podejść ryzykownie, zwiększyć wydajność”, to również nie jest wada… Do czasu, gdy pojawiają się dyskusje na temat „ryzykownego” kodowania. Mała uwaga: deweloperzy bibliotek komercyjnych zawsze starają się zachować bezpieczeństwo, ponieważ nie wiedzą, gdzie ich kod będzie używany.

Z punktu widzenia programistów frameworki rzadko traktują wydajność jako najwyższy priorytet. Jeśli Twoja biblioteka będzie szeroko wykorzystywana, ludzie będą prawdopodobnie najbardziej cenić łatwość użytkowania, elastyczność i niezawodność. Wydajność jest generalnie ceniona w drugorzędnych konkurencyjnych bibliotekach. „Biblioteka X jest lepsza, ponieważ jest szybsza”. Nawet wtedy bardzo często te biblioteki będą wymieniać najbardziej optymalne rozwiązanie na takie, które można szeroko wykorzystać. Korzystając z dowolnego frameworka, nieodłącznie ryzykujesz, że istnieje szybsze rozwiązanie. Mógłbym nawet powiedzieć, że prawie zawsze istnieje szybsze rozwiązanie. Samo napisanie czegoś nie jest gwarancją wydajności, ale jeśli wiesz, co robisz i masz dość ograniczony zestaw wymagań, może to pomóc. Przykładem może być analiza JSON. Istnieją setki bibliotek dla różnych języków, które zmienią JSON w obiekt, do którego można się odwoływać i na odwrót. Znam jedną implementację, która robi to wszystko w rejestrach procesora. Jest wymiernie szybszy niż wszystkie inne parsery, ale jest też bardzo ograniczony, a to ograniczenie będzie się różnić w zależności od tego, z jakim procesorem pracujesz. Czy zadanie tworzenia wysokowydajnego parsera JSON specyficznego dla środowiska to dobry pomysł? Wykorzystałbym szanowaną bibliotekę 99 razy na 100. W tym jednym oddzielnym przypadku kilka dodatkowych cykli procesora pomnożonych przez milion iteracji sprawiłoby, że czas rozwoju byłby tego wart.

Kompromisy między Storm a Hadoop (MapReduce)

Czy ktoś uprzejmie może mi powiedzieć o kompromisach związanych z wyborem między Storm a MapReduce w Hadoop Cluster do przetwarzania danych? Oczywiście, pomijając oczywiste, że Hadoop (przetwarzanie przez MapReduce w klastrze Hadoop) jest systemem przetwarzania wsadowego, a Storm jest systemem przetwarzania w czasie rzeczywistym.

Pracowałem trochę z Hadoop Eco System, ale nie pracowałem z Storm. Po przejrzeniu wielu prezentacji i artykułów nadal nie udało mi się znaleźć satysfakcjonującej i wyczerpującej odpowiedzi. Uwaga: tutaj termin „kompromis” nie ma na celu porównania z podobnymi rzeczami. Ma przedstawiać konsekwencje uzyskiwania wyników w czasie rzeczywistym, których nie ma w systemie przetwarzania wsadowego.

MapReduce: odporna na błędy rozproszona struktura obliczeniowa. MapReduce pozwala na operowanie na ogromnych ilościach danych – z dużym nakładem pracy, aby zapobiec awariom spowodowanym sprzętem. MapReduce to kiepski wybór do obliczania wyników w locie, ponieważ jest wolny. (Typowe zadanie MapReduce zajmuje kilka minut lub godzin, a nie mikrosekund). Zadanie MapReduce pobiera plik (lub jakiś magazyn danych) jako dane wejściowe i zapisuje plik wyników. Jeśli chcesz, aby te wyniki były dostępne dla aplikacji, Twoim obowiązkiem jest umieszczenie tych danych w dostępnym miejscu. Jest to prawdopodobnie powolne i będzie występować opóźnienie między wartościami, które można wyświetlić, a wartościami reprezentującymi system w jego bieżącym stanie. Ważnym rozróżnieniem, które należy rozróżnić, rozważając użycie MapReduce w budowaniu systemów czasu rzeczywistego, jest szkolenie modelu i zastosowanie modelu. Jeśli uważasz, że parametry modelu nie zmieniają się szybko, możesz dopasować je za pomocą MapReduce, a następnie mieć mechanizm dostępu do tych wstępnie dopasowanych parametrów, gdy chcesz zastosować model. Storm: system obliczeniowy do przesyłania strumieniowego w czasie rzeczywistym. Storm to framework online, w tym sensie usługa, która współdziała z uruchomioną aplikacją. W przeciwieństwie do MapReduce, otrzymuje małe fragmenty danych (nie cały plik), gdy są one przetwarzane w aplikacji. Definiujesz DAG operacji do wykonania na danych. Typowym i prostym przypadkiem użycia Storm jest śledzenie liczników i wykorzystywanie tych informacji do wypełniania pulpitu nawigacyjnego w czasie rzeczywistym. Storm nie ma (koniecznie) nic wspólnego z utrwalaniem danych. W tym przypadku przesyłanie strumieniowe to kolejny sposób na zatrzymanie informacji, na których Ci zależy, i wyrzucenie reszty.

W rzeczywistości prawdopodobnie masz w aplikacji warstwę trwałości, która już zarejestrowała dane, a więc jest to dobre i uzasadnione rozdzielenie obaw. Jeśli chcesz wiedzieć więcej… Jeśli chcesz dowiedzieć się więcej o systemach czasu rzeczywistego, które pasują do parametrów z MR i stosują modele w inny sposób, oto slajdy do wykładu, który wygłosiłem na temat tworzenia silników rekomendacji w czasie rzeczywistym na HBase. Doskonałym dokumentem, który w interesujący sposób łączy liczenie w czasie rzeczywistym i wytrwałość, jest Personalizacja Google News: skalowalne, oparte na współpracy filtrowanie online Kolejnym interesującym połączeniem MR i Storm jest SummingBird. Summingbird umożliwia zdefiniowanie operacji analizy danych, które można zastosować za pośrednictwem Storm lub MR.

To trochę tak, jakby pytać o kompromisy między patelnią a szufladą ze sztućcami. Tak naprawdę to nie są dwie rzeczy, które można porównać. Możesz ich używać razem w ramach większego projektu. Sam Hadoop to nie jedno, ale nazwa federacji usług, takich jak HDFS, Hive, HBase, MapReduce itp. Storm to coś, czego używasz w przypadku niektórych z tych usług, takich jak HDFS lub HBase. Jest to struktura przetwarzania strumieniowego. W rozszerzonym ekosystemie Hadoop są inne, takie jak Spark Streaming. Kiedy wybrałbyś platformę przetwarzania strumieniowego? kiedy musisz reagować na nowe dane w czasie zbliżonym do rzeczywistego. Jeśli potrzebujesz tego rodzaju narzędzia, wdrażasz również takie narzędzie.

Kaskadowy błąd w Apache Storm

Przeglądając prezentację i materiały Summingbird na Twitterze, jednym z powodów, o których wspomina się przy jednoczesnym używaniu klastrów Storm i Hadoop w Summingbird, jest to, że przetwarzanie za pośrednictwem Storm powoduje kaskadowanie błędów. Aby uniknąć kaskadowania błędów i ich akumulacji, klaster Hadoop jest używany do przetwarzania wsadowego danych i odrzucania wyników Storm po przetworzeniu tych samych danych przez Hadoop. Jakie są przyczyny generowania tej kumulacji błędów? i dlaczego nie ma go w Hadoop? Ponieważ nie pracowałem ze Stormem, nie znam powodów. Czy to dlatego, że Storm używa przybliżonego algorytmu do przetwarzania danych w celu przetwarzania ich w czasie rzeczywistym? czy może przyczyna jest inna?

Twitter używa Storm do przetwarzania danych w czasie rzeczywistym. Mogą wystąpić problemy z danymi w czasie rzeczywistym. Systemy mogą ulec awarii. Dane mogą zostać nieumyślnie przetworzone dwukrotnie. Połączenia sieciowe mogą zostać utracone. W systemie czasu rzeczywistego może się wiele wydarzyć. Używają hadoopa do niezawodnego przetwarzania danych historycznych. Nie znam szczegółów, ale na przykład uzyskanie solidnych informacji z zagregowanych dzienników jest prawdopodobnie bardziej niezawodne niż dołączenie do strumienia. Gdyby po prostu polegali na Storm we wszystkim – Storm miałby problemy ze względu na charakter dostarczania informacji w czasie rzeczywistym na dużą skalę. Jeśli we wszystkim polegali na hadoopie, wiąże się to z dużym opóźnieniem. Połączenie tych dwóch z Summingbird to kolejny logiczny krok.

Czy muszę się uczyć Hadoop, aby zostać naukowcem danych?

Aspirujący naukowiec danych. Nie wiem nic o Hadoopie, ale czytając o Data Science i Big Data, wiele mówi się o Hadoop. Czy jest absolutnie konieczne, aby nauczyć się Hadoop, aby zostać naukowcem danych?

Różni ludzie używają różnych narzędzi do różnych celów. Terminy takie jak nauka o danych są ogólne z jakiegoś powodu. Analityk danych może spędzić całą karierę bez konieczności uczenia się konkretnego narzędzia, takiego jak hadoop. Hadoop jest szeroko stosowany, ale nie jest jedyną platformą, która jest w stanie zarządzać danymi, nawet tymi na dużą skalę, i nimi manipulować. Powiedziałbym, że naukowiec zajmujący się danymi powinien znać pojęcia takie jak MapReduce, systemy rozproszone, rozproszone systemy plików i tym podobne, ale nie oceniałbym kogoś za brak wiedzy o takich rzeczach.

To duże pole. Jest morze wiedzy i większość ludzi jest w stanie nauczyć się i być ekspertem w jednej kropli. Kluczem do bycia naukowcem jest chęć uczenia się i motywacja do poznania tego, czego jeszcze nie wiesz. Na przykład: mógłbym przekazać właściwej osobie sto ustrukturyzowanych plików CSV zawierających informacje o wynikach w jednej klasie w ciągu dziesięciu lat. Naukowiec zajmujący się danymi mógłby spędzić rok na zbieraniu informacji z danych bez konieczności rozłożenia obliczeń na wiele maszyn. Można zastosować algorytmy uczenia maszynowego, analizować je za pomocą wizualizacji, łączyć z zewnętrznymi danymi o regionie, składzie etnicznym, zmianach środowiska w czasie, informacjami politycznymi, wzorcami pogodowymi itp. Wszystko to byłoby według mnie „nauką o danych”. . Potrzeba czegoś w rodzaju hadoopa, aby przetestować i zastosować wszystko, czego się nauczyłeś, do danych obejmujących cały kraj uczniów, a nie tylko salę lekcyjną, ale ten ostatni krok niekoniecznie czyni kogoś badaczem danych. A niepodjęcie tego ostatniego kroku niekoniecznie dyskwalifikuje kogoś z bycia naukowcem danych.

Jako były inżynier Hadoop nie jest to potrzebne, ale pomaga. Hadoop to tylko jeden system – najpopularniejszy system oparty na Javie i ekosystem produktów, które stosują określoną technikę „Mapuj / Zmniejsz”, aby uzyskać wyniki w odpowiednim czasie. Hadoop nie jest używane w Google, chociaż zapewniam, że używają analityki dużych zbiorów danych. Google korzysta z własnych systemów, opracowanych w C ++. W rzeczywistości Hadoop powstał w wyniku opublikowania przez Google ich białych ksiąg Map / Reduce i BigTable (HBase in Hadoop). Naukowcy zajmujący się danymi będą współpracować z inżynierami hadoopów, chociaż w mniejszych miejscach może być  wymagane noszenie obu czapek. Jeśli jesteś ściśle analitykiem danych, to wszystko, czego używasz do analizy, R, Excel, Tableau itp., Będzie działać tylko na niewielkim podzbiorze, a następnie będzie musiało zostać przekonwertowane, aby działało z pełnym zestawem danych obejmującym hadoop.

Najpierw musisz wyjaśnić, co masz na myśli, mówiąc „naucz się Hadoop”. Jeśli masz na myśli używanie Hadoop, na przykład naukę programowania w MapReduce, to najprawdopodobniej jest to dobry pomysł. Jednak wiedza podstawowa (baza danych, uczenie maszynowe, statystyka) może odgrywać większą rolę w miarę upływu czasu.

Filtrowanie spamu z pobranych danych

Słyszałem kiedyś, że filtrowanie spamu za pomocą czarnych list nie jest dobrym podejściem, ponieważ niektórzy użytkownicy szukający wpisów w Twoim zbiorze danych mogą szukać określonych informacji z zablokowanych źródeł. Ponadto ciągłe sprawdzanie aktualnego stanu każdego zablokowanego spamera, sprawdzanie, czy witryna / domena nadal rozpowszechnia dane o spamie, stałoby się ciężarem. Biorąc pod uwagę, że każde podejście musi być wydajne i skalowalne, aby obsługiwać filtrowanie na bardzo dużych zbiorach danych, jakie są dostępne strategie pozbycia się spamu w sposób nieobiektywny?

Edycja: jeśli to możliwe, każdy przykład strategii, nawet jeśli tylko intuicja za nim stoi, byłby bardzo mile widziany wraz z odpowiedzią.

Sieci neuronowe zrewolucjonizowały filtrowanie spamu, zwłaszcza w wiadomościach e-mail.

EDYCJA: Podstawową intuicją stojącą za używaniem sieci neuronowej do pomocy w filtrowaniu spamu jest przypisywanie wagi terminom na podstawie tego, jak często są one powiązane ze spamem. Najszybciej sieci neuronowe można trenować w nadzorowanym – jawnie podajesz klasyfikację zdania w zbiorze uczącym – środowisko. Bez wchodzenia do nitty gritty podstawową ideę można zilustrować tymi zdaniami:

Tekst = „Jak utrata patentu Viagry wpłynie na firmę Pfizer”, Spam = false Text = „Tania Viagra Kup teraz”, Spam = true Text = „Apteka internetowa Viagra Cialis Lipitor”, Spam = true

W przypadku dwuetapowej sieci neuronowej pierwszy etap obliczy prawdopodobieństwo spamu na podstawie tego, czy słowo istnieje w zdaniu. A więc z naszego przykładu: viagra => 66% kup => 100% Pfizer => 0% itd. Następnie w drugim etapie wyniki z pierwszego etapu są używane jako zmienne w drugim etapie: viagra & buy => 100% Pfizer & viagra => 0%. Ta podstawowa idea jest stosowana dla wielu permutacji wszystkich słów w danych treningowych. Po wytrenowaniu wyników końcowych chodzi w zasadzie tylko o równanie, które na podstawie kontekstu słów w zdaniu może określić prawdopodobieństwo spamu. Ustaw próg spamowania i odfiltruj wszelkie dane powyżej wspomnianego progu.

Czy FPGrowth nadal często jest uważane za „najnowocześniejsze” górnictwo?

Z tego, co wiem o rozwoju algorytmów do rozwiązania problemu FPM (Frequent Pattern Mining), droga ulepszeń ma kilka głównych punktów kontrolnych. Po pierwsze, algorytm Apriori został zaproponowany w 1993 roku przez Agrawala i wspólnikóe. , wraz z formalizacją problemu. Algorytm był w stanie usunąć niektóre zestawy z zestawów 2 ^ n – 1 (poweret) przy użyciu kraty do utrzymania danych. Wadą tego podejścia była konieczność ponownego odczytu bazy danych w celu obliczenia częstotliwości każdego rozszerzanego zestawu. Później, w 1997 roku, Zaki i wspólnicy. Zaproponował algorytm Eclat, który wstawiał wynikową częstotliwość każdego zestawu do wnętrza sieci. Dokonano tego poprzez dodanie, w każdym węźle sieci, zestawu identyfikatorów transakcji, które zawierały elementy od korzenia do węzła, do którego się odnosi. Główny wkład polega na tym, że nie trzeba ponownie czytać całego zbioru danych, aby poznać częstotliwość każdego zestawu, ale pamięć wymagana do utrzymania takiej struktury danych może przekroczyć rozmiar samego zbioru danych. W 2000 roku Han i wsp. zaproponowali algorytm o nazwie FPGrowth wraz z przedrostkową strukturą danych w postaci drzewa o nazwie FPTree. Algorytm był w stanie zapewnić znaczną kompresję danych, jednocześnie zapewniając, że zostaną uzyskane tylko częste zestawy elementów (bez generowania zestawu elementów kandydatów). Odbyło się to głównie poprzez sortowanie pozycji każdej transakcji w kolejności malejącej, tak aby pozycje najczęściej występowały w przypadku najmniej powtórzeń w strukturze danych drzewa. Ponieważ częstotliwość spada tylko podczas dogłębnego przemierzania drzewa, algorytm jest w stanie usunąć rzadkie zestawy elementów. Czy algorytm FPGrowth jest nadal uważany za „najnowocześniejszy” w częstym eksploracji wzorców? Jeśli nie, jakie algorytmy mogą skuteczniej wyodrębniać częste zestawy pozycji z dużych zbiorów danych?

Stan techniki: zastosowany w praktyce czy opracowany w teorii?

APRIORI jest używane wszędzie, z wyjątkiem opracowywania nowych algorytmów częstego zestawiania przedmiotów. Jest łatwy do wdrożenia i ponownego wykorzystania w bardzo różnych dziedzinach. Znajdziesz setki wdrożeń APRIORI o różnej jakości. W rzeczywistości łatwo jest pomylić APRIORI.

FPgrowth jest znacznie trudniejszy do zaimplementowania, ale także znacznie bardziej interesujący. Z akademickiego punktu widzenia każdy stara się poprawić wzrost FP – uzyskanie pracy w oparciu o zaakceptowane APRIORI będzie teraz bardzo trudne. Jeśli masz dobrą implementację, każdy algorytm jest dobry i moim zdaniem są to złe sytuacje. Dobra implementacja APRIORI będzie wymagała jedynie przeszukania bazy danych k razy, aby znaleźć wszystkie częste zestawy elementów o długości k. W szczególności, jeśli dane mieszczą się w pamięci głównej, jest to tanie. To, co może zabić APRIORI, to zbyt wiele częstych zestawów 2 elementów (zwłaszcza gdy nie używasz Trie i podobnych technik przyspieszania itp.). Działa najlepiej w przypadku dużych danych z małą liczbą częstych zestawów elementów. Eclat działa na kolumnach; ale musi czytać każdą kolumnę znacznie częściej. Trwają prace nad mechanizmami różnicowymi, aby zmniejszyć tę pracę. Jeśli twoje dane nie mieszczą się w pamięci głównej, Eclat cierpi prawdopodobnie bardziej niż Apriori. Przechodząc najpierw w głąb, będzie w stanie zwrócić pierwszy interesujący wynik znacznie wcześniej niż Apriori i możesz użyć tych wyników do dostosowania parametrów; więc potrzebujesz mniej iteracji, aby znaleźć dobre parametry. Ale z założenia nie może wykorzystywać przycinania tak starannie, jak zrobił to Apriori. FPGrowth kompresuje zestaw danych do drzewa. Działa to najlepiej, gdy masz dużo zduplikowanych rekordów. Prawdopodobnie możesz odnieść spore korzyści także dla Apriori i Eclat, jeśli możesz wstępnie posortować swoje dane i scalić duplikaty w ważone wektory. FPGrowth robi to na ekstremalnym poziomie. Wadą jest to, że implementacja jest znacznie trudniejsza; a kiedy to drzewo nie mieści się już w pamięci, robi się bałagan do zaimplementowania. Jeśli chodzi o wyniki wydajności i testy porównawcze – nie ufaj im. Jest tak wiele rzeczy do nieprawidłowego wdrożenia. Wypróbuj 10 różnych implementacji, a uzyskasz 10 bardzo różnych wyników wydajności. W szczególności w przypadku APRIORI mam wrażenie, że większość implementacji jest zepsuta w tym sensie, że brakuje niektórych głównych elementów APRIORI… a wśród tych, które mają te części prawidłowo, jakość optymalizacji jest bardzo różna.

Większość ostatnich podejść do częstych wzorców, które widziałem w literaturze, opiera się na optymalizacji FPGrowth. Muszę przyznać, że od wielu lat nie widziałem wielu zmian w literaturze dotyczącej FPM.

Czy Python jest odpowiedni dla dużych zbiorów danych?

W tym poście przeczytałem, że język R jest odpowiedni dla Big Data, że ​​duże zbiory danych stanowią 5 TB i chociaż dobrze radzą sobie z dostarczaniem informacji o możliwości pracy z tego typu danymi w R, to dostarczają bardzo mało informacji o Pythonie. Zastanawiałem się, czy Python może również pracować z taką ilością danych. Aby wyjaśnić, czuję, że oryginalne odniesienia do pytań przez OP prawdopodobnie nie są najlepsze dla formatu typu SO, ale z pewnością będę reprezentował Pythona w tym konkretnym przypadku. Zacznę od tego, że niezależnie od rozmiaru danych, Python nie powinien być czynnikiem ograniczającym. W rzeczywistości jest tylko kilka głównych problemów, które napotkasz w przypadku dużych zbiorów danych:

* Wczytywanie danych do pamięci – jest to zdecydowanie najczęstszy problem w świecie dużych zbiorów danych. Zasadniczo nie możesz wczytać więcej danych, niż masz w pamięci (RAM). Najlepszym sposobem rozwiązania tego problemu jest wykonanie niepodzielnych operacji na danych zamiast próby wczytania wszystkiego naraz.

* Przechowywanie danych – w rzeczywistości jest to tylko kolejna forma wcześniejszego wydania, zanim osiągniesz około 1 TB, zaczniesz szukać gdzie indziej miejsca do przechowywania. AWS S3 jest najpopularniejszym zasobem, a python ma fantastyczną bibliotekę boto, która ułatwia prowadzenie z dużymi fragmentami danych.

* Opóźnienie sieci – Twoim wąskim gardłem będzie przenoszenie danych między różnymi usługami. Nie możesz zrobić wiele, aby to naprawić, poza próbą wybrania zasobów w kolokacji i podłączeniem do ściany.

Jest kilka rzeczy, które musisz zrozumieć, mając do czynienia z Big Data –

Co to jest Big Data?

Być może znasz słynne V Big Data – Volume, Velocity, Variety… Więc Python może nie być odpowiedni dla wszystkich. I to pasuje do wszystkich dostępnych narzędzi do analizy danych. Musisz wiedzieć, które narzędzie jest dobre do jakiego celu. W przypadku dużej ilości danych:

Pig / Hive / Shark – czyszczenie danych i prace ETL

Hadoop / Spark – rozproszone przetwarzanie równoległe

Mahout / ML-Lib – uczenie maszynowe

Teraz możesz używać R / Python na etapach pośrednich, ale zdasz sobie sprawę, że stają się wąskim gardłem w całym procesie. Jeśli masz do czynienia z prędkością danych:

Kafka / Storm – system o dużej przepustowości

Ludzie próbują tutaj R / Python, ale znowu zależy to od rodzaju paralelizmu, który chcesz i złożoności modelu. Jeśli model wymaga, aby najpierw wszystkie dane zostały przeniesione do pamięci, model nie powinien być złożony, ponieważ jeśli dane pośrednie są duże, kod ulegnie awarii. A jeśli myślisz o zapisaniu go na dysku, napotkasz dodatkowe opóźnienie, ponieważ odczyt / zapis dysku jest wolny w porównaniu z pamięcią RAM.

Wniosek

Zdecydowanie możesz używać Pythona w przestrzeni Big Data (zdecydowanie, ponieważ ludzie próbują z R, dlaczego nie Python), ale najpierw poznaj swoje dane i wymagania biznesowe. Mogą być dostępne lepsze narzędzia do tego samego i zawsze pamiętaj: Twoje narzędzia nie powinny określać, jak odpowiadasz na pytania. Twoje pytania powinny określić, jakich narzędzi używasz.

Python ma kilka bardzo dobrych narzędzi do pracy z dużymi zbiorami danych:

numpy

Tablice mapowane w pamięci Numpy umożliwiają dostęp do pliku zapisanego na dysku tak, jakby był to tablica. Tylko części tablicy, z którymi aktywnie pracujesz, muszą zostać załadowane do pamięci. Można go używać prawie tak samo, jak zwykłej tablicy.

h5py i pytables

Te dwie biblioteki zapewniają dostęp do plików HDF5. Pliki te umożliwiają dostęp tylko do części danych. Ponadto, dzięki bazowym bibliotekom używanym do uzyskiwania dostępu do danych, wiele operacji matematycznych i innych manipulacji danymi można wykonać bez ładowania ich do struktury danych Pythona. Możliwe są ogromne pliki o wysokiej strukturze, znacznie większe niż 5 TB. Umożliwia również płynną, bezstratną kompresję.

bazy danych

Istnieją różne typy baz danych, które umożliwiają przechowywanie dużych zbiorów danych i ładowanie tylko potrzebnych części. Wiele baz danych umożliwia wykonywanie manipulacji bez ładowania danych do struktury danych Pythona.

pandas

Umożliwia to wyższy poziom dostępu do różnych typów danych, w tym danych HDF5, plików csv, baz danych, a nawet stron internetowych. W przypadku dużych zbiorów danych zapewnia otoki wokół dostępu do plików HDF5, które ułatwiają analizę zbiorów dużych zbiorów danych.

mpi4py

Jest to narzędzie do uruchamiania kodu Pythona w sposób rozproszony na wielu procesorach lub nawet na wielu komputerach. Pozwala to na jednoczesną pracę nad częściami danych.

dask

Dostarcza wersję normalnej tablicy numpy, która obsługuje wiele normalnych operacji numpy w sposób wielordzeniowy, który może pracować na danych zbyt dużych, aby zmieściły się w pamięci.

blaze

Narzędzie zaprojektowane specjalnie dla dużych zbiorów danych. Jest to w zasadzie opakowanie wokół powyższych bibliotek, zapewniające spójne interfejsy dla różnych metod przechowywania dużych ilości danych (takich jak HDF5 lub bazy danych) oraz narzędzia ułatwiające manipulowanie, wykonywanie operacji matematycznych i analizowanie danych, które jest zbyt duży, aby zmieścić się w pamięci.

[42][Data Mining]

Mówiąc koncepcyjnie, eksplorację danych można traktować jako jeden element (lub zestaw umiejętności i zastosowań) w zestawie narzędzi naukowca zajmującego się danymi. Mówiąc dokładniej, eksploracja danych to czynność polegająca na poszukiwaniu wzorców w dużych, złożonych zestawach danych. Zwykle kładzie nacisk na techniki algorytmiczne, ale może również obejmować dowolny zestaw powiązanych umiejętności, aplikacji lub metodologii służących temu celowi. W mowie potocznej w języku amerykańsko-angielskim eksploracja danych i gromadzenie danych są często używane zamiennie. Jednak główną różnicą między tymi dwoma powiązanymi działaniami jest celowość.

PYTANIA:

Grupowanie K-średnich dla mieszanych danych liczbowych i jakościowych

Mój zestaw danych zawiera szereg atrybutów liczbowych i jeden kategoryczny. Powiedz, NumericAttr1, NumericAttr2, …, NumericAttrN, CategoricalAttr, gdzie CategoricalAttr przyjmuje jedną z trzech możliwych wartości: CategoricalAttrValue1, CategoricalAttrValue2 lub CategoricalAttrValue3. Używam domyślnej implementacji algorytmu klastrowania k-średnich dla Octave https://blog.west.uni-koblenz.de/2012-07-14/a-working-k-means-code-for-octave/. Działa tylko z danymi liczbowymi. Więc moje pytanie: czy podzielenie atrybutu kategorialnego CategoricalAttr na trzy zmienne numeryczne (binarne), takie jak IsCategoricalAttrValue1, IsCategoricalAttrValue2, IsCategoricalAttrValue3, jest poprawne?

Standardowy algorytm k-średnich nie ma bezpośredniego zastosowania do danych kategorialnych z różnych powodów. Przestrzeń próbna dla danych kategorycznych jest dyskretna i nie ma naturalnego pochodzenia. Funkcja odległości euklidesowej w takiej przestrzeni nie ma większego znaczenia. Jak ktoś to ujął: „Fakt, że wąż nie ma ani kół, ani nóg, nie pozwala nam nic powiedzieć o względnej wartości kół i nóg”. (stąd) Istnieje odmiana k-średnich znanych jako k-modów, wprowadzona w tym artykule przez Zhexue Huang, która jest odpowiednia dla danych jakościowych. Zwróć uwagę, że otrzymane rozwiązania są wrażliwe na warunki początkowe, jak omówiono na przykład tutaj (PDF). Praca Huanga (do której link znajduje się powyżej) zawiera również sekcję o „k-protoypes”, która dotyczy danych z połączeniem cech jakościowych i liczbowych. Używa miary odległości, która łączy odległość Hamminga dla cech kategorialnych i odległość euklidesową dla cech numerycznych. Wyszukiwanie w Google „mieszanki k-średnich danych kategorialnych” prowadzi do pojawienia się kilku nowszych artykułów na temat różnych algorytmów grupowania k-średnich z mieszanką danych jakościowych i liczbowych. (Jeszcze ich nie czytałem, więc nie mogę komentować ich zalet). Właściwie to, co sugerujesz (konwersja atrybutów kategorialnych na wartości binarne, a następnie wykonywanie k-średnich tak, jakby były to wartości liczbowe) jest innym podejściem, które został wypróbowany wcześniej (przed trybami k). Ale uważam, że podejście kmodes jest preferowane z powodów, które wskazałem powyżej.

Moim zdaniem istnieją rozwiązania umożliwiające radzenie sobie z danymi kategorycznymi w grupowanie. R ma określoną odległość dla danych kategorycznych. Odległość ta nazywa się Gower (http: //www.insider. Org / packages / cran / StatMatch / docs / gower.dist) i działa całkiem dobrze.

Grupowanie danych klientów przechowywanych w ElasticSearch

Mam kilka profili klientów przechowywanych w klastrze Flexiblesearch. Te profile są teraz używane do tworzenia grup docelowych dla naszych subskrypcji e-mailowych. Grupy docelowe są teraz tworzone ręcznie za pomocą funkcji wyszukiwania aspektowego elastycznego wyszukiwania (np. Pozyskiwanie wszystkich klientów płci męskiej w wieku 23 lat z jednym samochodem i trojgiem dzieci). Jak mogę automatycznie wyszukiwać interesujące grupy – przy użyciu nauki o danych, maszynowe uczenie, tworzenie klastrów czy coś innego? R język programowania wydaje się być dobrym narzędziem do tego zadania, ale nie potrafię sformułować metodologii takiego wyszukiwania grupowego. Jednym z rozwiązań jest jakoś wyszukanie największych klastrów klientów i wykorzystanie ich jako grup docelowych, więc pytanie brzmi: jak mogę automatycznie wybrać największe skupiska podobnych klientów (podobnych przez parametry, których w tej chwili nie znam)?

Na przykład: mój program połączy się z elastyczną wyszukiwarką, przeładuje dane klientów do CSV i używając skryptu języka R wykryje, że duża część klientów to mężczyźni bez dzieci, a kolejna duża część klientów ma samochód i ma brązowe oczy.

Jednym z algorytmów, który może być użyty do tego jest algorytm grupowania k-średnich. Gruntownie:

  1. Losowo wybierz k punktów danych ze swojego zestawu, m_1,…, m_k.
  2. „Do konwergencji”:
  3. Przypisz punkty danych do k klastrów, gdzie klaster i to zbiór punktów, dla których m_i jest najbliższą z twoich aktualnych średnich
  4. Zastąp każde m_i średnią wszystkich punktów przypisanych do klastra i.

Dobrą praktyką jest kilkakrotne powtórzenie tego algorytmu, a następnie wybranie wyniku, który minimalizuje odległości między punktami każdego klastra i a środkiem m_i. Oczywiście musisz znać k, aby zacząć tutaj; możesz jednak użyć weryfikacji krzyżowej, aby wybrać ten parametr.

Jakie są dobre źródła, aby dowiedzieć się o Bootstrap?

Myślę, że Bootstrap może być przydatny w mojej pracy, w której mamy wiele zmiennych, których nie znamy w dystrybucji. Zatem symulacje mogą pomóc. Jakie są dobre źródła, aby dowiedzieć się o Bootstrap / innych przydatnych metodach symulacji?

Czy maszyny obsługujące wektorów są nadal uważane za „najnowocześniejsze” w swojej niszy?

To pytanie jest odpowiedzią na komentarz, który widziałem na temat innego pytania.

Komentarz dotyczył programu nauczania uczenia maszynowego na Coursera i stwierdzał, że „maszyny SVM nie są obecnie tak często używane”. Właśnie skończyłem osobiście odpowiednie wykłady i rozumiem, że maszyny SVM są solidnym i wydajnym algorytmem uczenia się do klasyfikacji, a gdy używam jądra, mają one „niszę” obejmującą wiele funkcji, być może od 10 do 1000 i liczba próbek szkoleniowych może wynosić od 100 do 10 000. Ograniczenie dotyczące próbek uczących wynika z tego, że podstawowy algorytm obraca się wokół optymalizacji wyników generowanych z macierzy kwadratowej o wymiarach opartych na liczbie próbek uczących, a nie liczbie oryginalnych cech.

Czy komentarz, który widziałem, odnosi się do jakiejś prawdziwej zmiany od czasu wprowadzenia kursu, a jeśli tak, jaka to zmiana: nowy algorytm, który obejmuje również „sweet spot” SVM, lepsze procesory, co oznacza, że ​​zalety obliczeniowe SVM nie są tak dużo warte ? A może taka jest opinia lub osobiste doświadczenie komentującego? Próbowałem wyszukać np. „Są z mody maszynami wektorów nośnych” i nie stwierdzili, że nic nie sugeruje, że zostały porzucone na rzecz czegokolwiek innego.

A Wikipedia ma to: http://en.wikipedia.org/wiki/Support_vector_machine#Issues

… Głównym punktem spornym wydaje się być trudność w interpretacji modelu. Co sprawia, że ​​SVM jest odpowiedni dla silnika przewidującego czarną skrzynkę, ale nie jest tak dobry do generowania spostrzeżeń. Nie uważam tego za poważny problem, tylko kolejną drobną rzecz, którą należy wziąć pod uwagę przy wyborze odpowiedniego narzędzia do pracy (wraz z charakterem danych szkoleniowych i zadaniem edukacyjnym itp.).

SVM to potężny klasyfikator. Ma kilka fajnych zalet (które, jak sądzę, przyczyniły się do jego popularności)… Są to:

Wydajność: Tylko wektory pomocnicze odgrywają rolę w określaniu granicy klasyfikacji. Wszystkie inne punkty z zestawu treningowego nie muszą być przechowywane w pamięci. Tak zwana moc jądra: dzięki odpowiednim jądrom można przekształcić przestrzeń cech w wyższy wymiar, tak aby stała się liniowo rozdziela. Pojęcie jądra działa z dowolnymi obiektami, na których można zdefiniować pewne pojęcie podobieństwa za pomocą iloczynów wewnętrznych… a zatem maszyny SVM mogą klasyfikować dowolne obiekty, takie jak drzewa, wykresy itp. Istnieją również pewne istotne wady. Czułość parametrów: wydajność jest bardzo wrażliwa na wybór parametru regularyzacji C, co pozwala na pewną wariancję w modelu. Dodatkowy parametr dla jądra Gaussa: promień jądra Gaussa może mieć znaczący wpływ na dokładność klasyfikatora. Zazwyczaj w celu znalezienia optymalnych parametrów należy przeprowadzić przeszukiwanie sieci. LibSVM obsługuje wyszukiwanie w siatce. Maszyny SVM generalnie należą do klasy „rzadkich maszyn jądra”. Rzadkie wektory w przypadku SVM są wektorami pomocniczymi, które są wybierane z kryterium maksymalnego marginesu. Inne rzadkie maszyny wektorowe, takie jak maszyna wektorów istotności (RVM), działają lepiej niż SVM. Poniższy rysunek przedstawia porównawczą wydajność obu. Na rysunku oś x przedstawia jednowymiarowe dane z dwóch klas y = {0,1}. Model mieszaniny jest zdefiniowany jako P (x | y = 0) = Unif (0,1) i P (x | y = 1) = Unif (.5,1,5) (Unif oznacza rozkład równomierny). Z tej mieszaniny pobrano próbki 1000 punktów i zastosowano SVM i RVM do oszacowania późniejszego. Problem SVM polega na tym, że przewidywane wartości są dalekie od prawdziwych log kursów.

Bardzo skutecznym klasyfikatorem, który jest obecnie bardzo popularny, jest Losowy Las. Główne zalety to:

* Tylko jeden parametr do dostrojenia (tj. Liczba drzew w lesie)

* Brak całkowitej wrażliwości na parametry

* Można łatwo rozszerzyć na wiele klas

* Opiera się na zasadach probabilistycznych (maksymalizacja wzajemnego uzyskiwania informacji za pomocą drzew decyzyjnych)

Dane handlowe NASDAQ

Próbuję znaleźć dane giełdowe do ćwiczenia, czy jest na to dobry zasób? Znalazłem to: ftp://emi.nasdaq.com/ITCH/, ale ma tylko bieżący rok. Mam już sposób parsowania protokołu, ale chciałbym mieć więcej danych do porównania. Nie musi być w tym samym formacie, o ile zawiera statystyki dotyczące cen, transakcji i dat.

Możesz bardzo łatwo pobrać dane giełdowe w Pythonie i R (prawdopodobnie również w innych językach) za pomocą następujących pakietów: W pythonie za pomocą: https://pypi.python.org/pypi/ystockquote To także bardzo fajny samouczek w iPythonie, który pokazuje, jak pobrać dane giełdowe i bawić się nimi: http://nbviewer.ipython.org/github/twiecki/financial-analysis-pythontutorial/ blob / master / 1.% 20Pandas% 20Basics.ipynb

W R z: http://www.quantmod.com/HTH.

 Jaki jest pożytek z gromadzenia danych użytkowników oprócz wyświetlania reklam?

Cóż, to wygląda na najbardziej odpowiednie miejsce na to pytanie. Każda witryna internetowa gromadzi dane użytkownika, niektóre tylko ze względu na użyteczność i personalizację, ale większość, podobnie jak sieci społecznościowe, śledzi każdy ruch w sieci, niektóre bezpłatne aplikacje na telefonie skanują wiadomości tekstowe, historię połączeń i tak dalej. Całe to pobieranie danych służy tylko do sprzedaży Twojego profilu reklamodawcom?

Kilka dni temu programiści z jednej firmy produktowej zapytali mnie, jak mogą zrozumieć, dlaczego nowi użytkownicy opuszczają ich witrynę. Moje pierwsze pytanie dotyczyło tego, jak wyglądały profile tych użytkowników i czym się różniły od tych, którzy zostali. Reklama to tylko szczyt góry lodowej. Profile użytkowników (wypełniane przez samych użytkowników lub obliczane na podstawie zachowania użytkowników) zawierają informacje o: kategoriach użytkowników, tj. Jakiego rodzaju ludzie mają tendencję do korzystania z portrety klientów w Twojej witrynie / produkcie, tj. Kto jest bardziej skłonny do korzystania z komponentu UX usług płatnych wydajność, np ile czasu zajmuje ludziom znalezienie przycisku, którego potrzebują, porównanie skuteczności działania, np. co było bardziej wydajne – niższa cena na weekend lub proponowanie prezentów przy każdym zakupie itp. Chodzi więc bardziej o ulepszenie produktu i poprawę wrażeń użytkownika, niż o sprzedawanie tych danych reklamodawcom.

Większość firm nie będzie sprzedawać danych, w każdym razie nie na małą skalę. Większość użyje go wewnętrznie. Dane śledzenia użytkowników są ważne dla zrozumienia wielu rzeczy. Istnieją podstawowe testy A / B, w których zapewniasz różne doświadczenia, aby zobaczyć, który jest bardziej skuteczny. Jest

zrozumienie, w jaki sposób używany jest interfejs użytkownika. Kategoryzowanie użytkowników końcowych na różne sposoby z różnych powodów. Dowiedzieć się, gdzie znajduje się Twoja baza użytkowników końcowych oraz w ramach tej grupy, gdzie znajdują się ważni użytkownicy końcowi. Korelowanie doświadczeń użytkowników z aktualizacjami sieci społecznościowych.

Dowiedz się, co przyciągnie ludzi do Twojego produktu i co ich odstrasza. Lista potencjalnych projektów eksploracji i analizy danych może trwać kilka dni. Przechowywanie danych jest tanie. Jeśli śledzisz wszystko poza bramą, możesz później dowiedzieć się, co chcesz zrobić z tymi danymi. Skanowanie wiadomości tekstowych jest szkicowym obszarem, gdy nie ma ku temu dobrego powodu. Nawet jeśli istnieje dobry powód, jest to szkicowy obszar. Chciałbym powiedzieć, że nikt tego nie robi, ale zdarzały się sytuacje, w których robiły to duże firmy i jest wiele przypadków, w których aplikacje bez nazwy przynajmniej wymagają dostępu do tego rodzaju danych do instalacji. Jako konsument generalnie marszczę brwi na tego typu rzeczy, ale analityk danych we mnie chciałby zobaczyć, czy mogę zbudować cokolwiek pożytecznego z takiego zestawu informacji.

Oto praktyczny przykład wykorzystania danych internetowych do celów innych niż reklama. Distil Networks (zastrzeżenie, tam pracuję) wykorzystuje ruch sieciowy do określania, czy dostęp do stron pochodzi od ludzi, czy przez boty – skrobaki, fałszywe kliknięcia, spam itp. Innym przykładem jest część pracy wykonywanej przez Webtrends. Pozwalają użytkownikom witryny zbudować model dla każdego odwiedzającego, aby przewidzieć, czy odejdzie, kupi, doda do koszyka itp. Następnie na podstawie prawdopodobieństwa każdego działania możesz zmienić doświadczenie użytkownika (np. Jeśli zamierzają odejść , daj im kupon).

Dlaczego kilka typów modeli może dawać prawie identyczne wyniki?

Analizowałem zbiór danych zawierający ~ 400 tys. Rekordów i 9 zmiennych. Zmienna zależna jest binarna. Dopasowałem regresję logistyczną, drzewo regresji, losowy las i drzewo wzmocnione gradientem. Wszystkie z nich dają wirtualnie identyczną wartość dopasowania liczb, kiedy sprawdzam poprawność

je na innym zestawie danych. Dlaczego tak jest? Zgaduję, że to dlatego, że stosunek moich obserwacji do zmiennych jest tak wysoki. Jeśli to prawda, przy jakim stosunku obserwacji do zmiennej zaczną dawać różne modele, różne wyniki?

Oznacza to, że niezależnie od zastosowanej metody, jesteś w stanie zbliżyć się do optymalnej reguły decyzyjnej (czyli reguły Bayesa). Podstawowe przyczyny zostały wyjaśnione w „Elements of Statistical Learning” Hastiego, Tibshirani i Friedmana. Nie sądzę, aby wyjaśnieniem było stosunek obserwacji do zmiennej. W świetle mojego uzasadnienia przedstawionego powyżej, jest to stosunkowo prosta forma granicy oddzielającej twoje klasy w wielowymiarowej przestrzeni, którą wszystkie metody, które wypróbowałeś, były w stanie zidentyfikować.

Warto też przyjrzeć się błędom treningowym. w zasadzie nie zgadzam się z twoją analizą. jeśli regresja logistyczna itp. daje te same wyniki, sugerowałoby to, że „najlepszy model” jest bardzo prosty (że wszystkie modele mogą być równie dobrze dopasowane – np. zasadniczo liniowe). Zatem pytanie może brzmieć, dlaczego najlepszy model jest prostym modelem?: Może to sugerować, że twoje zmienne nie są zbyt predykcyjne. Oczywiście trudno jest analizować bez znajomości danych.

K-oznacza: Jakie są dobre sposoby wyboru wydajnego zestawu początkowych centroid?

Gdy używana jest losowa inicjalizacja centroidów, różne przebiegi K-średnich wytwarzają różne całkowite SSE. I ma to kluczowe znaczenie dla działania algorytmu. Jakie są skuteczne podejścia do rozwiązania tego problemu? Doceniane są najnowsze podejścia.

Podejście, które daje bardziej spójne wyniki, to K-średnie ++. Podejście to potwierdza, że ​​istnieje prawdopodobnie lepszy wybór początkowych lokalizacji centroid niż zwykłe losowe przypisanie. W szczególności K-środki mają tendencję do lepszych wyników, gdy centroidy są wysiewane w taki sposób, że nie zlepiają ich razem w przestrzeni.

Krótko mówiąc, metoda jest następująca:

  1. Wybierz losowo jeden ze swoich punktów danych jako początkowy centroid.
  2. Oblicz D(x), odległość między twoim początkowym centroidem a wszystkimi innymi punktami danych, x.
  3. Wybierz następny centroid z pozostałych punktów danych z prawdopodobieństwem proporcjonalnym do D(x)2
  4. Powtarzaj, aż wszystkie centroidy zostaną przypisane.

Uwaga: D(x) należy aktualizować w miarę dodawania większej liczby centroid. Powinna to być odległość między punktem danych a najbliższą centroidą.

Możesz być również zainteresowany przeczytaniem tego artykułu, w którym zaproponowano metodę i opisano jej ogólne oczekiwane działanie.

Mogę źle zrozumieć twoje pytanie, ale zwykle k-średnie wybiera dla ciebie twoje centroidy losowo w zależności od liczby ustawionych klastrów (tj. K). Wybór liczby dla k wydaje się być ćwiczeniem subiektywnym.

Typowe podejście do tego problemu polega na kilkukrotnym ponownym uruchomieniu algorytmu K-średnich, z różnymi losowymi inicjalizacjami centroidów i pozostawieniu najlepszego rozwiązania. Możesz to zrobić, oceniając wyniki na swoich danych szkoleniowych lub za pomocą weryfikacji krzyżowej. Istnieje wiele innych sposobów inicjalizacji centroidów, ale żaden z nich nie będzie działał najlepiej dla każdego problemu. Możesz ocenić te podejścia wraz z losową inicjalizacją dla konkretnego problemu.

Jakie badania można przeprowadzić przy użyciu zestawu danych e-mail?

Znalazłem zestaw danych o nazwie Enron Email Dataset. Jest to prawdopodobnie jedyny znaczący zbiór „prawdziwych” e-maili, który jest dostępny publicznie. Znalazłem wcześniejszą analizę tej pracy: artykuł opisujący dane Enron został przedstawiony na konferencji CEAS w 2004 roku. Niektóre eksperymenty związane z tymi danymi opisano w domu Rona Bekkermana, strona Parakweet wydała otwarty zestaw danych dotyczących zdań Enron, oznaczonych jako akty mowy. Praca na University of Pennsylvania obejmuje zbiór danych zapytań do wyszukiwania wiadomości e-mail, a także narzędzie do generowania błędów ortograficznych w oparciu o korpus Enron. Szukam interesujących, aktualnych tematów do pracy. Proszę, daj mi kilka sugestii.

Uczysz się, prawda? Spróbuj znaleźć coś łatwego i interesującego na początek. Może zaczniesz od czegoś prostego, na przykład od zbudowania modelu Bayesa, aby przewidzieć, które e-maile zostaną usunięte. Powinieneś rzucić okiem na te usunięte e-maile, czy to spam? czy to tylko śmieci? Tutaj masz po prostu nadzorowany model, w którym zestaw danych już oznacza e-maile dla Ciebie (usunięte lub nie). Pomyśl o czymś prostym, takim jak słowa, tytuły, długość wiadomości e-mail itp. Sprawdź, czy możesz zbudować model przewidujący usunięcie wiadomości e-mail.

Poniżej przedstawiono niektóre badania, które można przeprowadzić na zestawie danych poczty e-mail:

analiza lingwistyczna w celu określenia skrótu wiadomości e-mail Kategoryzuj wiadomości e-mail jako spam / hamowanie przy użyciu technik uczenia maszynowego. identyfikowanie pojęć wyrażonych w zbiorze wiadomości e-mail i organizowanie ich w ontologię lub taksonomię do przeglądania

Wspaniały zbiór danych z wieloma możliwościami udoskonalenia umiejętności analizy tekstu! Moją pierwszą myślą byłoby wypróbowanie modelowania tematycznego na zbiorze danych. Jeśli używasz języka Python, istnieje biblioteka, której użyłem, o nazwie gensim, która zawiera dość dokładne samouczki ułatwiające rozpoczęcie pracy. Mój przyjaciel zrobił coś podobnego ze zbiorem danych Enron, używając równoległego przetwarzania wstępnego i rozproszonej, ukrytej alokacji Dirichleta do wnioskowania tematów w korpusie e-maili.

Skrobanie stron internetowych LinkedIn

Niedawno odkryłem nowy pakiet R do łączenia się z interfejsem API LinkedIn. Niestety API LinkedIn wydaje się dość ograniczone na początku; na przykład można uzyskać tylko podstawowe dane o firmach i to jest oddzielone od danych o osobach. Chcę uzyskać dane o wszystkich pracownikach danej firmy, które możesz zrobić ręcznie na stronie ale nie jest to możliwe za pośrednictwem interfejsu API. import.io byłby idealny, gdyby rozpoznał paginację LinkedIn (patrz koniec strony). Czy ktoś zna jakieś narzędzia do skrobania sieci lub techniki mające zastosowanie do obecnego formatu strony LinkedIn lub sposoby naginania API w celu przeprowadzenia bardziej elastycznej analizy? Najlepiej w R lub w Internecie, ale z pewnością otwarte na inne podejścia.

Beautiful Soup jest specjalnie zaprojektowana do indeksowania i skrobania stron internetowych, ale została napisana dla języka Python, a nie R:

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

Odpowiedź od itdxer Scrapy to świetna biblioteka Pythona, która może pomóc Ci szybciej zeskrobać różne witryny i ulepszyć strukturę kodu. Nie wszystkie witryny można analizować za pomocą klasycznych narzędzi, ponieważ mogą one wykorzystywać dynamiczne tworzenie treści JS. Do tego zadania lepiej jest użyć Selenium (jest to framework do testowania stron internetowych, ale także świetne narzędzie do skrobania stron internetowych). Dla tej biblioteki jest też dostępna paczka Pythona. W Google możesz znaleźć kilka sztuczek, które pomogą Ci używać Selenium inside Scrapy i sprawić, że Twój kod będzie przejrzysty, uporządkowany i możesz używać kilku świetnych narzędzi do biblioteki Scrapy. Myślę, że Selenium byłby lepszym skrobakiem dla Linkedina niż klasyczne narzędzia. Jest dużo javascript i dynamicznej zawartości. Ponadto, jeśli chcesz dokonać uwierzytelnienia na swoim koncie i zeskrobać całą dostępną zawartość, będziesz mieć wiele problemów z klasycznym uwierzytelnianiem przy użyciu prostych bibliotek, takich jak żądania lub urllib.

Usługi internetowe do wyszukiwania sieci społecznościowej?

Czy istnieją usługi internetowe, które można wykorzystać do analizy danych w sieciach społecznościowych w odniesieniu do konkretnego pytania badawczego (np. Wzmianki o niektórych produktach w dyskusjach w mediach społecznościowych)?

Interfejs API Twittera jest jednym z najlepszych źródeł danych z sieci społecznościowych. Możesz wyodrębnić z Twittera prawie wszystko, co możesz sobie wyobrazić, potrzebujesz tylko konta i identyfikatora programisty. Dokumentacja jest dość obszerna, więc pozwolę ci się nią poruszać. https://dev.twitter.com/overview/documentation

Jak zwykle istnieją opakowania, które ułatwiają życie.

* python-twitter

*Twitter

Istnieją również firmy, które oferują za opłatą szczegółowe analizy Twittera i historyczne zbiory danych.

* Gnip

* Datasift

Sprawdź je!

Tweepy to jedna z najlepszych bibliotek do analizowania i hakowania za pomocą Twitter API. (Będąc współtwórcą tweepy, mogę ręczyć za jego stabilność i jakość) W przypadku opakowania w języku Python dla interfejsu Facebook Graph API możesz skorzystać z biblioteki Facebook-Insights, która jest dobrze utrzymaną i schludną dokumentacją. Istnieją usługi, które mogą wydobywać informacje, ale są one ograniczone do złożoności zapytania. Na przykład: „Ile osób tweetowało o bananie w poniedziałek?” można odpowiedzieć na podstawie istniejących narzędzi „Ile osób szczęśliwych ludzi napisało na Twitterze w poniedziałek o bananie”, ale wymagałoby to więcej wysiłku, a oprogramowanie lub narzędzie powinno być w stanie wykryć emocje. Tak więc, jeśli interesujesz się badaniami, radziłbym skorzystać z API i starego dobrego programowania!

Co to jest powtarzający się podgraf ciężki?

Niedawno w przemówieniu natknąłem się na ten termin powtarzający się ciężki podgraf. Wygląda na to, że nie rozumiem, co to znaczy, a Google nie wydaje żadnych dobrych wyników. Czy ktoś może szczegółowo wyjaśnić, co to oznacza.

Termin najlepiej można wyrazić jako powtarzający się, ciężki podgraf. To znaczy podgraf, który jest jednocześnie powtarzalny i ciężki. Ciężkość podgrafu odnosi się do mocno połączonych wierzchołków – czyli węzłów, które są połączone wielokrotnie („wiele” odnosi się do danej sieci). Powtarzalność odnosi się do skłonności podgrafu do występowania więcej niż jeden raz. Zatem powtarzający się ciężki podgraf jest gęsto połączonym zestawem wierzchołków, który występuje kilka razy w całej sieci. Podgrafy te są często używane do określania właściwości sieci. Na przykład: w sieci interakcji e-mailowych w firmie zorganizowanej w 4-osobowe zespoły, w których jeden członek pełni rolę lidera, aktywność e-mailową każdego zespołu (jeśli wysyłają e-maile między sobą na tyle, że można ich uznać za „ciężką”) można opisać jako ciężkie Podgraf. Fakt, że te podgrafy występują wielokrotnie w sieci, czyni je powtarzającymi się ciężkimi podgrafami. Gdyby ktoś szukał struktury w sieci, zauważenie, że istnieją te powtarzające się, ciężkie podgrafy, znacznie przyczyniłoby się do określenia organizacji sieci jako całości

[41][Klasyfikacja]

PYTANIA:

Używając SVM jako klasyfikatora binarnego, czy etykieta punktu danych jest wybierana w drodze konsensusu?

Uczę się maszyn wektorów pomocniczych i nie jestem w stanie zrozumieć, w jaki sposób jest wybierana etykieta klasy dla punktu danych w klasyfikatorze binarnym. Czy jest wybierany w drodze konsensusu w odniesieniu do klasyfikacji w każdym wymiarze oddzielającej hiperpłaszczyzny?

ODPOWIEDZI:

Termin konsensus, o ile mi wiadomo, jest używany raczej w przypadkach, gdy masz więcej niż jedno źródło miernika / miary / wybór, na podstawie którego możesz podjąć decyzję. Aby wybrać możliwy wynik, wykonujesz średnią ocenę / konsensus dla dostępnej wartości. Nie dotyczy to SVM. Algorytm opiera się na optymalizacji kwadratowej, która maksymalizuje odległość od najbliższych dokumentów dwóch różnych klas, wykorzystując hiperpłaszczyznę do wykonania podziału.

Tak więc jedynym konsensusem tutaj jest wynikowa hiperpłaszczyzna, obliczona na podstawie najbliższych dokumentów każdej klasy. Innymi słowy, klasy są przypisywane do każdego punktu poprzez obliczenie odległości od punktu do wyprowadzonej hiperpłaszczyzny. Jeśli odległość jest dodatnia, należy do określonej klasy, w przeciwnym razie należy do drugiej.

Wybierz algorytm klasyfikacji binarnej

Mam problem z klasyfikacją binarną:

* Około 1000 próbek w zestawie treningowym

* 10 atrybutów, w tym binarne, liczbowe i kategorialne

Który algorytm jest najlepszy do tego typu problemu?

Domyślnie zacznę od SVM (wstępna konwersja nominalnych wartości atrybutów na cechy binarne), ponieważ jest uważana za najlepszą dla stosunkowo czystych i niezakłóconych danych.

Trudno powiedzieć, nie wiedząc trochę więcej o swoim zbiorze danych i o tym, jak można go rozdzielić na podstawie wektora cech, ale prawdopodobnie sugerowałbym użycie ekstremalnego lasu losowego zamiast standardowych lasów losowych z powodu stosunkowo małego zestawu próbek. Ekstremalnie losowe lasy są bardzo podobne do standardowych lasów losowych z jednym wyjątkiem, że zamiast optymalizować podziały na drzewach, ekstremalnie losowe lasy powodują podziały losowo. Początkowo może się to wydawać negatywne, ale ogólnie oznacza to, że masz znacznie lepsze uogólnienie i szybkość, chociaż AUC na twoim zestawie treningowym jest prawdopodobnie być trochę gorszym. Regresja logistyczna jest również całkiem solidnym zakładem dla tego rodzaju zadań, chociaż przy waszej stosunkowo małej wymiarowości i małej wielkości próby obawiałbym się nadmiernego dopasowania. Możesz chcieć sprawdzić za pomocą K-Nearest Neighbors, ponieważ często działa bardzo dobrze przy małych wymiarach, ale zwykle nie radzi sobie zbyt dobrze ze zmiennymi kategorialnymi. Gdybym miał wybrać jeden, nie wiedząc więcej o problemie, z pewnością postawiłbym swoje zakłady na skrajnie losowy las, ponieważ jest bardzo prawdopodobne, że da ci dobre uogólnienie na tego rodzaju zestawach danych, a także lepiej radzi sobie z połączeniem danych liczbowych i kategorycznych niż większość innych metod.

W przypadku niskich parametrów, dość ograniczona wielkość próbki i regresja logistyczna klasyfikatora binarnego powinna być wystarczająco potężna. Możesz użyć bardziej zaawansowanego algorytmu, ale prawdopodobnie jest to przesada.

Gdy w mieszance są zmienne kategorialne, sięgam po Lasy losowych decyzji, ponieważ obsługuje ona zmienne kategorialne bezpośrednio, bez transformacji kodowania 1 z n. To powoduje utratę mniej informacji.

Personalizacja na dużą skalę – na użytkownika a modele globalne

Obecnie pracuję nad projektem, który skorzystałby na spersonalizowanych prognozach. Biorąc pod uwagę dokument wejściowy, zestaw dokumentów wyjściowych i historię zachowań użytkowników, chciałbym przewidzieć, które z dokumentów wyjściowych zostaną kliknięte. Krótko mówiąc, zastanawiam się, jakie jest typowe podejście do tego rodzaju problemu z personalizacją. Czy modele są szkolone dla każdego użytkownika, czy też pojedynczy model globalny bierze pod uwagę statystyki podsumowujące zachowanie użytkowników w przeszłości, aby pomóc w podjęciu decyzji? Modele na użytkownika nie będą dokładne, dopóki użytkownik nie będzie aktywny przez jakiś czas, podczas gdy większość modeli globalnych musi zostać ustalona jako wektor cech długości (co oznacza, że ​​musimy mniej więcej skompresować strumień przeszłych zdarzeń do mniejszej liczby statystyk podsumowujących).

Odpowiedź na to pytanie będzie się bardzo różnić w zależności od rozmiaru i charakteru danych. Na wysokim poziomie można by pomyśleć o tym jako o szczególnym przypadku modeli wielopoziomowych; masz możliwość oszacowania modelu z pełnym pulowaniem (czyli uniwersalnym modelem, który nie rozróżnia użytkowników), modelami bez pulowania (osobny model dla każdego użytkownika) i częściowo połączonymi modelami (mieszanka tych dwóch) . Jeśli jesteś zainteresowany, naprawdę powinieneś przeczytać Andrew Gelman na ten temat. Możesz również myśleć o tym jako o problemie związanym z uczeniem się do rangi, który albo próbuje wytworzyć punktowe oszacowania przy użyciu pojedynczej funkcji, albo zamiast tego próbuje zoptymalizować jakąś listową funkcję straty (np. NDCG). Podobnie jak w przypadku większości problemów związanych z uczeniem maszynowym, wszystko zależy od rodzaju posiadanych danych, ich jakości, rzadkości i rodzajów funkcji, które możesz z nich wyodrębnić. Jeśli masz powody, by sądzić, że każdy użytkownik będzie dość wyjątkowy w swoim zachowaniu, możesz chcieć zbudować model dla każdego użytkownika, ale będzie to nieporęczne szybkie – i co robisz, gdy masz do czynienia z nowy użytkownik?

Jakie metody klasyfikacyjne niezwiązane ze szkoleniem są dostępne?

Próbuję dowiedzieć się, które metody klasyfikacji, które nie wykorzystują fazy treningowej, są dostępne. Scenariusz jest klasyfikacją opartą na ekspresji genów, w której masz macierz ekspresji genów m genów (cech) i n próbek (obserwacje). Podaje się również podpis dla każdej klasy (jest to lista funkcji, które należy wziąć pod uwagę w celu zdefiniowania, do której klasy należy próbka). Aplikacja (nie będąca szkoleniem) jest metodą przewidywania najbliższego szablonu. W tym przypadku obliczana jest odległość cosinusowa między każdą próbką a każdą sygnaturą (na wspólnym zbiorze cech). Następnie każda próbka jest przypisywana do najbliższej klasy (porównanie próby z klasą skutkuje mniejszą odległością). W tym przypadku nie są potrzebne już sklasyfikowane próbki. Innym zastosowaniem (treningiem) jest metoda kNN, w której mamy zestaw już oznaczonych próbek. Następnie każda nowa próbka jest oznaczana w zależności od tego, jak oznaczono k najbliższych próbek. Czy istnieją inne metody niezwiązane z treningiem?

Pytasz o uczenie się oparte na instancjach. Metoda k-Nearest Neighbors (kNN) wydaje się być najpopularniejszą z tych metod i ma zastosowanie w wielu różnych dziedzinach problemowych. Innym ogólnym typem uczenia się opartego na instancjach jest modelowanie analogiczne, które wykorzystuje instancje jako przykłady do porównania z nowymi danymi.

Odniosłeś się do kNN jako aplikacji, która wykorzystuje szkolenie, ale to nie jest poprawne (wpis w Wikipedii, do którego jesteś podłączony, jest nieco mylący). Tak, istnieją „przykłady szkoleniowe” (oznaczone jako wystąpienia), ale klasyfikator nie uczy się / trenuje na podstawie tych danych. Są one raczej używane tylko wtedy, gdy rzeczywiście chcesz sklasyfikować nową instancję, dlatego jest ona uważana za „leniwego” ucznia. Zauważ, że metoda przewidywania najbliższego szablonu, o której wspominasz, jest formą kNN z k = 1 i odległością cosinusową jako miarą odległości.

Jestem początkującym w uczeniu maszynowym, więc wybaczcie mi ten prosty opis, ale wygląda na to, że możesz użyć modelowania tematycznego, takiego jak utajona analiza Dirichleta (LDA). Jest to algorytm szeroko stosowany do klasyfikowania dokumentów według tematów, których dotyczą, na podstawie znalezionych słów i względnej częstotliwości tych słów w całym korpusie. Poruszam to głównie dlatego, że w LDA nie ma potrzeby wcześniejszego definiowania tematów. Ponieważ strony pomocy w LDA są głównie napisane do analizy tekstu, analogia, której użyłbym, aby zastosować ją do twojego pytania, jest następująca: – Traktuj każdą ekspresję genu lub cechę jako “ słowo ” (czasami nazywane tokenem w typowe aplikacje do klasyfikacji tekstu LDA) – Traktuj każdą próbkę jak dokument (tj. zawiera zestaw słów lub wyrażeń genów) – Traktuj podpisy jako istniejące wcześniej tematy Jeśli się nie mylę, LDA powinno podać ważone prawdopodobieństwa dla każdego temat, jak mocno jest on obecny w każdym dokumencie.

 Jak zdefiniować niestandardową metodologię ponownego próbkowania

Używam projektu eksperymentalnego, aby przetestować solidność różnych metod klasyfikacji, a teraz szukam prawidłowej definicji takiego projektu. Tworzę różne podzbiory pełnego zbioru danych, wycinając kilka próbek. Każdy podzbiór jest tworzony niezależnie od innych. Następnie uruchamiam każdą metodę klasyfikacji na każdym podzbiorze. Na koniec oceniam dokładność każdej metody jako liczbę klasyfikacji podzbiorów zgodnych z klasyfikacją w pełnym zbiorze danych. Na przykład:

Classification-full 1 2 3 2 1 1 2

Classification-subset1 1 2 2 3 1

Classification-subset2 2 3 1 1 2…

Accuracy 1 1 1 1 0.5 1 1

Czy istnieje poprawna nazwa tej metodologii? Myślałem, że to może podlegać bootstrapowi, ale nie jestem tego pewien.

Losowe podpróbkowanie wydaje się odpowiednie, ładowanie początkowe jest nieco bardziej ogólne, ale także poprawne.

Wypaczone dane wieloklasowe

Mam zbiór danych zawierający ~ 100 000 próbek z 50 klas. Używam SVM z jądrem RBF do trenowania i przewidywania nowych danych. Problem polega jednak na tym, że zbiór danych jest wypaczony w kierunku różnych klas.

 Na przykład   Class 1 – 30 (~3% each), Class 31 – 45 (~0.6% each), Class 46 – 50 (~0.2% each)

Widzę, że model bardzo rzadko przewiduje klasy, które występują rzadziej w zbiorze uczącym, mimo że zbiór testowy ma taki sam rozkład klas jak zbiór uczący. Zdaję sobie sprawę, że istnieją techniki takie jak „undersampling”, w których klasa większości jest zmniejszana do klasy podrzędnej. Czy ma to jednak zastosowanie tutaj, gdzie jest tak wiele różnych klas? Czy istnieją inne metody, które pomogą rozwiązać ten przypadek?

Sugerowałbym użycie biblioteki libsvm, która ma już zaimplementowane regulowane wagi klas. Zamiast replikować próbki uczące, modyfikuje się parametr C dla różnych klas w optymalizacji SVM. Na przykład, jeśli twoje dane mają 2 klasy, a pierwsza klasa to tylko 10% danych, możesz wybrać wagi klas na 10 i 1 odpowiednio dla klasy 1 i 2. Dlatego naruszenia marginesów pierwszej klasy kosztowałyby 10 razy więcej niż naruszenia marginesów dla drugiej klasy, a dokładności dla poszczególnych klas byłyby bardziej zrównoważone.

Nie jestem ekspertem w używaniu maszyn SVM, ale zwykle (jeśli używasz biblioteki uczenia maszynowego, takiej jak scikit-learn Pythona lub libsvm w języku R, jest odpowiednio parametr class_weight lub class.weights. Lub jeśli używasz Bayesa klasyfikator, weźmiesz pod uwagę to „pochylenie” poprzez „wcześniejsze (klasowe) prawdopodobieństwa” P (ωj)

Podobieństwo cosinusowe a iloczyn skalarny jako metryki odległości

Wygląda na to, że podobieństwo cosinusowe dwóch cech jest po prostu ich iloczynem skalarnym skalowanym przez iloczyn ich wielkości. Kiedy podobieństwo cosinusowe jest lepszą miarą odległości niż iloczyn skalarny? To znaczy. Czy iloczyn skalarny i podobieństwo cosinusa mają różne mocne lub słabe strony w różnych sytuacjach?

Myśl geometrycznie. Podobieństwo cosinusowe dba tylko o różnicę kątów, podczas gdy iloczyn skalarny dba o kąt i wielkość. Jeśli znormalizujesz dane, aby miały tę samą wielkość, te dwa są nie do odróżnienia. Czasami pożądane jest zignorowanie wielkości, stąd podobieństwo cosinusowe jest dobre, ale jeśli wielkość odgrywa rolę, iloczyn skalarny byłby lepszy jako miara podobieństwa. Zwróć uwagę, że żaden z nich nie jest „miarą odległości”.

Masz rację, podobieństwo cosinusowe ma wiele wspólnego z iloczynem skalarnym wektorów. Rzeczywiście, jest to iloczyn skalarny skalowany według wielkości. Ze względu na skalowanie jest znormalizowany między 0 a 1. CS jest preferowane, ponieważ uwzględnia zmienność danych i względne częstotliwości cech. Z drugiej strony, zwykły iloczyn skalarny jest trochę „tańszy” (pod względem złożoności i implementacji).

Chciałbym dodać jeszcze jeden wymiar do odpowiedzi udzielonych powyżej. Zwykle używamy podobieństwa cosinusowego w przypadku dużego tekstu, ponieważ nie zaleca się używania macierzy odległości na akapitach danych. A także, jeśli zamierzasz, aby twoja klaster była szeroka, będziesz mieć tendencję do podobieństwa cosinusowego, ponieważ oddaje ogólne podobieństwo. Na przykład, jeśli masz teksty, które mają maksymalnie dwa lub trzy słowa, uważam, że użycie podobieństwa cosinusowego nie zapewnia precyzji, jaką uzyskuje się za pomocą metryki odległości.

Który typ weryfikacji krzyżowej najlepiej pasuje do problemu  klasyfikacji binarnej

Zbiór danych wygląda następująco:

25000 obserwacji do 15 predyktorów różnych typów: numeryczna, wieloklasowa jakościowa, binarna zmienna docelowa jest binarna Która metoda walidacji krzyżowej jest typowa dla tego typu problemów? Domyślnie używam K-Fold. Ile fałd wystarczy w tym przypadku? (Jednym z modeli, których używam, jest losowy las, który jest czasochłonny…)

Najlepsze wyniki osiągniesz, jeśli zechcesz zbudować fałdy tak, aby każda zmienna (a co najważniejsze zmienna docelowa) była w przybliżeniu identyczna w każdym fałdzie. Nazywa się to, w przypadku zastosowania do zmiennej docelowej, warstwowym k-krotnością. Jednym podejściem jest zgrupowanie danych wejściowych i upewnienie się, że każdy fałd zawiera taką samą liczbę wystąpień z każdego klastra, proporcjonalną do ich rozmiaru.

Myślę, że w twoim przypadku 10-krotne CV będzie OK. Myślę, że ważniejsze jest zrandomizowanie procesu walidacji krzyżowej niż wybranie idealnej wartości k. Powtórz więc proces CV kilka razy losowo i oblicz wariancję wyniku klasyfikacji, aby określić, czy wyniki są wiarygodne, czy nie.

Jaka jest różnica między klasyfikacją tekstu a modelami tematycznymi?

Znam różnicę między grupowaniem a klasyfikacją w uczeniu maszynowym, ale nie rozumiem różnicy między klasyfikacją tekstu a modelowaniem tematycznym dokumentów. Czy mogę użyć modelowania tematu na dokumentach, aby zidentyfikować temat? Czy mogę użyć metod klasyfikacji, aby sklasyfikować tekst w tych dokumentach?

Klasyfikacja tekstu

Daję ci kilka dokumentów, z których każdy ma dołączoną etykietę. Proszę was, abyście się dowiedzieli, dlaczego waszym zdaniem treść dokumentów otrzymała te etykiety na podstawie ich słów. Następnie daję Ci nowe dokumenty i pytam, jaka powinna być etykieta dla każdego z nich. Etykiety mają dla mnie znaczenie, niekoniecznie dla ciebie.

Modelowanie tematyczne

Daję ci kilka dokumentów bez etykiet. Proszę o wyjaśnienie, dlaczego dokumenty zawierają takie same słowa, jak te, które mają, poprzez wskazanie niektórych tematów, o których każdy „dotyczy”. Mówisz mi o tematach, mówiąc mi, ile z każdego z nich znajduje się w każdym dokumencie, a ja decyduję, jakie tematy

„Podły”, jeśli cokolwiek. Musiałbyś wyjaśnić, co ja, „określ jeden temat” lub „sklasyfikuj tekst”.

Ale nie wiem, jaka jest różnica między klasyfikacją tekstu a modelami tematycznymi w dokumentach Klasyfikacja tekstów jest formą nadzorowanego uczenia się – zestaw możliwych zajęć jest z góry znany / zdefiniowany i nie ulega zmianie. Modelowanie tematyczne jest formą uczenia się bez nadzoru (podobną do grupowania) – zbiór możliwych tematów to nieznane apriori. Są zdefiniowane jako część generowania modeli tematycznych. W przypadku niedeterministycznego algorytmu, takiego jak LDA, za każdym razem otrzymasz inne tematy uruchamiasz algorytm. Klasyfikacja tekstów często obejmuje wzajemnie wykluczające się klasy – należy je traktować jako zbiorniki. Ale nie musi – biorąc pod uwagę odpowiedni rodzaj oznaczonych danych wejściowych, można ustawić serię niewykluczających się wzajemnie klasyfikatorów binarnych. Modelowanie tematyczne generalnie nie wyklucza się wzajemnie – ten sam dokument może mieć rozkład prawdopodobieństwa rozłożony na wiele tematów. Ponadto istnieją hierarchiczne metody modelowania tematów itp. Czy mogę również użyć modelu tematu dla dokumentów, aby później zidentyfikować jeden temat. Czy mogę użyć klasyfikacji do sklasyfikowania tekstu w tych dokumentach? Jeśli pytasz, czy możesz wziąć wszystkie dokumenty przypisane do jednego tematu przez algorytm modelowania tematu, a następnie zastosować klasyfikator do tej kolekcji, to tak, z pewnością możesz to zrobić. Nie jestem jednak pewien, czy to ma sens – jako minimum musisz wybrać próg rozkładu prawdopodobieństwa tematu, powyżej którego uwzględnisz dokumenty w Twojej kolekcji (zwykle 0,05-0,1). Czy możesz rozwinąć swój przypadek użycia? Przy okazji, dostępny jest świetny samouczek dotyczący modelowania tematycznego przy użyciu biblioteki MALLET dla języka Java, dostępny tutaj: Pierwsze kroki z modelowaniem tematycznym i MALLET

Modele tematyczne są zwykle bez nadzoru. Istnieją również „nadzorowane modele tematyczne”; ale nawet wtedy próbują modelować tematy w ramach zajęć.

Na przykład. możesz mieć klasę „piłka nożna”, ale w ramach tej klasy mogą istnieć tematy związane z określonymi meczami lub drużynami. Wyzwanie związane z tematami polega na tym, że zmieniają się one w czasie; rozważ powyższy przykład meczów. Takie tematy mogą się pojawić i ponownie zniknąć.

Różnica między tf-idf i tf z Random Forests

Pracuję nad problemem klasyfikacji tekstu, używając Random Forest jako klasyfikatorów i podejścia bag-of-words. Używam podstawowej implementacji Random Forests (tej obecnej w scikit), która tworzy warunek binarny dla pojedynczej zmiennej przy każdym podziale. Biorąc to pod uwagę, czy istnieje różnica między używaniem prostych cech tf (częstotliwości terminów). gdzie każde słowo ma przypisaną wagę, która reprezentuje liczbę wystąpień w dokumencie lub tf-idf (częstotliwość terminu * odwrotna częstotliwość dokumentu), gdzie częstotliwość terminu jest również mnożona przez wartość, która reprezentuje stosunek całkowitej liczby dokumentów i liczbę dokumentów zawierających słowo)? Moim zdaniem nie powinno być żadnej różnicy między tymi dwoma podejściami, ponieważ jedyną różnicą jest współczynnik skalowania na każdej funkcji, ale ponieważ podział odbywa się na poziomie pojedynczych cech, nie powinno to robić różnicy.

Czy mam rację w swoim rozumowaniu?

Drzewa decyzyjne (a tym samym losowe lasy) są niewrażliwe na monotoniczne przekształcenia cech wejściowych. Ponieważ mnożenie przez ten sam współczynnik jest monotonną transformacją, założyłbym, że w przypadku Losowych Lasów rzeczywiście nie ma różnicy. Jednak w końcu możesz rozważyć użycie innych klasyfikatorów, które nie mają tej właściwości, więc nadal może mieć sens użycie całego TF * IDF.

Klasyfikacja dokumentów: tf-idf przed czy po filtrowaniu funkcji?

Mam projekt klasyfikacji dokumentów, w którym pobieram zawartość witryny, a następnie przypisuję do witryny jedną z wielu etykiet zgodnie z zawartością. Dowiedziałem się, że tf-idf może być do tego bardzo przydatne. Jednak nie byłem pewien, kiedy dokładnie go użyć. Zakładając, że strona internetowa zajmująca się określonym tematem wielokrotnie o tym wspomina, był to mój obecny proces:

  1. Pobierz zawartość witryny i przeanalizuj, aby znaleźć zwykły tekst
  2. Normalizuj i powstrzymuj zawartość
  3. Tokenizacja do unigramów (może też bigramów)
  4. Pobierz liczbę wszystkich unigramów dla danego dokumentu, filtrując słowa o małej długości i małej liczbie występujących słów
  5. Wytrenuj klasyfikator, taki jak NaiveBayes, na wynikowym zbiorze

Moje pytanie jest następujące: gdzie pasowałby tu tf-idf? Przed

normalizowanie / wyprowadzanie? Po normalizacji, ale przed tokenizacją? Po tokenizacji?

Każdy wgląd byłby bardzo mile widziany.

Po bliższym przyjrzeniu się, myślę, że mogłem mieć nieporozumienie co do tego, jak działa TF-IDF. W powyższym kroku 4, który opisuję, czy musiałbym od razu wprowadzić całość moich danych do TF-IDF? Jeśli na przykład moje dane są następujące:

[({tokenized_content_site1}, category_string_site1),

({tokenized_content_site2}, category_string_site2),

({tokenized_content_siten}, category_string_siten)}]

Tutaj najbardziej zewnętrzna struktura jest listą zawierającą krotki, zawierającą słownik (lub hashmap) i ciąg. Czy musiałbym od razu wprowadzić całość tych danych do kalkulatora TF-IDF, aby osiągnąć pożądany efekt? W szczególności patrzyłem na TfidfVectorizer scikit-learn, aby to zrobić, ale jestem trochę niepewny co do jego użycia, ponieważ przykłady są dość rzadkie.

Jak to opisałeś, krok 4 to miejsce, w którym chcesz użyć TF-IDF. Zasadniczo TD-IDF policzy każdy termin w każdym dokumencie i przypisze punktację, biorąc pod uwagę względną częstotliwość w całym zbiorze dokumentów. Brakuje jednak jednego dużego kroku w procesie: dodawania adnotacji do zestawu treningowego. Zanim wytrenujesz klasyfikator, musisz ręcznie dodać adnotacje do próbki danych etykietami, które chcesz mieć możliwość automatycznego stosowania za pomocą klasyfikatora. Aby to wszystko ułatwić, możesz rozważyć użycie klasyfikatora Stanford. To wykona wyodrębnianie cech i zbuduje model klasyfikatora (obsługujący kilka różnych algorytmów uczenia maszynowego), ale nadal będziesz musiał ręcznie dodawać adnotacje do danych szkoleniowych.

K-Nearest Neighbors

Czy algorytm k-najbliższego sąsiada jest klasyfikatorem dyskryminacyjnym czy generującym? Po raz pierwszy pomyślałem o tym, że jest generatywny, ponieważ faktycznie używa twierdzenia Bayesa do obliczenia późniejszego. Szukając dalej tego, wydaje się, że jest to model dyskryminacyjny, ale nie mogłem znaleźć wyjaśnienia. Czy więc KNN jest przede wszystkim dyskryminujący? A jeśli tak, czy to dlatego, że nie modeluje wyprzedzeń ani prawdopodobieństwa?

Zobacz podobną odpowiedź tutaj. Aby wyjaśnić, k- najbliższy sąsiad jest klasyfikatorem dyskryminacyjnym. Różnica między klasyfikatorem generatywnym a dyskryminacyjnym polega na tym, że pierwszy modeluje wspólne prawdopodobieństwo, podczas gdy drugi modeluje prawdopodobieństwo warunkowe (późniejsze), zaczynając od poprzedniego. W przypadku najbliższych sąsiadów modelowane jest prawdopodobieństwo warunkowe klasy dla danego punktu danych. Aby to zrobić, należy zacząć od wcześniejszego prawdopodobieństwa na zajęciach.

Drzewo decyzyjne czy regresja logistyczna?

Pracuję nad problemem klasyfikacyjnym. Mam zbiór danych zawierający równą liczbę zmiennych kategorialnych i ciągłych. Skąd mam wiedzieć, jakiej techniki użyć? między drzewem decyzyjnym a regresją logistyczną? Czy słuszne jest założenie, że regresja logistyczna będzie bardziej odpowiednia dla zmiennej ciągłej, a drzewo decyzyjne będzie bardziej odpowiednie dla zmiennej ciągłej + jakościowej?

Krótko mówiąc: rób to, co powiedział @untledprogrammer, wypróbuj oba modele i sprawdź krzyżowo, aby pomóc wybrać jeden. Zarówno drzewa decyzyjne (w zależności od implementacji, np. C4.5), jak i regresja logistyczna powinny dobrze radzić sobie z danymi ciągłymi i kategorialnymi. W przypadku regresji logistycznej warto zakodować fikcyjnie zmienne kategorialne.

Jak wspomniał @untitledprogrammer, trudno jest z góry ustalić, która technika będzie lepiej oparta po prostu na typie posiadanych funkcji, ciągłych lub innych. To naprawdę zależy od konkretnego problemu i posiadanych danych. Należy jednak pamiętać, że model regresji logistycznej szuka pojedynczej liniowej granicy decyzyjnej w przestrzeni cech, podczas gdy drzewo decyzyjne zasadniczo dzieli przestrzeń funkcji na półprzestrzenie przy użyciu liniowych granic decyzyjnych wyrównanych do osi. Efekt netto jest taki, że masz nieliniową granicę decyzyjną, prawdopodobnie więcej niż jedną. Jest to przyjemne, gdy punktów danych nie można łatwo oddzielić pojedynczą hiperpłaszczyzną, ale z drugiej strony drzewa decyzyjne są tak elastyczne, że mogą być podatne na nadmierne dopasowanie. Aby temu zaradzić, możesz spróbować przycinania. Regresja logistyczna jest zwykle mniej podatna (ale nie odporna!) Na nadmierne dopasowanie. Na koniec kolejną kwestią do rozważenia jest to, że drzewa decyzyjne mogą automatycznie uwzględniać interakcje między zmiennymi, np. jeśli masz dwie niezależne funkcje i. W przypadku regresji logistycznej musisz ręcznie dodać te terminy interakcji samodzielnie.

Musisz więc zadać sobie pytanie: jaki rodzaj granicy decyzyjnej ma większy sens w twoim konkretnym problemie? jak chcesz zrównoważyć odchylenie i wariancję? czy istnieją interakcje między moimi funkcjami?

Oczywiście zawsze dobrze jest po prostu wypróbować oba modele i przeprowadzić weryfikację krzyżową. To xy pomoże ci dowiedzieć się, który z nich bardziej przypomina lepszy błąd generalizacji.

Spróbuj użyć zarówno drzew regresyjnych, jak i decyzyjnych. Porównaj skuteczność każdej techniki, używając 10-krotnej weryfikacji krzyżowej. Trzymaj się tego o wyższej wydajności. Trudno byłoby ocenić, która metoda byłaby lepsza, wiedząc, że zbiór danych jest ciągły i / lub kategoryczny.

[40][Sieci Neuronowe]

Sieci neuronowe tradycyjnie odnoszą się do sieci lub obwodu neuronów biologicznych. Współczesne użycie tego terminu często odnosi się do sztucznych sieci neuronowych (SSN), które składają się ze sztucznych neuronów lub węzłów – konstruktów programistycznych naśladujących właściwości neuronów biologicznych. Zestaw ważonych połączeń między neuronami umożliwia propagację informacji w sieci w celu rozwiązania problemów sztucznej inteligencji bez konieczności posiadania przez projektanta sieci modelu rzeczywistego systemu. Celem jest dobra lub ludzka zdolność przewidywania.

PYTANIA:

Wielowarstwowa propagacja wsteczna. Sieć neuronowa do klasyfikacji

Czy ktoś może mi wyjaśnić, jak sklasyfikować dane takie jak MNIST z siecią MLBP-Neural, jeśli wykonuję więcej niż jedno wyjście (np. 8), to znaczy, jeśli używam tylko jednego wyjścia, mogę łatwo klasyfikować dane, ale jeśli używam więcej niż jeden, które wyjście powinienem wybrać?

ODPOWIEDZI:

Załóżmy, że musisz sklasyfikować coś w klasach K, gdzie K > 2. W tym przypadku najczęściej używam konfiguracji jednego kodowania na gorąco. Będziesz mieć K kolumn wyjściowych, a w zbiorze uczącym ustawisz wszystkie wartości na 0, z wyjątkiem tej, która ma indeks kategorii, który może mieć wartość 1. Zatem dla każdej instancji zestawu danych uczących będziesz mieć wszystkie wyniki z wartościami 0 lub 1, wszystkie wyjścia sumują się do 1 dla każdej instancji.

To wygląda na prawdopodobieństwo, które przypomina mi technikę używaną często do łączenia niektórych wyników, które są modelowane jako prawdopodobieństwo. Nazywa się to funkcją softmax, więcej szczegółów w Wikipedii. Pozwoli to na nałożenie pewnych ograniczeń na wartości wyjściowe (jest to w zasadzie uogólnienie funkcji logistycznej), tak aby wartości wyjściowe były modelowane jako prawdopodobieństwa. Wreszcie, z lub bez softmax, możesz użyć wyjścia jako funkcji dyskryminacyjnej, aby wybrać odpowiednią kategorię. Kolejną ostatnią myślą byłoby uniknięcie kodowania zmiennych w połączony sposób. Na przykład możesz mieć binarną reprezentację indeksu kategorii. Spowodowałoby to u uczącego się sztuczne połączenie między niektórymi wynikami, które są arbitralne. Jedyne kodowanie na gorąco ma tę zaletę, że jest neutralne dla sposobu indeksowania etykiet.

Wszelkie różnice w regularyzacji w MLP między partiami i indywidualne aktualizacje?

Właśnie dowiedziałem się o regularyzacji jako podejściu do kontroli nadmiernego dopasowania i chciałbym włączyć ten pomysł do prostej implementacji wstecznej propagacji i wielowarstwowego perceptronu (MLP), które razem złożyłem. Obecnie, aby uniknąć nadmiernego dopasowania, przeprowadzam weryfikację krzyżową i utrzymuję sieć z najlepszym dotychczas wynikiem w zestawie walidacyjnym. Działa to dobrze, ale dodanie regularyzacji przyniosłoby mi korzyści, ponieważ prawidłowy wybór algorytmu regularyzacji i parametru spowodowałby, że moja sieć zbiegałaby się w sposób bardziej systematyczny do modelu nieprzekraczającego. Formuła, którą mam na termin aktualizacji (z kursu Coursera ML) jest podana jako aktualizacja partii, np. dla każdej wagi, po zsumowaniu wszystkich odpowiednich delt dla całego zbioru uczącego z propagacji błędu, dodaje się korektę lambda * current_weight, a także przed odjęciem połączonej delty na końcu partii, gdzie lambda jest parametrem regularyzacji. Moja implementacja wstecznej propagacji wykorzystuje aktualizacje wagi poszczególnych pozycji. Obawiam się, że nie mogę po prostu skopiować podejścia wsadowego, chociaż intuicyjnie wydaje mi się to OK. Czy mniejszy okres regularyzacji na element działa równie dobrze? Na przykład lambda * aktualna_waga / N, gdzie N to rozmiar zestawu treningowego – na początku na pierwszy rzut oka wygląda to rozsądnie. Nie mogłem jednak znaleźć nic na ten temat i zastanawiam się, czy to dlatego, że regularyzacja nie działa tak dobrze z aktualizacją dla poszczególnych pozycji, czy nawet ma inną nazwę lub zmienioną formułę.

Regularyzacja ma również znaczenie w uczeniu się według poszczególnych elementów. Proponuję rozpocząć od podstawowego podejścia do walidacji, aby dowiedzieć się, czy lambda jest uczeniem wsadowym, czy jednostkowym. To najłatwiejsze i najbezpieczniejsze podejście. Spróbuj ręcznie z kilkoma różnymi wartościami. na przykład 0,001. 0,003, 0,01, 0,03, 0,1 itd. I zobacz, jak zachowuje się Twój zestaw walidacyjny. Później możesz zautomatyzować ten proces, wprowadzając liniową lub lokalną metodę wyszukiwania. Na marginesie uważam, że wartość lambda należy rozpatrywać w odniesieniu do aktualizacji wektora parametrów, a nie rozmiaru zestawu uczącego. W przypadku uczenia wsadowego masz jedną aktualizację parametrów na przebieg zestawu danych, natomiast w przypadku uczenia online jedną aktualizację na próbkę (niezależnie od rozmiaru zestawu uczącego).

Regularyzacja jest używana podczas obliczania wstecznej propagacji wszystkich wag w twoim MLP. Dlatego zamiast obliczać gradient w odniesieniu do wszystkich danych wejściowych zbioru uczącego (partii), używasz tylko jednej / jednej pozycji (stochastyczna lub półstochastyczna). Ostatecznie ograniczysz wynik aktualizacji do jednego przedmiotu, a nie do wszystkich, co również jest poprawne. Ponadto, jeśli dobrze pamiętam, Andrew NG użył regularyzacji L2. / N w lambda * aktualna_waga / N nie jest obowiązkowa, po prostu pomaga przeskalować dane wejściowe. Jeśli jednak zdecydujesz się jej nie używać, będziesz musiał (w większości przypadków) wybrać inną wartość lambda. Możesz również użyć algorytmu wyszukiwania w siatce, aby wybrać najlepszą wartość dla lambda (hiperparametr => ten, który musisz wybrać).

Jak walczyć z niedopasowaniem w głębokiej sieci neuronowej

Kiedy zacząłem od sztucznych sieci neuronowych (NN), pomyślałem, że będę musiał walczyć z nadmiernym dopasowaniem jako głównym problemem. Ale w praktyce nie mogę nawet zmusić mojego NN do przekroczenia 20% bariery błędu. Nie mogę nawet pobić swojego wyniku w losowym lesie! Szukam bardzo ogólnych lub mniej ogólnych porad na temat tego, co należy zrobić, aby NN zaczął rejestrować trendy w danych. Do implementacji NN używam Theano Stacked Auto Encoder z kodem z tutoriala, który działa świetnie (mniej niż 5% współczynnik błędów) do klasyfikowania zbioru danych MNIST. Jest to wielowarstwowy perceptron, z warstwą softmax na górze, a każdy ukryty później jest wstępnie trenowany jako autoenkoder (w pełni opisany w samouczku, rozdział 8). Istnieje ~ 50 funkcji wejściowych i ~ 10 klas wyjściowych. NN ma neurony esicy i wszystkie dane są znormalizowane do [0,1]. Próbowałem wielu różnych konfiguracji: liczba ukrytych warstw i neuronów w nich (100-> 100-> 100, 60-> 60-> 60, 60-> 30-> 15 itd.), Różne uczenie się i wstępne szkolenie stawki itp. A najlepsze, co mogę uzyskać, to 20% poziom błędów w zestawie walidacyjnym i 40% poziom błędów w zestawie testowym. Z drugiej strony, gdy próbuję użyć Random Forest (od scikit-learn), łatwo uzyskuję 12% poziom błędów w zbiorze walidacyjnym i 25% (!) w zbiorze testowym. Jak to możliwe, że moje głębokie NN z przedtreningiem zachowuje się tak źle? Czego powinienem spróbować?

Problem z głębokimi sieciami polega na tym, że mają one wiele hiperparametrów do dostrojenia i bardzo małą przestrzeń na rozwiązania. Zatem znalezienie dobrych jest bardziej jak sztuka niż zadanie inżynierskie. Zacząłbym od praktycznego przykładu z samouczka i bawiłbym się jego parametrami, aby zobaczyć, jak zmieniają się wyniki – daje to dobrą intuicję (choć nie formalne wyjaśnienie) na temat zależności między parametrami a wynikami (zarówno końcowymi, jak i pośrednimi). Bardzo przydatne okazały się również następujące artykuły: Visual Debugging Restricted Boltzmann Machine Training z przykładem 3D Praktyczny przewodnik po szkoleniu Ograniczone Boltzmann Machines Oba opisują RBM, ale zawierają ogólne spostrzeżenia na temat głębokich sieci. Na przykład, jednym z kluczowych punktów jest to, że sieci muszą być debugowane na poziomie warstwy – jeśli poprzednia warstwa nie zapewnia dobrej reprezentacji funkcji, kolejne warstwy prawie nie mają szans, aby to naprawić.

Chociaż odpowiedź zawiera kilka doskonałych wskazówek, które pomogą dowiedzieć się więcej o tym, jak sieci neuronowe mogą być (niezwykle) trudne do poprawnego dostrojenia, pomyślałem, że pomocne może być wymienienie kilku konkretnych technik, które są obecnie używane w klasyfikacji o najwyższej wydajności architektury w literaturze sieci neuronowej.

Rektyfikowane aktywacje liniowe

Pierwszą rzeczą, która może pomóc w twoim przypadku, jest zmiana funkcji aktywacji modelu z logistycznej sigmoidy – f (z) = (1 + = e <sup> -z </sup>) <sup> -1 </sup> – do wyprostowanej liniowej (aka relu) – f (z) = max (0, z).

Aktywacja relu ma dwie duże zalety:

* jego wyjście to prawdziwe zero (a nie tylko mała wartość bliska zeru) dla i

* jego pochodna jest stała, 0 dla lub 1 dla.

Sieć jednostek relu zasadniczo działa jak zbiór wykładniczo wielu sieci liniowych, ponieważ jednostki, które otrzymują dane wejściowe, są zasadniczo „wyłączone” (ich wyjście wynosi 0), podczas gdy jednostki, które otrzymują dane wejściowe, zapadają się w pojedynczy model liniowy dla tego wejścia. Również stałe pochodne są ważne, ponieważ głęboka sieć z aktywacjami relu ma tendencję do unikania problemu znikającego gradientu i można ją trenować bez warstwowego wstępnego treningu.

Dropout

Wiele grup badawczych w ciągu ostatnich kilku lat opowiadało się za stosowaniem „przerywania” w sieciach klasyfikatorów, aby uniknąć przetrenowania. W przypadku rezygnacji podczas uczenia pewna stała proporcja jednostek w danej warstwie jest losowo ustawiana na 0 dla każdego wejścia przetwarzanego przez sieć. Zmusza to jednostki, które nie są ustawione na 0, do „nadrabiania” „brakujących” jednostek. Dropout wydaje się być niezwykle skutecznym regulatorem modeli sieci neuronowych w zadaniach klasyfikacyjnych.

Gdy głębsze sieci są w stanie zacząć konwergencję, ujawniono problem degradacji: wraz ze wzrostem głębokości sieci dokładność zostaje nasycona (co może nie być zaskakujące), a następnie szybko spada. Nieoczekiwanie taka degradacja nie jest spowodowana nadmiernym dopasowaniem, a dodanie większej liczby warstw do odpowiednio głębokiego modelu prowadzi do większego błędu uczenia, co zostało dokładnie zweryfikowane przez nasze eksperymenty. Aby rozwiązać ten problem, wykorzystali architekturę pomijania. Dzięki temu wyszkolili bardzo głębokie sieci (1202 warstwy) i osiągnęli najlepszy wynik w wyzwaniu ILSVRC 2015

Sieć neuronowa analizuje ciąg danych?

Więc dopiero zaczynam się uczyć, jak sieć neuronowa może działać, aby rozpoznawać wzorce i kategoryzować dane wejściowe, i widziałem, jak sztuczna sieć neuronowa może analizować dane obrazu i kategoryzować obrazy (demo z convnetjs), a klucz tam polega na zmniejszeniu rozdzielczości obrazu, a każdy piksel stymuluje jeden neuron wejściowy do sieci. Próbuję jednak zawinąć głowę, czy można to zrobić za pomocą danych wejściowych? Przykład użycia, który mam, to „mechanizm rekomendacji” dla filmów, które oglądał użytkownik. Filmy mają wiele danych tekstowych (tytuł, fabuła, tagi) i mogę sobie wyobrazić „zmniejszenie próbkowania” tekstu do kilku kluczowych słów opisujących ten film, ale nawet jeśli przeanalizuję pięć pierwszych słów opisujących ten film, myślisz, że potrzebowałbym neuronów wejściowych dla każdego angielskiego słowa, aby porównać zestaw filmów? Mógłbym ograniczyć neurony wejściowe tylko do słów użytych w zestawie, ale czy potem może się rozwijać / uczyć, dodając nowe filmy (użytkownik ogląda nowy film z nowymi słowami)? Większość bibliotek, które widziałem, nie pozwala na dodawanie nowych neuronów po przeszkoleniu systemu? Czy istnieje standardowy sposób mapowania danych ciągów / słów / znaków na dane wejściowe w sieci neuronowej? A może sieć neuronowa naprawdę nie jest odpowiednim narzędziem do analizowania danych łańcuchowych, takich jak to (jakie jest lepsze narzędzie do dopasowywania wzorców w danych łańcuchowych)?

Korzystanie z sieci neuronowej do przewidywania danych w języku naturalnym może być trudnym zadaniem, ale istnieją wypróbowane i prawdziwe metody umożliwiające to. W polu Przetwarzanie języka naturalnego (NLP) tekst jest często przedstawiany za pomocą modelu zbioru słów. Innymi słowy, masz wektor o długości n, gdzie n to liczba słów w Twoim słowniku, a każde słowo odpowiada elementowi w wektorze. Aby przekonwertować tekst na dane liczbowe, wystarczy policzyć liczbę wystąpień każdego słowa i umieścić tę wartość w indeksie wektora, który odpowiada słowu. Wikipedia doskonale opisuje ten proces konwersji. Ponieważ długość vector jest naprawiony, trudno jest poradzić sobie z nowymi słowami, które nie są mapowane do indeksu, ale istnieją sposoby na złagodzenie tego problemu (haszowanie funkcji wyszukiwania). Ta metoda reprezentacji ma wiele wad – nie zachowuje relacji między sąsiednimi słowami i skutkuje bardzo rzadkimi wektorami. Spojrzenie na ngramy pomaga rozwiązać problem zachowania relacji między wyrazami, ale na razie skupmy się na drugim problemie: rzadkość. Trudno jest bezpośrednio poradzić sobie z tymi rzadkimi wektorami (wiele bibliotek algebry liniowej słabo radzi sobie z rzadkimi danymi wejściowymi), dlatego często następnym krokiem jest redukcja wymiarowości. W tym celu możemy odwołać się do dziedziny modelowania tematycznego: Techniki takie jak ukryta alokacja Dirichleta (LDA) i ukryta analiza semantyczna (LSA) umożliwiają kompresję tych rzadkich wektorów do gęstych wektorów poprzez przedstawienie dokumentu jako kombinacji tematów. Możesz ustalić liczbę używanych tematów, a robiąc to, ustalić rozmiar wektora wyjściowego produkowanego przez LDA lub LSA. Ten proces redukcji wymiarowości drastycznie zmniejsza rozmiar wektora wejściowego, próbując jednocześnie utracić minimalną ilość informacji. Wreszcie, po wszystkich tych konwersjach, możesz wprowadzić dane wyjściowe procesu modelowania tematu do wejść sieci neuronowej.

Nie dotyczy to sieci neuronowych jako takich, ale reprezentowania danych tekstowych w uczeniu maszynowym. Możesz reprezentować filmy, obsadę i motyw jako zmienne kategorialne. Fabuła jest bardziej skomplikowana; prawdopodobnie chciałbyś mieć do tego model tematyczny, ale odejdę to się skończy, dopóki nie zrozumiesz rzeczy. Robi dokładnie ten tekstowy „downsampling”, o którym wspomniałeś. Zapoznaj się z tym samouczkiem, aby dowiedzieć się, jak kodować zmienne kategorialne dla sieci neuronowych.

Wcześniejsze odpowiedzi mogą zawierać dobre uwagi dotyczące omawianego problemu. Problem polega na tym, że reprezentujesz swój łańcuch jako wektor cech do wprowadzenia do NN. Po pierwsze, problem zależy od rozmiaru ciągu, który chcesz przetworzyć. Długie ciągi zawierające żetony majów (zwykle słowa) są często nazywane dokumentami w tym ustawieniu. Istnieją oddzielne metody postępowania z pojedynczymi żetonami / słowami. Istnieje wiele sposobów przedstawiania dokumentów. Wielu z nich przyjmuje założenie z worka słów. Najprostsze typy przedstawiają dokument jako wektor zliczeń słów lub częstotliwości terminów (tf). Aby wyeliminować wpływ długości dokumentu,

Zwykle ludzie wolą normalizować liczbę dokumentów, w których pojawia się termin, częstotliwość dokumentów (tf-idf). Innym podejściem jest modelowanie tematyczne, które uczy się ukrytych niższych wymiarów reprezentacji danych. LDA i LSI / LSA to typowe wybory, ale należy pamiętać, że nie jest to nadzorowane. Wyuczona reprezentacja niekoniecznie będzie idealna do jakiejkolwiek nadzorowanej nauki, którą prowadzisz ze swoim NN. Jeśli chcesz tworzyć modele tematyczne, możesz także wypróbować nadzorowane modele tematyczne. W przypadku pojedynczych słów możesz użyć word2vec, który wykorzystuje NN do osadzania słów w przestrzeni o dowolnej wielkości. Podobieństwo między dwoma wektorami słów w tej wyuczonej przestrzeni zwykle odpowiada podobieństwu semantycznemu. Niedawno pionierskim podejściem są wektory akapitowe, które najpierw uczą się modelu słów podobnego do word2vec, a następnie budują na tej reprezentacji rozproszoną reprezentację zestawów słów (dokumentów dowolnej wielkości). To pokazało najnowocześniejsze wyniki w wielu zastosowaniach. Podczas korzystania z sieci NN w NLP ludzie często używają różnych architektur, takich jak cykliczne sieci neuronowe (takie jak sieci pamięci długoterminowej). W niektórych przypadkach ludzie używali nawet konwolucyjnych sieci neuronowych w tekście.

W jaki sposób sieci neuronowe są powiązane z transformatami Fouriera?

To jest pytanie z wywiadu W jaki sposób sieci neuronowe są powiązane z transformatami Fouriera? Mogłem znaleźć artykuły, które mówią o metodach przetwarzania dyskretnej transformaty Fouriera (DFT) przez jednowarstwową sieć neuronową z liniową funkcją przenoszenia. Czy jest jakaś inna korelacja, której mi brakuje?

Nie są ze sobą powiązane w żadnym sensownym sensie. Oczywiście, możesz ich używać do wyodrębniania funkcji lub wykonywania dowolnej liczby rzeczy, ale to samo można powiedzieć o wielu technikach. Zapytałbym „jakiego rodzaju sieć neuronową?” aby sprawdzić, czy ankieter miał na myśli coś konkretnego.

Podobieństwo to regresja. NNs mogą być używane do regresji, a transformata Fouriera jest w swoim sercu po prostu dopasowaniem krzywej wielu funkcji sin i cos do niektórych danych.

Co to jest sprzężone zejście w gradiencie?

Co to jest sprzężone gradientowe zejście sieci neuronowej? Czym różni się od techniki Gradient Descent? Natknąłem się na zasób, ale nie byłem w stanie zrozumieć różnicy między tymi dwiema metodami. W procedurze wspomniano, że następny kierunek wyszukiwania jest określany tak, że jest sprzężony z poprzednimi kierunkami wyszukiwania. Co to zdanie oznacza? O czym jest mowa o wyszukiwaniu liniowym na stronie internetowej? Czy ktoś może to wyjaśnić za pomocą diagramu?

Co to zdanie oznacza? Oznacza to, że następny wektor powinien być prostopadły do wszystkich poprzednich względem macierzy. To tak, jak naturalne wektory bazowe są do siebie prostopadłe,

z dodatkiem skrętu matrycy:

xTAy =   zamiast  xTy = 0, o czym jest mowa o wyszukiwaniu liniowym na stronie internetowej? Przeszukiwanie liniowe to metoda optymalizacji polegająca na odgadywaniu, jak daleko w danym kierunku (tj. Wzdłuż linii) należy się poruszać, aby najlepiej osiągnąć lokalne minimum.

Właściwości do budowy wielowarstwowej sieci neuronowej Perceptron przy użyciu Keras?

Próbuję zbudować i wytrenować wielowarstwową sieć neuronową perceptronu, która prawidłowo przewiduje, co prezydent wygrał w jakim hrabstwie po raz pierwszy. Mam następujące informacje dotyczące danych treningowych. Ludność ogółem Mediana wieku% kawalerów Stopień bezrobocia lub więcej Stopa bezrobocia Dochód na mieszkańca Ogółem gospodarstwa domowe Średnia wielkość gospodarstwa domowego% Mieszkania zajmowane przez właścicieli% Mieszkania zajmowane przez najemców% Mieszkania puste Mediana wartości domu Wzrost liczby ludności Wzrost liczby gospodarstw domowych Wzrost dochodu na mieszkańca Zwycięzca To 14 kolumn danych szkoleniowych i 15. kolumna jest tym, jakie powinno być wyjście. Próbuję użyć Keras do zbudowania wielowarstwowej sieci neuronowej perceptronu, ale potrzebuję pomocy w zrozumieniu kilku właściwości i zalet i wad wyboru różnych opcji dla tych właściwości.

  1. FUNKCJA AKTYWACJI

Wiem, że moim pierwszym krokiem jest wymyślenie funkcji aktywacji. Zawsze badałem sieci neuronowe wykorzystujące sigmoidalne funkcje aktywacji. Czy funkcja aktywacji esicy jest najlepsza? Skąd wiesz, którego użyć? Keras dodatkowo daje możliwość korzystania z funkcji aktywacji softmax, softplus, relu, tanh, linear lub hard_sigmoid. Nie przeszkadza mi

używając czegokolwiek, ale chcę tylko być w stanie zrozumieć, dlaczego i wady i zalety.

  1. PRAWDOPODOBIEŃSTWO INICJALIZACJI

Wiem, że inicjalizacje definiują rozkład prawdopodobieństwa używany do ustawiania początkowych losowych wag warstw Keras. Opcje, które daje Keras to uniform lecun_uniform, normal, identity, orthogonal, zero, glorot_normal, glorot_uniform, he_normal i he_uniform. Jak mój wybór tutaj wpływa na mój wynik końcowy lub model? Czy nie powinno to mieć znaczenia, ponieważ „trenujemy” dowolny model losowy, od którego zaczynamy, i tak czy inaczej wymyślamy bardziej optymalne wyważenie warstw?

1) Aktywacja to wybór architektury, który sprowadza się do wyboru hiperparametru. Możesz przedstawić teoretyczny argument za używaniem dowolnej funkcji, ale najlepszym sposobem ustalenia tego jest wypróbowanie kilku i ocena w zbiorze walidacyjnym. Należy również pamiętać, że można łączyć i dopasowywać aktywacje różnych warstw.

2) Teoretycznie tak, wiele losowych inicjalizacji byłoby takich samych, gdyby dane były wyjątkowo dobrze zachowane, a sieć była idealna. Jednak w praktyce inicjalizacje mają na celu zapewnienie rozsądnego startu gradientu i prawidłowej propagacji sygnału wstecz. Prawdopodobnie w tym przypadku którakolwiek z tych inicjalizacji będzie działać podobnie, ale najlepszym podejściem jest ich wypróbowanie i przełączenie, jeśli uzyskasz niepożądane wyniki.