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

[39][Statystyka]

PYTANIA:

Czy istnieje zamiennik małych wartości p w dużych zbiorach danych?

Jeśli w dużych zbiorach danych jest dużo małych wartości p, jakie jest porównywalne zastąpienie wartości p w danych z milionami próbek?

ODPOWIEDZI:

Nie ma zamiennika w ścisłym znaczeniu tego słowa. Zamiast tego powinieneś przyjrzeć się innym miarom. Inne miary, na które patrzysz, zależą od rodzaju problemu, który rozwiązujesz. Ogólnie rzecz biorąc, jeśli masz małą wartość p, rozważ także wielkość efektu. Może być bardzo istotne statystycznie, ale w praktyce bez znaczenia. Pomocne jest również podanie przedziału ufności wielkości efektu.

Kiedy wartości p są mylące? Gdy istnieje wiele zmiennych, które można przetestować pod kątem korelacji parami (na przykład), zastąpieniem jest użycie dowolnej z poprawek współczynnika fałszywych odkryć (w celu ograniczenia prawdopodobieństwa, że ​​dane odkrycie jest fałszywe) lub współczynnika błędów rodzinnych ( aby ograniczyć prawdopodobieństwo jednego lub więcej fałszywych odkryć). Na przykład możesz użyć metody Holma – Bonferroniego. W przypadku dużej próbki, a nie wielu zmiennych, potrzebne jest coś innego. Jak powiedział Christopher, wielkość efektu jest sposobem na rozwiązanie tego problemu. Łącząc te dwie idee, możesz użyć przedziału ufności wokół wielkości efektu i zastosować fałsz korekta współczynnika wykrywania do wartości p przedziału ufności. Efekty, dla których nawet najniższa granica skorygowanego przedziału ufności jest wysoka, prawdopodobnie będą silnymi skutkami, niezależnie od ogromnego rozmiaru zbioru danych. Nie znam żadnego opublikowanego artykułu, który łączy w ten sposób przedziały ufności z fałszywą korektą wskaźnika odkryć, ale wydaje się, że jest to proste i intuicyjnie zrozumiałe podejście. Aby było to jeszcze lepsze, użyj nieparametrycznego sposobu szacowania przedziałów ufności. Zakładając, że rozkład może dać tutaj bardzo optymistyczne szacunki, a nawet dopasowanie rozkładu do danych prawdopodobnie będzie niedokładne. Ponieważ informacje o kształcie rozkładu poza krawędziami przedziału ufności pochodzą ze stosunkowo niewielkiej podpróbki danych, w tym miejscu naprawdę warto zachować ostrożność. Możesz użyć metody ładowania początkowego, aby uzyskać nieparametryczny przedział ufności.

Data Science jako socjolog?

Ponieważ bardzo interesuję się programowaniem i statystyką, Data Science wydaje mi się świetną ścieżką kariery – lubię obie dziedziny i chciałbym je połączyć. Niestety, studiowałem nauki polityczne z niestatystycznie brzmiącym mistrzem. Skupiłem się na statystykach w tym Master, odwiedzając opcjonalne kursy i pisząc pracę statystyczną na dość dużym zbiorze danych. Ponieważ prawie wszystkie stanowiska wymagają dyplomu z informatyki, fizyki lub innej dziedziny techniki, zastanawiam się, czy jest szansa, aby zostać naukowcem od danych, czy też powinienem porzucić ten pomysł.

Brakuje mi wiedzy na temat uczenia maszynowego, sql i hadoop, mając jednocześnie dość duże doświadczenie w informatyce i statystyce. Czy ktoś może mi powiedzieć, jak wykonalny jest mój cel zostania naukowcem danych?

Nauka o danych to termin, który jest używany tak samo luźno jak Big Data. Każdy ma zgrubne pojęcie, co rozumieją przez ten termin, ale jeśli spojrzysz na rzeczywiste zadania, obowiązki analityka danych będą się znacznie różnić w zależności od firmy. Analiza statystyczna mogłaby objąć całość obciążenia pracą na jednym stanowisku, a nawet nie uwzględniać innego. Nie chciałbym gonić za tytułem zawodowym jako takim. Jeśli jesteś zainteresowany tą dziedziną, połącz się w sieć (tak jak teraz) i znajdź dobre dopasowanie. Jeśli przeglądasz ogłoszenia o pracę, po prostu poszukaj tych, które podkreślają podstawy statystyki i informatyki. Hadoop i SQL są łatwe do zaznajomienia się z nimi, biorąc pod uwagę czas i motywację, ale chciałbym trzymać się obszarów, w których jesteś najsilniejszy i od tego zacząć.

Odpowiedz przez atak matematyczny Podejrzewam, że to zostanie zamknięte, ponieważ jest bardzo wąskie, ale moje 2 centy…

Data Science wymaga 3 umiejętności:

* Matematyka / statystyki

*Programowanie

* Wiedza domeny

Pokazanie wszystkich trzech może być bardzo trudne. Punkty 1 i 2 można oznaczyć stopniami, ale kierownik ds. rekrutacji, który może ich nie mieć, nie chce ufać dyplomowi sztuk wyzwolonych. Jeśli chcesz zająć się nauką o danych, najpierw zostań ekspertem domeny. Publikuj prognozy wyborcze. Jeśli masz rację, zacytuj je. Dzięki temu zostaniesz zauważony.

Jeśli posiadasz wiedzę o domenie na poziomie A+, nie potrzebujesz umiejętności programowania na poziomie A+, ale nauczysz się programowania na tyle, że nie potrzebujesz nikogo, kto będzie pobierał dane za Ciebie.

Zorientowany na naukę o danych zbiór danych / pytanie badawcze dla mgr statystyki

Praca dyplomowa

Chciałbym zbadać „naukę o danych”. Termin wydaje mi się trochę niejasny, ale spodziewam się, że będzie wymagał:

  1. uczenie maszynowe (zamiast tradycyjnych statystyk);
  2. wystarczająco duży zbiór danych, aby przeprowadzić analizy na klastrach.

Jakie są dobre zbiory danych i problemy, dostępne dla statystów z pewnym doświadczeniem programistycznym, których mogę użyć do zbadania dziedziny nauki o danych? Aby było to możliwie jak najbardziej zawężone, najlepiej byłoby, gdyby zawierały linki do otwartych, dobrze używanych zbiorów danych i przykładowych problemów.

Po prostu przejdź do kaggle.com; zapewni Ci to zajęcie przez długi czas. W przypadku otwartych danych dostępne jest repozytorium UC Irvine Machine Learning. W rzeczywistości istnieje cała witryna Stackexchange poświęcona temu;

Fundacja Sunlight to organizacja, która koncentruje się na otwieraniu i zachęcaniu do bezstronnej analizy danych rządowych. W naturze istnieje mnóstwo analiz, które można wykorzystać do porównań, oraz wiele różnych tematów. Dostarczają narzędzi i interfejsów API do uzyskiwania dostępu do danych i pomagają w udostępnianiu danych w miejscach takich jak data.gov. Ciekawym projektem jest Influence Explorer. Możesz tutaj uzyskać dane źródłowe, a także dostęp do danych w czasie rzeczywistym.

Możesz również rzucić okiem na jedno z naszych bardziej popularnych pytań: publicznie dostępne zbiory danych.

Czy masz tytuł magistra informatyki? Statystyka?

Czy „nauka o danych” będzie w centrum twojej pracy dyplomowej? Czy temat poboczny? Zakładam, że zajmujesz się statystyką i chcesz skoncentrować swoją pracę magisterską na problemie „nauki o danych”. Jeśli tak, to pójdę pod prąd i zasugeruję, aby nie rozpoczynać od zbioru danych lub metody ML. Zamiast tego powinieneś poszukać interesującego problemu badawczego  jeśli jest to słabo poznane lub gdzie metody ML nie okazały się jeszcze skuteczne, lub gdzie istnieje wiele konkurencyjnych metod ML, ale żadna nie wydaje się lepsza od innych. Rozważmy to źródło danych: zbiór danych Stanford Large Network Dataset. Chociaż możesz wybrać jeden z tych zestawów danych, utwórz opis problemu, a następnie uruchom listę  metdo ML

metody, to podejście naprawdę nie mówi zbyt wiele o tym, czym jest nauka o danych, i moim zdaniem nie prowadzi do bardzo dobrej pracy magisterskiej. Zamiast tego możesz zrobić to: poszukaj wszystkich artykułów naukowych, które używają ML w jakiejś określonej kategorii – np. Sieci współpracy (a.k.a. współautorstwo). Czytając każdy artykuł, spróbuj dowiedzieć się, co byli w stanie osiągnąć za pomocą każdej metody ML, a czego nie byli w stanie rozwiązać. Szczególnie szukaj ich sugestii dotyczących „przyszłych badań”. Może wszyscy używają tej samej metody, ale nigdy nie próbowali konkurować z metodami ML. A może nie weryfikują odpowiednio swoich wyników, a może zbiory danych są małe, a może ich pytania badawcze i hipotezy były uproszczone lub ograniczone. Najważniejsze: spróbuj dowiedzieć się, dokąd zmierza ta linia badań. Dlaczego w ogóle się tym przejmują? Co jest w tym ważnego? Gdzie i dlaczego napotykają trudności?

Najlepsze języki do obliczeń naukowych

Wydaje się, że w większości języków dostępna jest pewna liczba naukowych bibliotek obliczeniowych.

* Python ma Scipy

* Rust ma SciRust

* C ++ ma kilka, w tym ViennaCL i Armadillo

* Java ma Java Numerics i Colt, a także kilka innych

Nie wspominając o językach takich jak R i Julia, zaprojektowanych specjalnie do obliczeń naukowych. Przy tak wielu opcjach, jak wybrać najlepszy język do zadania? Dodatkowo, które języki będą najbardziej wydajne? Wydaje się, że Python i R mają największą przyczepność w przestrzeni, ale logicznie rzecz biorąc, język kompilowany wydaje się być lepszym wyborem. I czy coś kiedykolwiek przewyższy Fortran? Ponadto języki kompilowane mają zwykle akcelerację GPU, podczas gdy języki interpretowane, takie jak R i Python, nie. Co powinienem wziąć pod uwagę przy wyborze języka i które języki zapewniają najlepszą równowagę użyteczności i wydajności? Czy są też języki ze znaczącymi zasobami obliczeń naukowych, które przegapiłem?

To dość obszerne pytanie, więc nie jest to pełna odpowiedź, ale miejmy nadzieję, że może to pomóc w uzyskaniu ogólnych informacji na temat określenia najlepszego narzędzia do pracy, jeśli chodzi o naukę o danych. Generalnie mam stosunkowo krótką listę kwalifikacji, których szukam, jeśli chodzi o jakiekolwiek narzędzie w tej przestrzeni. W przypadkowej kolejności są to:

* Wydajność: Zasadniczo sprowadza się do tego, jak szybko język wykonuje mnożenie macierzy, ponieważ jest to mniej więcej najważniejsze zadanie w nauce o danych.

* Skalowalność: przynajmniej dla mnie osobiście sprowadza się to do łatwości budowania systemu rozproszonego. To jest miejsce, w którym języki takie jak Julia naprawdę świecą.

* Społeczność: w każdym języku naprawdę szukasz aktywnej społeczności, która może Ci pomóc, gdy utkniesz w używaniu dowolnego narzędzia, którego używasz. W tym miejscu Python wyprzedza większość innych języków.

* Elastyczność: nie ma nic gorszego niż ograniczenie przez język, którego używasz. Nie zdarza się to zbyt często, ale próba odwzorowania struktur grafowych w haskell jest notorycznym problemem, a Julia jest przepełniona wieloma problemami związanymi z architekturą kodu w wyniku bycia takim młodym językiem.

* Łatwość użytkowania: jeśli chcesz używać czegoś w większym środowisku, upewnij się, że konfiguracja jest prosta i może być zautomatyzowana. Nie ma nic gorszego niż konieczność skonfigurowania skomplikowanej wersji na pół tuzinie maszyn.

Jest mnóstwo artykułów na temat wydajności i skalowalności, ale generalnie będziesz się przyglądać różnicy wydajności wynoszącej może 5–10 razy między językami, co może mieć lub nie mieć znaczenia w zależności od konkretnej aplikacji. Jeśli chodzi o akcelerację GPU, cudamat jest naprawdę bezproblemowym sposobem na uruchomienie go z Pythonem, a biblioteka cuda ogólnie sprawiła, że ​​akceleracja GPU jest znacznie bardziej dostępna niż kiedyś. Dwie podstawowe miary, których używam zarówno w odniesieniu do społeczności, jak i elastyczności, to spojrzenie na platformę menedżera pakietów językowych i pytania językowe w witrynie takiej jak SO. Jeśli istnieje wiele wysokiej jakości pytań i odpowiedzi, to dobry znak, że społeczność jest aktywna. Liczba pakietów i ogólna aktywność na tych pakietach również mogą być dobrym proxy dla tej metryki. Jeśli chodzi o łatwość użycia, jestem głęboko przekonany, że jedynym sposobem, aby to wiedzieć, jest samodzielne skonfigurowanie. Istnieje wiele przesądów związanych z wieloma narzędziami do nauki o danych, w szczególności takimi jak bazy danych i rozproszona architektura obliczeniowa, ale nie ma sposobu, aby naprawdę dowiedzieć się, czy coś jest łatwe, czy trudne do skonfigurowania i wdrożenia bez samodzielnego zbudowania.

Standaryzuj liczby dla wskaźników rankingowych

Próbuję uszeregować niektóre procenty. Mam liczniki i mianowniki dla każdego stosunku. Aby podać konkretny przykład, rozważ stosunek liczby absolwentów do liczby uczniów w szkole. Problem polega jednak na tym, że całkowita liczba uczniów różni się w dużym zakresie (1000-20000). Mniejszy

Szkoły wydają się mieć większy odsetek absolwentów, ale chcę go ujednolicić i nie pozwolić, aby wielkość szkoły wpływała na ranking. Czy jest na to sposób?

Matematycznie jest to stosunkowo proste. Najpierw dopasuj linię regresji do wykresu punktowego „całkowita liczba absolwentów” (y) vs „całkowita liczba studentów” (x). Prawdopodobnie zobaczysz opadającą linię, jeśli twoje twierdzenie jest poprawne (mniejsze szkoły kończą wyższy procent). Możesz zidentyfikować nachylenie i punkt przecięcia z osią y dla tej prostej, aby przekształcić ją w równanie y = mx + b, a następnie zrób trochę algebry, aby przekształcić równanie w znormalizowaną postać: „y / x = m + b / x”

Następnie, biorąc pod uwagę wszystkie współczynniki w danych, należy odjąć tę RHS:

współczynnik znormalizowany = (suma ocen / wszystkich uczniów) – (m + b / ogółem uczniów) Jeśli wynik jest pozytywny, to stosunek jest powyżej normy dla tej wielkości (tj. powyżej linii regresji), a jeśli jest ujemny, jest poniżej linia regresji. Jeśli chcesz mieć wszystkie liczby dodatnie, możesz dodać dodatnią stałą, aby przenieść wszystkie wyniki powyżej zera. Oto jak to zrobić matematycznie, ale sugeruję, abyś zastanowił się, czy z punktu widzenia analizy danych rozsądne jest znormalizowanie według wielkości szkoły. Zależy to od celu Twojej analizy, a konkretnie od tego, jak ten współczynnik jest analizowany w odniesieniu do innych danych.

Analiza wyników testów A / B, które nie mają rozkładu normalnego, przy użyciu niezależnego testu t

Mam zestaw wyników z testu A / B (jedna grupa kontrolna, jedna grupa cech), które nie pasują do rozkładu normalnego. W rzeczywistości dystrybucja bardziej przypomina dystrybucję Landau. Uważam, że niezależny test t wymaga, aby próbki miały przynajmniej w przybliżeniu rozkład normalny, co zniechęca mnie do stosowania testu t jako ważnej metody badania istotności. Ale moje pytanie brzmi: w którym momencie można powiedzieć, że test t nie jest dobrą metodą testowania istotności? Innymi słowy, jak można określić, jak wiarygodne są wartości p testu t, biorąc pod uwagę tylko zbiór danych?

Rozkład danych nie musi być normalny, to rozkład próbkowania musi być prawie normalny. Jeśli wielkość twojej próby jest wystarczająco duża, to rozkład próbkowania średnich z Rozkładu Landaua powinien być prawie normalny, ze względu na Centralne Twierdzenie Graniczne. Oznacza to, że powinieneś być w stanie bezpiecznie używać testu t ze swoimi danymi.

Przykład

Rozważmy ten przykład: załóżmy, że mamy populację z rozkładem lognormalnym z mu = 0 i sd = 0,5 (wygląda trochę podobnie do Landaua)

Więc próbkujemy 30 obserwacji 5000 razy z tego rozkładu za każdym razem obliczając średnią z próby

Wygląda całkiem normalnie, prawda? Jeśli zwiększymy wielkość próby, będzie to jeszcze bardziej widoczne

x = seq(0, 4, 0.05)

y = dlnorm(x, mean=0, sd=0.5)

plot(x, y, type=’l’, bty=’n’)

n = 30

m = 1000

set.seed(0)

samp = rep(NA, m)

for (i in 1:m) {

samp[i] = mean(rlnorm(n, mean=0, sd=0.5))

}

hist(samp, col=’orange’, probability=T, breaks=25, main=’sample size = 30′)

x = seq(0.5, 1.5, 0.01)

lines(x, dnorm(x, mean=mean(samp), sd=sd(samp)))

n = 300

samp = rep(NA, m)

for (i in 1:m) {

samp[i] = mean(rlnorm(n, mean=0, sd=0.5))

}

hist(samp, col=’orange’, probability=T, breaks=25, main=’sample size = 300′)

x = seq(1, 1.25, 0.005)

lines(x, dnorm(x, mean=mean(samp), sd=sd(samp)))J

[38][Python]

Python jest uniwersalnym, dynamicznym, silnie typowanym językiem z wieloma bibliotekami innych firm do zastosowań związanych z nauką danych. Obecnie są w powszechnym użyciu dwie wersje: 2 i 3. Python 2 jest „starą” wersją. Żadne nowe wersje nie są wydawane poza wersją 2.7, zapisz poprawki błędów. Python 3 to „nowa” wersja z aktywnym rozwojem. Składnia języka Python jest stosunkowo łatwa do zrozumienia w porównaniu do innych języków. Na przykład:

numbers = [1, 2, 5, 8, 9]

for number in numbers:

print(“Hello world #”, numbe

Python ma czysty wygląd dzięki regulacyjnemu podejściu do białych znaków. Choć pozornie restrykcyjny, pozwala wszystkim kodom Pythona wyglądać podobnie, co sprawia, że ​​sprawdzanie kodu jest znacznie bardziej przewidywalne. Wszystkie pętle i warunki warunkowe (for, while, if itp.) Muszą być wcięte dla następnego bloku kodu. Popularne pakiety nauki i danych obejmują:

Numpy – szybka biblioteka tablic N-wymiarowych; podstawa wszystkich naukowych Python.

Scipy – Analiza numeryczna oparta na Numpy. Pozwala na optymalizację, algebrę liniową, transformaty Fouriera i wiele innych.

Pandas (PANel DAta) – Szybki i niezwykle elastyczny pakiet, który jest bardzo przydatny do eksploracji danych. Obsługuje dane NaN oraz szybkie indeksowanie. Obsługuje szeroką gamę zewnętrznych typów danych i formatów plików.

PYTANIA:

Co wziąć pod uwagę przed nauczeniem się nowego języka do analizy danych

Obecnie jestem na bardzo wczesnym etapie przygotowywania nowego projektu badawczego (wciąż na etapie wniosku o finansowanie) i oczekuję, że narzędzia do analizy danych, a zwłaszcza wizualizacji, odegrają rolę w tym projekcie. W związku z tym stoję przed następującym dylematem: czy powinienem nauczyć się języka Python, aby móc korzystać z jego obszernych bibliotek naukowych (Pandas, Numpy, Scipy,…), czy powinienem po prostu zanurzyć się w podobnych pakietach języka, który już znam (Rakieta, czy w mniejszym stopniu Scala)? (Idealnie uczyłbym się Pythona równolegle z korzystaniem z bibliotek statystycznych w Racket, ale nie jestem pewien, czy będę miał czas na jedno i drugie). Nie szukam odpowiedzi na ten dylemat, ale raczej opinii na temat moich różnych rozważań:

Moja obecna pozycja jest następująca:

Na korzyść Pythona:

– Intensywnie używane biblioteki

– Szeroko stosowany (może być decydujący w przypadku współpracy z innymi)

-Dużo materiałów online, aby rozpocząć naukę

-Konferencje, które są specjalnie poświęcone obliczeniom naukowym w języku Python

– Nauka Python i tak nie będzie stratą czasu

Na korzyść języka, który już znam:

-To sposób na pogłębienie mojej znajomości jednego języka zamiast powierzchownej znajomości jeszcze jednego języka (pod dewizą: powinieneś przynajmniej dobrze znać jeden język)

-To jest wykonalne. Zarówno rakieta, jak i Scala mają dobre biblioteki matematyczne i statystyczne

– Mogę od razu zacząć uczyć się tego, co muszę wiedzieć, niż najpierw nauczyć się podstaw

Dwa konkretne pytania:

  1. O czym zapominam?
  2. Na ile uciążliwy może być problem Python 2 vs 3?

ODPOWIEDZI:

Osobiście zamierzam tutaj mocno argumentować na korzyść Pythona. Jest wiele przyczyn tego, ale zamierzam oprzeć się na niektórych punktach, o których wspominali tutaj inni ludzie:

  1. Wybór jednego języka: zdecydowanie można mieszać i dopasowywać języki, wybierając d3 dla potrzeb wizualizacji, FORTRAN dla szybkich mnożeń macierzy i python dla całej sieci i skryptów. Możesz to zrobić wzdłuż linii, ale utrzymanie możliwie najprostszego stosu to dobry ruch, szczególnie na początku.
  2. Wybieranie czegoś większego od ciebie: nigdy nie chcesz naciskać na bariery języka, którego chcesz używać. Jest to ogromny problem, jeśli chodzi o języki takie jak Julia i FORTRAN, które po prostu nie oferują pełnej funkcjonalności języków takich jak Python lub R.
  3. Wybierz społeczność: Jedną z najtrudniejszych rzeczy do znalezienia w dowolnym języku jest społeczność. Python jest tutaj wyraźnym zwycięzcą. Jeśli utkniesz, poprosisz o coś na SO, a ktoś odpowie w ciągu kilku minut, czego po prostu nie ma w przypadku większości innych języków. Jeśli uczysz się czegoś w próżni, po prostu uczysz się dużo wolniej.

Jeśli chodzi o punkty ujemne, mogę je odepchnąć. Pogłębienie znajomości jednego języka jest dobrym pomysłem, ale znajomość tylko jednego języka bez praktyki uogólniania tej wiedzy na inne języki jest dobrym sposobem na zastrzelenie się w stopę. Zmieniłem cały mój ulubiony stos programistyczny trzy razy przez wiele lat, przechodząc z MATLAB na Javę na Haskell na Python. Nauka przenoszenia wiedzy na inny język jest o wiele bardziej cenna niż znajomość jednego. O ile to wykonalne, będzie to coś, co zobaczysz wielokrotnie w każdej karierze programistycznej. Kompletność Turinga oznacza, że ​​możesz technicznie zrobić wszystko z HTML4 i CSS3, ale chcesz wybrać odpowiednie narzędzie do pracy. Jeśli zobaczysz idealne narzędzie i zdecydujesz się je zostawić na poboczu, zwolnisz, żałując, że nie masz narzędzi, które zostawiłeś. Świetnym przykładem tego ostatniego punktu jest próba wdrożenia kodu R. Ogromnie brakuje możliwości sieciowych R w porównaniu do Pythona, a jeśli chcesz wdrożyć usługę lub użyć nieco nietypowych pakietów ścieżek, fakt, że pip ma o rząd wielkości więcej pakietów niż CRAN, jest ogromną pomocą .

Z mojego doświadczenia wynika, że ​​o platformie analizy danych należy pamiętać:

  1. Czy może obsłużyć rozmiar potrzebnych mi danych? Jeśli twoje zestawy danych mieszczą się w pamięci, zwykle nie ma większych problemów, chociaż AFAIK Python jest nieco bardziej wydajny pod względem pamięci niż R. Jeśli potrzebujesz obsługiwać zestawy danych większe niż pamięć, platforma musi sobie z tym poradzić. W takim przypadku SQL obejmuje podstawowe statystyki, Python + Apache Spark to kolejna opcja.
  2. Czy platforma pokrywa wszystkie moje potrzeby w zakresie analizy? Największą irytacją, jaką spotkałem w projektach eksploracji danych, jest konieczność żonglowania kilkoma narzędziami, ponieważ narzędzie A dobrze radzi sobie z połączeniami internetowymi, narzędzie B wykonuje statystyki, a narzędzie C wyświetla ładne zdjęcia. Chcesz, aby wybrana przez ciebie broń obejmowała jak najwięcej aspektów twoich projektów. Rozważając ten problem, Python jest bardzo obszerny, ale R ma wiele wbudowanych testów statystycznych gotowych do użycia, jeśli tego potrzebujesz.

Narzędzia i protokół do powtarzalnej analizy danych za pomocą Pythona.

Pracuję nad projektem nauki danych przy użyciu Pythona. Projekt składa się z kilku etapów. Każdy etap obejmuje pobranie zestawu danych, użycie skryptów Python, danych pomocniczych, konfiguracji i parametrów oraz utworzenie innego zestawu danych. Przechowuję kod w git, więc ta część jest objęta. Chciałbym usłyszeć o:

  1. Narzędzia do kontroli wersji danych.
  2. Narzędzia umożliwiające odtworzenie etapów i eksperymentów.
  3. Protokół i sugerowana struktura katalogów dla takiego projektu.
  4. Zautomatyzowane narzędzia do budowania / uruchamiania.

Odkąd zacząłem prowadzić badania w środowisku akademickim, ciągle szukałem satysfakcjonującego przepływu pracy. Myślę, że w końcu znalazłem coś, z czego jestem zadowolony:

1) Poddaj wszystko kontroli wersji, np. Git: W projektach badań hobby korzystam z GitHub, do badań w pracy korzystam z prywatnego GitLab serwer dostarczany przez naszą uczelnię. Tam też przechowuję moje zbiory danych.

2) Większość moich analiz wykonuję wraz z dokumentacją dotyczącą notebooków IPython. Dla mnie bardzo dobrze jest zorganizować kod, wykresy i dyskusję / wnioski w jednym dokumencie. Jeśli uruchamiam większe skrypty, zwykle umieszczam je w osobnych plikach skryptowych .py, ale nadal je wykonuję z notesu IPython poprzez magię% run, aby dodać informacje o celu, wyniku i innych parametrach. Napisałem małe rozszerzenie o komórkowej magii dla notebooków IPython i IPython, zwane „znakiem wodnym”, którego używam do wygodnego tworzenia znaczników czasu i śledzenia

Najlepszym narzędziem odtwarzalności jest rejestrowanie twoich działań, mniej więcej tak: eksperyment / wejście; spodziewany ; obserwacja / wynik; aktualna hipoteza i jeśli jest obsługiwana lub odrzucona exp1; oczekiwany 1; obs1; obsługiwana kilka fantazyjnych hipotez Można to zapisać na papierze, ale jeśli twoje eksperymenty mieszczą się w środowisku obliczeniowym, możesz użyć narzędzi obliczeniowych do częściowej lub całkowitej automatyzacji tego procesu rejestrowania (szczególnie poprzez pomoc w śledzeniu wejściowych zestawów danych, które mogą być ogromne, a dane wyjściowe). Świetnym narzędziem odtwarzalności dla Pythona o niskiej krzywej uczenia się jest oczywiście Notatnik IPython / Jupyter (nie zapomnij o% logon i% logstart magics). Innym doskonałym narzędziem, które jest bardzo aktualne (2015), jest przepis, który jest bardzo podobny do sumatry (patrz poniżej), ale został stworzony specjalnie dla Pythona. Nie wiem, czy to działa z notatnikami Jupyter, ale wiem, że autor często z nich korzysta, więc sądzę, że jeśli nie jest obecnie obsługiwany, będzie w przyszłości. Git jest także niesamowity i nie jest powiązany z Pythonem. Pomoże ci to nie tylko zachować historię wszystkich twoich eksperymentów, kodu, zestawów danych, rycin itp., Ale także zapewni ci narzędzia do utrzymywania (git kilof), współpracy (obwinianie) i debugowania (git-bisect) przy użyciu naukowych metoda debugowania (zwana debugowaniem delta). Oto historia fikcji

badacz próbuje stworzyć własny system rejestrowania eksperymentów, dopóki nie stanie się on kopią Gita. Innym ogólnym narzędziem współpracującym z dowolnym językiem (z API Pythona na pypi) jest Sumatra, która została specjalnie zaprojektowana, aby pomóc Ci w przeprowadzaniu badań powtarzalnych (powtarzalnych)

Ma na celu uzyskanie takich samych wyników, biorąc pod uwagę dokładnie ten sam kod i oprogramowanie, podczas gdy odtwarzalność ma na celu uzyskanie takich samych wyników dla dowolnego nośnika, co jest o wiele trudniejsze, czasochłonne i niemożliwe do zautomatyzowania. Oto jak działa Sumatra: dla każdego eksperymentu przeprowadzanego przez Sumatrę oprogramowanie to będzie działać jak „zapisywanie stanu gry” często występujące w grach wideo. Dokładniej, pozwoli to zaoszczędzić:

* wszystkie parametry, które podałeś;

* dokładny stan kodu źródłowego całej eksperymentalnej aplikacji i plików konfiguracyjnych;

* dane wyjściowe / wykresy / wyniki, a także każdy plik wygenerowany przez aplikację eksperymentalną.

Następnie zbuduje bazę danych ze znacznikiem czasu i innymi metadatami dla każdego eksperymentu, które można później przeszukiwać za pomocą webGUI. Ponieważ Sumatra zapisała pełny stan aplikacji dla określonego eksperymentu w jednym określonym momencie, możesz przywrócić kod, który dał określony wynik w dowolnym momencie, dzięki czemu masz powtarzalne badania przy niskim koszcie (z wyjątkiem przechowywania, jeśli pracujesz na ogromnych zestawach danych, ale możesz skonfigurować wyjątki, jeśli nie chcesz zapisywać wszystkiego za każdym razem).

W końcu możesz użyć Git lub Sumatry, zapewnią one tę samą moc powtarzalności, ale Sumatra jest specjalnie dostosowana do badań naukowych, więc zapewnia kilka fantazyjnych narzędzi, takich jak internetowy interfejs GUI, do indeksowania twoich wyników, podczas gdy Git jest bardziej dostosowany do obsługi kodu (ale ma narzędzia do debugowania, takie jak git-bisect, więc jeśli masz eksperymenty obejmujące kody, może być lepiej). Lub oczywiście możesz użyć obu! / EDIT: dsign dotknął tutaj bardzo ważnej kwestii: powtarzalność konfiguracji jest równie ważna jak replikacja aplikacji. Innymi słowy, powinieneś przynajmniej podać pełną listę używanych bibliotek i kompilatorów wraz z ich dokładnymi wersjami i szczegóły twojej platformy. Osobiście w informatyce naukowej w Pythonie odkryłem, że pakowanie aplikacji wraz z bibliotekami jest po prostu zbyt bolesne, dlatego teraz po prostu używam uniwersalnego naukowego pakietu python, takiego jak Anaconda (z doskonałym menedżerem pakietów conda), i po prostu doradzam użytkownikom korzystanie z tego samego pakietu. Innym rozwiązaniem może być dostarczenie skryptu do automatycznego generowania virtualenv lub spakowanie wszystkiego przy użyciu komercyjnej aplikacji Docker, cytowanej przez dsign lub Vagrant z open source (na przykład pylearn2-in-a-box, które używają Vagrant do stworzenia łatwo redystrybucyjnej dystrybucji pakiet środowiska wirtualnego). / EDIT2: Oto świetne wideo podsumowujące (do debugowania, ale można je również zastosować do badań), co jest fundamentem do przeprowadzenia powtarzalnych badań: rejestrowanie eksperymentów i poszczególnych etapów metody naukowej, rodzaj „jawnego eksperymentowania”.

Koniecznie sprawdź dokera! Ogólnie rzecz biorąc, wszystkie inne dobre rzeczy, które inżynieria oprogramowania tworzyła przez dziesięciolecia w celu zapewnienia izolacji i odtwarzalności. Chciałbym podkreślić, że nie wystarczy mieć powtarzalne przepływy pracy, ale także łatwe do odtworzenia przepływy pracy. Pokażę, co mam na myśli. Załóżmy, że twój projekt używa Pythona, bazy danych X i Scipy. Z pewnością będziesz używać konkretnej biblioteki do łączenia się z bazą danych z Pythona, a Scipy z kolei będzie używać rzadkich procedur algebraicznych. Jest to z pewnością bardzo prosta konfiguracja, ale nie do końca łatwa w konfiguracji, przewidziana gra słów. Jeśli ktoś chce wykonać twoje skrypty, będzie musiał zainstalować wszystkie zależności. Lub, co gorsza, mogła mieć już zainstalowane niekompatybilne wersje. Naprawienie tych rzeczy wymaga czasu. Zajmie ci to również trochę czasu, jeśli będziesz musiał przenieść swoje obliczenia do klastra, innego klastra lub niektórych serwerów w chmurze. Tutaj uznaję dokera za użyteczny. Docker to sposób na sformalizowanie i skompilowanie przepisów dla środowisk binarnych. Możesz zapisać następujące pliki w pliku dockerfile (używam tutaj zwykłego angielskiego zamiast składni Dockerfile):

* Zacznij od podstawowego środowiska binarnego, takiego jak Ubuntu

* Zainstaluj libsparse-dev

* Zainstaluj numpy i scipy

* Zainstaluj X

* Zainstaluj libX-dev

*  Zainstaluj Python-X

* Zainstaluj IPython-Notebook

* Skopiuj moje skrypty / notesy Pythona do mojego środowiska binarnego, tych plików danych i tych konfiguracji, aby wykonywać inne czynności. Aby zapewnić odtwarzalność, skopiuj je z nazwanego adresu URL zamiast pliku lokalnego.

* Może uruchomić IPython-Notebook.

Niektóre linie będą instalowały różne rzeczy w Pythonie przy użyciu pip, ponieważ pip może wykonać bardzo czystą pracę przy wyborze konkretnych wersji pakietów. Sprawdź to też! I to wszystko. Jeśli po utworzeniu pliku Dockerfile można go zbudować, może go zbudować w dowolnym miejscu, przez kogokolwiek (pod warunkiem, że mają one również dostęp do plików specyficznych dla projektu, np. Ponieważ umieścisz je w publicznym adresie URL, do którego odwołuje się plik Dockerfile). Co jest najlepsze, może przesłać powstałe środowisko (zwane „obrazem”) na publiczny lub prywatny serwer (zwany „rejestrem”), z którego mogą korzystać inne osoby. Tak więc, kiedy publikujesz swój przepływ pracy, masz zarówno w pełni powtarzalny przepis w postaci pliku Docker, jak i łatwy sposób dla ciebie lub innych osób na odtworzenie tego, co robisz:

docker run dockerregistery.thewheezylab.org/nowyouwillbelieveme

Lub jeśli chcą się bawić w twoje skrypty i tak dalej:

dockerregistery.thewheezylab.org/nowyouwillbelieveme /bin/bash

Gradient stochastyczny w oparciu o operacje wektorowe?

Załóżmy, że chcę trenować algorytm regresji spadku gradientu stochastycznego przy użyciu zestawu danych zawierającego N próbek. Ponieważ rozmiar zestawu danych jest ustalony, ponownie użyję danych T razy. Przy każdej iteracji lub „epoce” używam każdej próbki treningowej dokładnie raz po losowym uporządkowaniu całego zestawu treningowego. Moja implementacja oparta jest na Pythonie i Numpy. Dlatego przy użyciu operacji wektorowych może znacznie skrócić czas obliczeń. Wymyślenie wektorowej implementacji opadania gradientu wsadowego jest dość proste. Jednak w przypadku stochastycznego spadku gradientu nie mogę dowiedzieć się, jak uniknąć zewnętrznej pętli, która przechodzi przez wszystkie próbki w każdej epoce. Czy ktoś zna wektoryzowaną implementację stochastycznego spadku gradientu?

EDYCJA: Zostałem zapytany, dlaczego chciałbym korzystać z opadania gradientu online, jeśli rozmiar mojego zestawu danych jest stały.

Opadanie gradientu online zbiega się wolniej niż opadanie gradientu wsadowego do minimum kosztów empirycznych. Jednak zbiega się szybciej do minimum oczekiwanego kosztu, który mierzy wydajność uogólnienia. Chciałbym przetestować wpływ tych teoretycznych wyników w moim konkretnym problemie za pomocą weryfikacji krzyżowej. Bez implementacji wektoryzacyjnej mój kod zejścia gradientowego w trybie online jest znacznie wolniejszy niż kod partii z gradientowym spadkiem. To znacznie wydłuża czas potrzebny na zakończenie procesu weryfikacji krzyżowej.

Method: on-line gradient descent (regression)

Input: X (nxp matrix; each line contains a training sample, represented as a length-p vector), Y (length-n vector; Output: A (length-p+1 vector of coefficients)

Initialize coefficients (assign value 0 to all coefficients)

Calculate outputs F

prev_error = inf

error = sum((F-Y)^2)/n

it = 0

while abs(error – prev_error)>ERROR_THRESHOLD and it<=MAX_ITERATIONS:

Randomly shuffle training samples

for each training sample i:

Compute error for training sample i

Update coefficients based on the error above

prev_error = error

Calculate outputs F

error = sum((F-Y)^2)/n

it = it + 1

Po pierwsze, słowo „próbka” jest zwykle używane do opisania podgrupy populacji, więc będę odnosił się do tego samego co „przykład”. Twoja implementacja SGD jest powolna z powodu tej linii:

for each training example i:

Tutaj jawnie używasz dokładnie jednego przykładu dla każdej aktualizacji parametrów modelu. Z definicji wektoryzacja jest techniką przekształcania operacji na jednym elemencie na operacje na wektorze takich elementów. Dlatego nie możesz przetwarzać przykładów jeden po drugim i nadal używać wektoryzacji. Możesz jednak oszacować rzeczywistą wartość SGD za pomocą mini-partii. Mini-partia to niewielki podzbiór oryginalnego zestawu danych (powiedzmy 100 przykładów). Obliczasz błędy i aktualizacje parametrów na podstawie mini-partii, ale wciąż iterujesz wiele z nich bez globalnej optymalizacji, co czyni proces stochastycznym. Aby więc znacznie przyspieszyć wdrożenie, wystarczy zmienić poprzednią linię na:

batches = split dataset into mini-batches

for batch in batches:

i obliczyć błąd z partii, a nie z jednego przykładu. Choć dość oczywiste, powinienem również wspomnieć o wektoryzacji na poziomie poszczególnych przykładów. Oznacza to, że zamiast czegoś takiego:

theta = np.array([…]) # parameter vector

x = np.array([…]) # example

y = 0 # predicted response

for i in range(len(example)):

y += x[i] * theta[i]

error = (true_y – y) ** 2 # true_y – true value of response

you should definitely do something like this:

error = (true_y – sum(np.dot(x, theta))) ** 2

which, again, easy to generalize for mini-batches:

true_y = np.array([…]) # vector of response values

X = np.array([[…], […]]) # mini-batch

errors = true_y – sum(np.dot(X, theta), 1)

error = sum(e ** 2 for e in errors)

Sprawdź metodę częściowego dopasowania klasyfikatora SGD firmy scikit. Masz kontrolę nad tym, co nazywasz: możesz to zrobić „prawdziwą” nauką online, przekazując instancję na raz, lub możesz grupować instancje w mini-partie, jeśli wszystkie dane są dostępne w tablicy. Jeśli tak, możesz pokroić tablicę, aby uzyskać minibatche.

Problem optymalizacji szeregów czasowych Pandy: dodaj rok

Mam pand DataFrame zawierającą kolumnę szeregów czasowych. Lata są przesunięte w przeszłości, więc muszę dodać stałą liczbę lat do każdego elementu tej kolumny. Najlepszym sposobem, jaki znalazłem, jest iteracja wszystkich zapisów i wykorzystanie

x.replace (year = x.year + years) # x = bieżący element, lata = lata do dodania Jest cytonizowany jak poniżej, ale nadal bardzo wolny (proofing)

cdef list _addYearsToTimestamps(list elts, int years):

cdef cpdatetime x

cdef int i

for (i, x) in enumerate(elts):

try:

elts[i] = x.replace(year=x.year + years)

except Exception as e:

logError(None, “Cannot replace year of %s – leaving value as this: %s” % (str(x), repr(e)))

return elts

def fixYear(data):

data.loc[:, ‘timestamp’] = _addYearsToTimestamps(list(data.loc[:, ‘timestamp’]), REAL_YEAR-(list(data[-1:][‘return data

Jestem pewien, że istnieje sposób na zmianę roku bez iteracji, korzystając z funkcji Pandas Timestamp. Niestety nie wiem jak. Czy ktoś mógłby opracować?

Utwórz obiekt Pimed Timedelta, a następnie dodaj za pomocą operatora + =:

x = pandas.Timedelta(days=365)

mydataframe.timestampcolumn += x

Kluczem jest więc przechowywanie szeregów czasowych jako znaczników czasu. Aby to zrobić, użyj funkcji pandy to_datetime:

mydataframe[‘timestampcolumn’] = pandas.to_datetime(x[‘epoch’], unit=’s’)

zakładając, że masz znaczniki czasu jako epokowe sekundy w ramce danych x. Oczywiście nie jest to wymóg; zobacz dokumentację to_datetime, aby przekonwertować inne formaty.

Oto implementacja rozwiązania i demonstracja.

#!/usr/bin/env python3

import random

import pandas

import time

import datetime

def getRandomDates(n):

tsMin = time.mktime(time.strptime(“1980-01-01 00:00:00”, “%Y-%m-%d %H:%M:%S”))

tsMax = time.mktime(time.strptime(“2005-12-31 23:59:59”, “%Y-%m-%d %H:%M:%S”))

return pandas.Series([datetime.datetime.fromtimestamp(tsMin + random.random() * (tsMax – tsMin)) for x in def setMaxYear(tss, target):

maxYearBefore = tss.max().to_datetime().year

# timedelta cannot be given in years, so we compute the number of days to add in the next line

deltaDays = (datetime.date(target, 1, 1) – datetime.date(maxYearBefore, 1, 1)).days

return tss + pandas.Timedelta(days=deltaDays)

data = pandas.DataFrame({‘t1’: getRandomDates(1000)})

data[‘t2’] = setMaxYear(data[‘t1’], 2015)

data[‘delta’] = data[‘t2’] – data[‘t1’]

print(data)

print(“delta min: %s” % str(min(data[‘delta’])))

print(“delta max: %s” % str(max(data[‘delta’])))

Jak rozpoznać dwuczęściowy termin, gdy przestrzeń zostanie usunięta?

(„Bigdata” i „big data”)

Nie jestem facetem NLP i mam to pytanie.

Mam tekstowy zestaw danych zawierający terminy, które wyglądają jak „duże dane” i „duże dane”. Dla mnie oba są takie same. Jak mogę je wykryć w języku NLTK (Python)? Lub jakikolwiek inny moduł NLP w Pythonie?

Jest miła implementacja tego w gensim:

http://radimrehurek.com/gensim/models/phrases.html

Zasadniczo wykorzystuje podejście oparte na danych do wykrywania fraz, tj. wspólne kolokacje. Jeśli więc nakarmisz klasę fraz kilka zdań, a wyrażenie „duże dane” pojawi się bardzo często, klasa nauczy się łączyć „big data” w pojedynczy token „big_data”.

Wyodrębnianie obrazów w Pythonie

W mojej klasie muszę utworzyć aplikację przy użyciu dwóch klasyfikatorów, aby zdecydować, czy obiekt na obrazie jest przykładem phylum porifera (seasponge) czy jakiegoś innego obiektu. Jestem jednak całkowicie zagubiony, jeśli chodzi o techniki ekstrakcji funkcji w pythonie. Mój doradca przekonał mnie do korzystania ze zdjęć, które nie były omówione w klasie. Czy ktoś może skierować mnie w stronę sensownej dokumentacji lub lektury lub zasugerować metody do rozważenia?

Ten świetny samouczek obejmuje podstawy neuronowych układów splotowych, które obecnie osiągają najnowszą wydajność w większości zadań związanych z widzeniem: http://deeplearning.net/tutorial/lenet.html

Istnieje wiele opcji dla CNN w Pythonie, w tym Theano i biblioteki zbudowane na nim (uważam, że keras jest łatwy w użyciu).

Jeśli wolisz unikać głębokiego uczenia się, możesz zajrzeć do OpenCV, który może nauczyć się wielu innych rodzajów funkcji, kaskad Haar i funkcji SIFT.

Parametry Hypertuning XGBoost

XGBoost wykonał świetną robotę, jeśli chodzi o radzenie sobie zarówno z kategorycznymi, jak i ciągłymi zmiennymi zależnymi. Ale jak wybrać zoptymalizowane parametry dla problemu XGBoost?

Oto jak zastosowałem parametry do ostatniego problemu Kaggle:

param <- list( objective = “reg:linear”,

booster = “gbtree”,

eta = 0.02, # 0.06, #0.01,

max_depth = 10, #changed from default of 8

subsample = 0.5, # 0.7

colsample_bytree = 0.7, # 0.7

num_parallel_tree = 5

# alpha = 0.0001,

# lambda = 1

)

clf <- xgb.train( params = param,

data = dtrain,

nrounds = 3000, #300, #280, #125, #250, # changed from 300

verbose = 0,

early.stop.round = 100,

watchlist = watchlist,

maximize = FALSE,

feval=RMPSE

)

Wszystko, co robię, aby eksperymentować, to losowo (intuicyjnie) wybrać inny zestaw parametrów, aby poprawić wynik. Czy w ogóle automatyzuję wybór zoptymalizowanego (najlepszego) zestawu parametrów? (Odpowiedzi mogą być w dowolnym języku. Po prostu szukam techniki)

Ilekroć pracuję z xgboost, często dokonuję własnego wyszukiwania parametrów homebrew, ale możesz to zrobić za pomocą pakietu caret, takiego jak wspomniany wcześniej KrisP.

  1. Caret

Zobacz tę odpowiedź na Cross Validated, aby uzyskać dokładne wyjaśnienie, jak korzystać z pakietu Caret do wyszukiwania hiperparametrów na xgboost. Jak dostroić hiperparametry drzew xgboost?

  1. Niestandardowe wyszukiwanie w siatce

Często zaczynam od kilku założeń opartych na slajdach Owena Zhanga na temat wskazówek dotyczących analizy danych

Tutaj możesz zobaczyć, że przede wszystkim musisz dostroić próbkowanie wierszy, próbkowanie kolumn i być może maksymalną głębokość drzewa. Oto jak wykonuję niestandardowe próbkowanie wierszy i próbkowanie kolumn w poszukiwaniu problemu, nad którym obecnie pracuję:

searchGridSubCol <- expand.grid (podpróbka = c (0,5, 0,75, 1),

colsample_bytree = c (0,6, 0,8, 1))

ntrees <- 100

#Buduj obiekt xgb.DMatrix

DMMatrixTrain <- xgb.DMatrix (data = yourMatrix, label = yourTarget)

rmseErrorsHyperparameters <- zastosuj (searchGridSubCol, 1, funkcja (parameterList) {

#Extract Parametry do przetestowania

currentSubsampleRate <- parameterList [[„subsample”]]

currentColsampleRate <- parameterList [[“colsample_bytree”]]

xgboostModelCV <- xgb.cv (data = DMMatrixTrain, nrounds = ntrees, nfold = 5, showsd = TRUE,

metrics = “rmse”, verbose = TRUE, “eval_metric” = “rmse”,

„cel” = „reg: liniowy”, „maks. głębokość” = 15, „eta” = 2 / ntrees,

„subsample” = currentSubsampleRate, „colsample_bytree” = currentColsampleRate)

xvalidationScores <- as.data.frame (xgboostModelCV)

# Zapisz rmse ostatniej iteracji

rmse <- tail (xvalidationScores $ test.rmse.mean, 1)

return (c (rmse, currentSubsampleRate, currentColsampleRate))

})

W połączeniu z pewną magią ggplot2, korzystając z wyników tej funkcji zastosuj, możesz wykreślić graficzną reprezentację wyszukiwania.

Na tym wykresie jaśniejsze kolory oznaczają mniejszy błąd, a każdy blok reprezentuje unikalną kombinację próbkowania kolumn i próbkowania wierszy. Więc jeśli chcesz przeprowadzić dodatkowe wyszukiwanie powiedzmy eta (lub głębokość drzewa), skończysz z jednym z tych wykresów dla każdego testowanego parametru eta. Widzę, że masz inną metrykę oceny (RMPSE), po prostu podłącz ją do funkcji weryfikacji krzyżowej, a otrzymasz pożądany wynik. Poza tym nie martwiłbym się zbytnio dopracowaniem innych parametrów, ponieważ nie poprawi to zbytnio wydajności, a przynajmniej nie tak dużo w porównaniu do poświęcania więcej czasu na funkcje techniczne lub czyszczenie danych.

  1. Inne

Możliwe jest również wyszukiwanie losowe i wybór parametrów bayesowskich, ale jeszcze nie znalazłem ich implementacji.

Budowanie modelu uczenia maszynowego w celu przewidywania plonów na podstawie danych środowiskowych

Mam zestaw danych zawierający dane dotyczące temperatury, opadów i plonów soi dla gospodarstwa przez 10 lat (2005–2014). Na podstawie tych danych chciałbym przewidzieć rentowności w 2015 r. Należy pamiętać, że zestaw danych zawiera DZIENNE wartości temperatury i opadów, ale tylko 1 wartość rocznie dla plonu, ponieważ zbiory plonów odbywają się pod koniec sezonu wegetacyjnego zbiorów. Chcę zbudować regresję lub inny model oparty na uczeniu maszynowym, aby przewidzieć plony w 2015 r., W oparciu o regresję / jakiś inny model wyprowadzony z badania zależności między wydajnościami a temperaturą i opadami w poprzednich latach.

Znam się na uczeniu maszynowym za pomocą scikit-learn. Nie wiem jednak, jak przedstawić ten problem. Problem polega na tym, że temperatura i opady są codzienne, ale wydajność wynosi tylko 1 wartość rocznie. Jak do tego podejść?

Na początek możesz przewidzieć wydajność w nadchodzącym roku na podstawie dziennych danych z poprzedniego roku. Możesz oszacować parametry modelu, biorąc pod uwagę wartość każdego roku jako jeden „punkt”, a następnie zweryfikuj model za pomocą walidacji krzyżowej. Możesz to przedłużyć model, biorąc pod uwagę więcej niż w ubiegłym roku, ale spójrz za daleko, a będziesz mieć problemy z weryfikacją modelu i stroju.

Popraw dokładność k-średnich

Nasza broń:

Eksperymentuję z K-średnich i Hadoopem, gdzie jestem przywiązany do tych opcji z różnych powodów (np. Pomóż mi wygrać tę wojnę!).

Pole bitwy:

Mam artykuły należące do kategorii c, w których c jest naprawione. Wektoryzuję zawartość artykułów do funkcji TF-IDF. Teraz używam naiwnego algorytmu k-średnich, który zaczyna c centroidy i rozpoczyna iteracyjnie grupowanie artykułów (tj. Wiersze macierzy TF-IDF, gdzie można zobaczyć, jak to zbudowałem), aż do pojawienia się converenge.

Specjalne notatki:

  1. Początkowe centroidy: Wypróbowane losowo z każdej kategorii lub ze średniej wszystkich artykułów z każdej kategorii.
  2. Funkcja odległości: euklidesowa.

Dokładność jest niska, zgodnie z oczekiwaniami, czy mogę zrobić coś lepszego, dokonując innego wyboru dla początkowych centroidów, i / lub wybierając inną funkcję odległości?

print „Hello Data Science site!” 🙂

Sposób skonfigurowania tego eksperymentu ma dla mnie sens z punktu widzenia projektowania, ale myślę, że jest jeszcze kilka aspektów, które można jeszcze zbadać. Po pierwsze, możliwe, że nieinformacyjne funkcje odwracają uwagę twojego klasyfikatora, prowadząc do gorszych wynikówi. W analizie tekstu często mówimy o zatrzymaniu filtrowania słów, która jest po prostu procesem usuwania takiego tekstu (np., I, lub, itp.). Istnieją standardowe listy słów stop, które można łatwo znaleźć w Internecie (np. Ten), ale czasami mogą być trudne. Najlepszym rozwiązaniem jest zbudowanie tabeli powiązanej z częstotliwością funkcji w zależności od klasy, ponieważ uzyska ona funkcje specyficzne dla domeny, których prawdopodobnie nie znajdziesz w takich tabelach przeglądowych. Istnieją różne dowody na skuteczność usuwania słów zatrzymanych w literaturze, ale myślę, że te odkrycia dotyczą głównie specyficznych dla klasyfikatora (na przykład, na maszynach wektorów pomocniczych zwykle mniej wpływają nieinformacyjne cechy niż naiwne Bayes klasyfikator. Podejrzewam, że k-średnie należy do tej drugiej kategorii). Po drugie, możesz rozważyć inne podejście do modelowania obiektów niż tf-idf. Nic przeciwko tf-idf – działa dobrze w przypadku wielu problemów – ale lubię zacząć od modelowania funkcji binarnych, chyba że mam eksperymentalne dowody wskazujące, że bardziej złożone podejście prowadzi do lepszych wyników. To powiedziawszy, możliwe jest, że k-średnie mogłyby dziwnie zareagować na zmianę z przestrzeni zmiennoprzecinkowej na binarną. Jest to z pewnością łatwo sprawdzalna hipoteza! Na koniec możesz spojrzeć na oczekiwany rozkład klas w swoim zestawie danych. Czy wszystkie klasy są jednakowo prawdopodobne? Jeśli nie, możesz uzyskać lepsze wyniki albo z próbkowania, albo z innej miary odległości. Wiadomo, że k-średnich reaguje słabo w przekrzywionych sytuacjach klasowych, więc jest to również kwestia do rozważenia! Prawdopodobnie w Twojej domenie dostępne są badania opisujące, jak inni poradzili sobie z tą sytuacją.

[37][Klastrowanie]

PYTANIA

Grupowanie unikalnych użytkowników według useragent, ip, session_id

Biorąc pod uwagę dane dostępu do witryny w postaci session_id, ip, user_agent i opcjonalnie znacznik czasu, zgodnie z poniższymi warunkami, w jaki sposób najlepiej zgrupować sesje w unikalnych użytkowników? session_id: to identyfikator nadawany każdemu nowemu odwiedzającemu. Nie wygasa jednak, jeśli użytkownik nie akceptuje plików cookie / usuwa pliki cookie / zmienia przeglądarkę / zmienia urządzenie, nie będzie już rozpoznawany Adres IP może być współużytkowany przez różnych użytkowników (Wyobraź sobie darmową kawiarnię Wi-Fi lub zmianę adresu IP przez Twojego dostawcę usług internetowych), i często będą mieli co najmniej 2, dom i praca. User_agent to wersja przeglądarki + systemu operacyjnego, umożliwiająca rozróżnienie urządzeń. Na przykład użytkownik prawdopodobnie będzie korzystał zarówno z telefonu, jak i laptopa, ale raczej nie będzie korzystał z laptopów z systemem Windows i Apple. Jest mało prawdopodobne, aby ten sam identyfikator sesji miał wielu użytkowników.

Oczywiście mówimy o założeniach, ale chodzi o to, aby zbliżyć się do rzeczywistości tak, jak to możliwe. Na przykład, jeśli napotkamy ten sam adres IP i identyfikator użytkownika w ograniczonym przedziale czasowym z innym identyfikatorem session_id, można założyć, że jest to ten sam użytkownik, z pewnymi wyjątkami dotyczącymi krawędzi.

Edycja: język, w którym problem został rozwiązany, nie ma znaczenia, dotyczy głównie logiki, a nie implementacji. Pseudokod jest w porządku.

Edycja: ze względu na powolny charakter skrzypiec możesz alternatywnie czytać / uruchamiać mysql:

select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id

from

(select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr

from

(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5

union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a

join

(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5

union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b

order by 1

)d

inner join

(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5

union all select 6 union all select 7 union all select 8 union all select 9 )e

on d.nr>=e.nr

ODPOWIEDZI:

Jedną z możliwości, jest zdefiniowanie „stabilnego użytkownika”. Dla podanych informacji możesz sobie wyobrazić utworzenie id_użytkownika, który jest skrótem adresu IP i niektórych informacji o kliencie użytkownika (pseudo-kod):

uid = MD5Hash (ip + UA.device + UA.model)

Następnie oflagujesz te identyfikatory jako „stabilne” lub „niestabilne” na podstawie heurystyki użytkowania, którą obserwujesz dla użytkowników. Może to być próg liczby wizyt w danym oknie czasowym, czas przechowywania plików cookie, pewne działania końcowe w witrynie (zdaję sobie sprawę, że nie zostało to określone w Twoim oryginalnym dzienniku) itp.

Chodzi o to, aby oddzielić użytkowników, którzy nie opuszczają plików cookie, od tych, którzy to robią. Stąd możesz przypisać session_ids do stabilnych UID z twoich logów. Będziesz wtedy miał „resztki” session_ids dla niestabilnych użytkowników, co do których jesteś stosunkowo niepewny. Być może sesje są nadmiernie lub niedostatecznie liczone, przypisując zachowanie wielu osobom, gdy jest tylko jedna itd. Ale to jest co najmniej ograniczone do użytkowników, których jesteś teraz „mniej pewny”. Następnie wykonujesz analizy na stabilnej grupie i projektujesz ją na niestabilną grupę. Weźmy na przykład liczbę użytkowników, znasz całkowitą liczbę sesji, ale nie masz pewności, ilu użytkowników wygenerowało te sesje. Możesz znaleźć # sesji / unikalnego stabilnego użytkownika i użyć go do wyświetlenia „szacunkowej” liczby unikalnych użytkowników w niestabilnej grupie, ponieważ znasz liczbę sesji przypisanych do tej grupy.

projected_num_unstable_users = num_sess_unstable / num_sess_per_stable_uid

To nie pomaga w dochodzeniu na poziomie użytkownika dotyczącym niestabilnych użytkowników, ale możesz przynajmniej uzyskać przebieg z kohorty stabilnych użytkowników, którzy utrzymują się przez pewien czas. Za pomocą różnych metod możesz projektować zachowanie i zaliczać się do niestabilnej grupy. Powyżej jest prostym przykładem czegoś, co możesz chcieć wiedzieć. Ogólnym pomysłem jest ponowne zdefiniowanie zestawu użytkowników, których zachowanie jest pewne, zmierzenie tego, co chcesz zmierzyć, i wykorzystanie pewnych podstawowych prawd (liczba wyszukiwań, odwiedzin, kliknięć itp.) W celu wyświetlenia w nieznanej przestrzeni użytkownika i oszacowania im. Jest to długotrwały problem związany z unikalnym liczeniem użytkowników, logowaniem itp.… W przypadku usług, które nie wymagają logowania.

Z tymi danymi niewiele możesz zrobić, ale to, co niewiele możesz zrobić, nie zależy od uczenia maszynowego. Tak, sesje z tego samego adresu IP, ale różni użytkownicy użytkownika są prawie na pewno różnymi użytkownikami. Sesje z tym samym adresem IP i User-Agent to zwykle ten sam użytkownik, z wyjątkiem serwerów proxy / punktów dostępu Wi-Fi. Te, które możesz zidentyfikować, patrząc na rozkład liczby sesji według adresu IP, aby zidentyfikować prawdopodobne „zagregowane” adresy IP. Sesje z tego samego IP / User-Agent, które nakładają się w czasie, są prawie na pewno różne. Aby dodatkowo rozróżnić użytkowników, potrzebujesz więcej informacji. Na przykład witryny lub adresy IP, z którymi łączy się użytkownik, byłyby bardzo mocną podstawą do rozróżnienia sesje. Następnie możesz przejść do bardziej wyrafinowanej nauki, aby dowiedzieć się, kiedy sesje są tymi samymi lub różnymi użytkownikami.

K-średnie vs. K-średnie online

K-średnich jest dobrze znanym algorytmem do tworzenia klastrów, ale istnieje również wariant online takiego algorytmu (K-średnich online). Jakie są zalety i wady tych podejść i kiedy należy je preferować?

K-średnie online (bardziej znane jako sekwencyjne k-średnie) i tradycyjne k-średnie są bardzo podobne. Różnica polega na tym, że k-średnich online umożliwia aktualizację modelu po otrzymaniu nowych danych. Online k-średnich należy używać, gdy oczekujesz, że dane będą odbierane jeden po drugim (a może w kawałkach). Umożliwia to aktualizację modelu w miarę uzyskiwania dodatkowych informacji na jego temat. Wadą tej metody jest to, że zależy ona od kolejności otrzymywania danych

Oryginalna publikacja k-średnie MacQueena (pierwsza, która używa nazwy „kmeans”) jest algorytmem online.  Po przypisaniu każdego punktu średnia jest stopniowo aktualizowana za pomocą prostej formuły średniej ważonej (stara średnia jest ważona n, nowa obserwacja jest ważona 1, jeśli średnia miała n obserwacji wcześniej). O ile mi wiadomo, miało to również być pojedyncze przejście tylko przez dane, chociaż można to wielokrotnie powtarzać w trywialny sposób, aby ponownie przypisać punkty do zbieżności. MacQueen zwykle zbiera mniej iteracji niż Lloyds, jeśli dane są tasowane (ponieważ aktualizuje średnią szybciej!). Na zamówionych danych może to mieć problemy. Z drugiej strony wymaga więcej obliczeń dla każdego obiektu, więc każda iteracja trwa nieco dłużej (oczywiście dodatkowe operacje matematyczne).

 Grupowanie danych z długimi ogonami / pareto przed grupowaniem

Chcę zgrupować zestaw danych o długich ogonach / pareto w kilka przedziałów (w rzeczywistości numer przedziału nie jest jeszcze określony). Czy mogę zastosować jakieś algorytmy lub modele?

Istnieje kilka podejść. Możesz zacząć od drugiego.

Partycjonowanie równej szerokości (odległość):

* Dzieli zakres na N przedziałów o równej wielkości: jednolita siatka

* jeśli A i B są najniższą i najwyższą wartością atrybutu, szerokość przedziałów będzie wynosić: W = (B-A) / N.

* Najprostsze – Wartości odstające mogą zdominować prezentację – Przekrzywione dane nie są odpowiednio obsługiwane.

Podział na jednakową głębokość (częstotliwość):

* Dzieli zakres na N przedziałów, z których każdy zawiera w przybliżeniu taką samą liczbę próbek

* Dobre skalowanie danych

* Zarządzanie atrybutami kategorycznymi może być trudne.

Inne metody

* Ranga: Ranga liczby to jej wielkość w stosunku do innych wartości zmiennej numerycznej. Najpierw sortujemy listę wartości, a następnie przypisujemy pozycję wartości jako jej pozycję. Te same wartości otrzymują tę samą rangę, ale obecność zduplikowanych wartości wpływa na szeregi kolejnych wartości (np. 1,2,3,3,5). Ranga jest solidną metodą grupowania z jedną główną wadą, wartości mogą mieć różne stopnie na różnych listach.

* Kwantyle (mediana, kwartyle, percentyle, …): Kwantyle są również bardzo duże ale użyteczne metody grupowania, ale jak Ranga, jedna wartość może mieć inny kwantyl, jeśli lista wartości się zmieni.

* Funkcje matematyczne: Na przykład binowanie logarytmiczne jest skuteczną metodą dla zmiennych numerycznych o silnie przekrzywionym rozkładzie (np. Dochód).

Binning oparty na Entropii

Metoda oparta na entropii wykorzystuje podejście podzielone. Entropia (lub treść informacyjna) jest obliczana na podstawie etykiety klasy. Intuicyjnie znajduje najlepszy podział, dzięki czemu pojemniki są tak czyste, jak to możliwe, to znaczy większość wartości w pojemniku odpowiada tej samej etykiecie klasy. Formalnie charakteryzuje się znalezieniem podziału z maksymalnym zyskiem informacji.

Jaki jest najlepszy algorytm Data Mining do prognozowania na podstawie pojedynczej zmiennej?

Mam zmienną, której wartość chciałbym przewidzieć i chciałbym użyć tylko jednej zmiennej jako predyktora. Na przykład przewiduj natężenie ruchu na podstawie pogody. Początkowo myślałem o użyciu map samoorganizujących się (SOM), które wykonują bez nadzoru klastrowanie + regresję. Ponieważ jednak ma on istotny składnik redukcji wymiarów, uważam go za bardziej odpowiedni dla dużej liczby zmiennych. Czy warto używać go dla jednej zmiennej jako predyktora? Być może istnieją bardziej odpowiednie techniki dla tego prostego przypadku: w tytule mojego pytania użyłem „Data Mining” zamiast „uczenia maszynowego”, ponieważ myślę, że może regresja liniowa mogłaby wykonać zadanie…

Powszechną zasadą w uczeniu maszynowym jest wypróbowanie prostych rzeczy w pierwszej kolejności. Do przewidywania zmiennych ciągłych nie ma nic bardziej podstawowego niż prosta regresja liniowa. „Prosty” w nazwie oznacza, że ​​używana jest tylko jedna zmienna predykcyjna (+ przecięcie, oczywiście):

y = b0 + x * b1

gdzie b0 jest przecięciem, a b1 jest nachyleniem. Na przykład możesz przewidzieć zużycie lemoniady w parku na podstawie temperatury:

cons = b0 + temp * b1

Temperatura jest dobrze zdefiniowaną zmienną ciągłą. Ale jeśli mówimy o czymś bardziej abstrakcyjnym, takim jak „pogoda”, trudniej jest zrozumieć, w jaki sposób mierzymy i kodujemy. Można powiedzieć, że pogoda przyjmuje wartości {okropne, złe, normalne, dobre, doskonałe} i przypisuje wartości liczbowe od -2 do +2 (co oznacza, że ​​„doskonała” pogoda jest dwa razy lepsza niż „dobra”). Ale co, jeśli pogodę podają słowa {błyszcząca, deszczowa, chłodna, …}? Nie możemy uporządkować tych zmiennych. Takie zmienne nazywamy kategorycznymi. Ponieważ nie ma naturalnego porządku między różnymi kategoriami, nie możemy zakodować ich jako jednej zmiennej liczbowej (a regresja liniowa oczekuje tylko liczb), ale możemy zastosować tak zwane kodowanie zastępcze: zamiast jednej zmiennej pogodowej używamy 3 zmiennych – [weather_shiny, weather_rainy, weather_cool], z których tylko jedna może przyjąć wartość 1, i inne powinny przyjmować wartość 0. W rzeczywistości będziemy musieli upuścić jedną zmienną z powodu kolinearności. Model przewidywania ruchu na podstawie pogody może więc wyglądać następująco:

traffic = b0 + weather_shiny * b1 + weather_rainy * b2 # weather_cool spadł tam, gdzie b1 lub b2 wynosi 1 lub oba są równe 0. Zauważ, że możesz również napotkać nieliniową zależność między zmiennymi predykcyjnymi i przewidywanymi (możesz to łatwo sprawdzić, wykreślając (x, y) pary). Najprostszym sposobem radzenia sobie z nim bez odmowy modelu liniowego jest użycie funkcji wielomianu – wystarczy dodać wielomiany swojej funkcji jako nowe funkcje. Na przykład. na przykład temperatura (w przypadku zmiennych zastępczych tak nie jest i ma sens, ponieważ 1 ^ n i 0 ^ n są nadal 1 i 0 dla dowolnego n):

traffic = b0 + temp * b1 + temp ^ 2 * b2 [+ temp ^ 3 * b3 + …]

Korzystanie z klastrowania w przetwarzaniu tekstu

Chcę stworzyć algorytm do klasyfikacji tekstu. Załóżmy, że mam duży zestaw tekstu i artykułów. Powiedzmy, że około 5000 zwykłych tekstów. Najpierw używam prostej funkcji do określenia częstotliwości wszystkich czterech i więcej słów znakowych. Następnie używam tego jako cechy każdej próbki treningowej. Teraz chcę, aby mój algorytm mógł grupować zestawy szkoleniowe zgodnie z ich funkcjami, czyli tutaj jest częstotliwość każdego słowa w artykule. (Zauważ, że w tym przykładzie każdy artykuł by to zrobił , mają swoją unikalną cechę, ponieważ każdy artykuł ma inną funkcję, na przykład artykuł ma 10 „wody i 23„ czystej ”, a inny ma 8„ polityki ”i 14„ dźwigni ”). Czy możesz zasugerować najlepszy możliwy algorytm grupowania dla tego przykładu?

Analizując słowa, pomyśl, że „komputer”, „komputery”, „komputeryzacja”… reprezentują jedną koncepcję, a więc tylko jedną cechę. Bardzo ważne dla poprawnej analizy. Mówiąc o algorytmie klastrowania, możesz użyć hierarchicznego klastrowania. Na każdym etapie algo łączysz 2 najbardziej podobne teksty zgodnie z ich cechami (na przykład za pomocą miary odmienności, na przykład odległości euklidesowej). Dzięki takiemu współczynnikowi podobieństwa możesz znaleźć najlepszą liczbę klastrów, a tym samym najlepszą klaster dla swoich tekstów i artykułów.

Jeśli chcesz podążać swoją dotychczasową ścieżką, sugeruję znormalizowanie częstotliwości każdego terminu według jego popularności w całym korpusie, dlatego promowane są rzadkie, a zatem przewidujące słowa. Następnie użyj losowych rzutów, aby zmniejszyć wymiary bardzo długich wektorów do rozmiarów, aby algorytm grupowania działał lepiej (nie chcesz grupować w przestrzeniach o dużych wymiarach). Istnieją jednak inne sposoby modelowania tematów.

Nie można powiedzieć, że jest najlepsza, ale ukryta analiza semantyczna może być jedną z opcji. Zasadniczo opiera się na współwystępowaniu, musisz najpierw go zważyć.

http://en.wikipedia.org/wiki/Latent_semantic_analysis

http://lsa.colorado.edu/papers/dp1.LSAintro.pdf

Problem polega na tym, że LSA nie ma solidnego wsparcia statystycznego.

Szybkie k-średnie jak algorytm dla 10 ^ 10 punktów?

Szukam k-średnie do  grupowanie na zbiorze punktów 10-wymiarowych. Haczyk: jest 10 ^ 10 punktów. Szukam tylko środka i wielkości największych klastrów (powiedzmy od 10 do 100 klastrów); Nie dbam o to, w jakim klastrze kończy się każdy punkt. Używanie k-średnich nie jest ważne; Właśnie szukam podobnego efektu, każdy przybliżony średni k lub związany z nim algorytm byłby świetny (minibatch-SGD oznacza…). Ponieważ GMM jest w pewnym sensie tym samym problemem co k-znaczy, robienie GMM na danych o tym samym rozmiarze jest również interesujące. W tej skali podpróbkowanie danych prawdopodobnie nie zmienia znacząco wyniku: szanse znalezienia tych samych 10 najlepszych klastrów przy użyciu 1/10000 próbki danych są bardzo dobre. Ale nawet wtedy jest to problem 10 ^ 6 punktów, który jest na / poza krawędzią możliwą do przełknięcia.

k-średnie opiera się na średnich. Modeluje klastry za pomocą środków, dlatego poprawa poprzez dodanie większej ilości danych jest marginalna. Błąd średniej oceny zmniejsza się o 1 / sqrt (n); więc dodając więcej danych opłaca się coraz mniej… Strategie dla tak dużych danych zawsze opierają się na próbkowaniu: jeśli chcesz podprogramowego środowiska wykonawczego, musisz próbkować! W rzeczywistości Mini-Batch-Kmeans itp. Robią dokładnie to: wielokrotnie próbkując z zestawu danych. Jednak próbkowanie (w szczególności próbkowanie bezstronne) również nie jest całkowicie bezpłatne… zazwyczaj musisz odczytać dane liniowo, aby pobrać próbkę, ponieważ nie masz losowego dostępu do indywidualnych rekordów. Wybrałbym algorytm MacQueena. To jest online; domyślnie wykonuje pojedyncze przełożenie danych (chociaż popularne jest iterowanie). Dystrybucja nie jest łatwa, ale myślę, że możesz sobie pozwolić na liniowy odczyt swoich danych, powiedz 10 razy z dysku SSD?

Jako komentarz boczny zauważ, że użycie k-średnich dla danych 10D może skończyć się nigdzie zgodnie z przekleństwem wymiarowości. Oczywiście różni się nieco w zależności od charakteru danych, ale kiedy próbowałem ustalić próg, w którym K-Means zaczyna zachowywać się dziwnie w odniesieniu do wymiaru, otrzymałem coś w rodzaju 7D. Po 7 wymiarach zaczęło brakować poprawnych klastrów (moje dane zostały wygenerowane ręcznie zgodnie z 4 dobrze oddzielonymi rozkładami Gaussa i użyłem funkcji kmeans MATLAB do mojego małego eksperymentu).

Jak utworzyć klastry danych pozycji?

Zadaję to pytanie, ponieważ poprzednie nie było zbyt pomocne i zapytałem o inne rozwiązanie tego samego problemu.

Problem Mam pozycje boczne, xcoord, pojazdów w czasie, które zostały zarejestrowane jako odległości od prawej krawędzi drogi. Można to zobaczyć dla jednego pojazdu poniżej wątek:

autko.PNG (do tłumaczenia)

Każdy punkt na wykresie reprezentuje pozycję przedniego środka pojazdu. Kiedy pojazd zmienia pas (numery pasów nie pokazano), następuje drastyczna zmiana pozycji, jak widać po „Początku zmiany pasa” na wykresie. Dane leżące u podstaw tego wykresu są następujące:

Vehicle.ID Frame.ID xcoord Lane

1 2 13 16,46700 2

2 2 14 16,44669 2

3 2 15 16,42600 2

4 2 16 16.40540 2

5 2 17 16,38486 2

6 2 18 16,36433 2

Chcę zidentyfikować początkowe i końcowe punkty danych zmiany linii, grupując dane, jak pokazano na wykresie. Punkty danych na wykresie zaznaczone na czerwono są bardziej do siebie podobne, ponieważ różnica między nimi jest mniejsza w porównaniu do punktów danych na środku

które widzą duże różnice w pozycji (xcoord). Moje pytania brzmią: czy można zastosować jakąkolwiek technikę grupowania, aby segmentować te dane w taki sposób że mogę zidentyfikować punkt początkowy i końcowy zmiany pasa? Jeśli tak, która technika byłaby najbardziej odpowiednia? Używam R. Wcześniej próbowałem grupowania hierarchicznego, ale nie wiem, jak go zastosować w tym kontekście.

Wątpię, aby którykolwiek z algorytmów klastrowania działał dobrze. Zamiast tego powinieneś przyjrzeć się: segmentacji (tak, to coś innego), w szczególności wykrywaniu zmiany segmentacji szeregów czasowych (jak powiedziałeś, najpierw jest raczej stały rozkład, potem zmiana, a potem raczej stały rozkład, regresja segmentowa może również działać: spróbuj znaleźć najlepsze dopasowanie, które jest stałe, liniowo zmieniające się i stałe ponownie. Zasadniczo w tym ograniczonym modelu należy zoptymalizować cztery parametry: średnia przed i po + początku i końcu przejścia.

[36][R]

R to język i środowisko dla obliczeń statystycznych i grafiki. Jest to projekt GNU podobny do języka S i środowiska opracowanego w Bell Laboratories (dawniej AT&T, obecnie Lucent Technologies) przez Johna Chambersa i współpracowników. R można uznać za inną implementację S. Istnieje kilka ważnych różnic, ale wiele kodu napisanego dla przebiegów S niezmienionych pod R. R zapewnia szeroki zakres statystyczny (modelowanie liniowe i nieliniowe, klasyczne testy statystyczne, analiza szeregów czasowych, klasyfikacja, grupowanie,…) i techniki graficzne, i jest wysoce rozszerzalny. Język S jest często nośnikiem wyboru w badaniach metodologii statystycznej, a R zapewnia ścieżkę Open Source do uczestnictwa w tym działaniu. Jedną z mocnych stron R jest łatwość tworzenia dobrze zaprojektowanych wykresów o jakości publikacji, w tym symboli matematycznych i wzorów w razie potrzeby. Wiele uwagi poświęcono domyślnym ustawieniom niewielkich opcji graficznych, ale użytkownik zachowuje pełną kontrolę. R został stworzony przez Rossa Ihakę i Roberta Gentlemana, a teraz jest rozwijany przez zespół R Development Core Team. Środowisko R można łatwo rozszerzyć dzięki systemowi pakowania w CRAN. R jest dostępny jako Wolne Oprogramowanie na zasadach GNU Fundacji Wolnego Oprogramowania

Ogólna licencja publiczna w formie kodu źródłowego. Kompiluje i działa na wielu różnych platformach UNIX i podobnych systemach (w tym FreeBSD i Linux), Windows i Mac OS.

PYTANIA:

Programowe uruchamianie skryptu R.

Mam skrypt R, który generuje raport na podstawie bieżącej zawartości bazy danych. Ta baza danych stale się zmienia, a rekordy są dodawane / usuwane wiele razy każdego dnia. Jak mogę poprosić komputer, aby uruchamiał to codziennie o 4 rano, aby rano czekał na mnie aktualny raport? A może chcę, aby uruchomił się ponownie po dodaniu pewnej liczby nowych rekordów do bazy danych. Jak mogę to zautomatyzować? Powinienem wspomnieć, że korzystam z systemu Windows, ale mógłbym łatwo umieścić ten skrypt na moim komputerze z systemem Linux, jeśli uprości to ten proces.

ODPOWIEDZI:

W systemie Windows użyj harmonogramu zadań, aby ustawić uruchamianie zadania, na przykład codziennie o 4:00. Daje to wiele innych opcji dotyczących częstotliwości itp.

Jak mogę poprosić komputer, aby uruchamiał to codziennie o 4 rano, aby rano czekał na mnie aktualny raport? Możesz skonfigurować cronjob w systemie Linux. Są one uruchamiane o ustalonej godzinie, jeśli komputer jest włączony. Aby to zrobić, otwórz terminal i wpisz:

crontab -e

I dodaj:

00 4 * * * r źródło (/ home / FilePath /…/ myRscript.R)

Jakie są ograniczenia pamięci R.

Jedną z moich krytyk pedagogiki uczenia statystycznego (SL) jest brak uwzględnienia wydajności obliczeń w ocenie różnych technik modelowania. Z naciskiem na ładowanie i weryfikację krzyżową w celu dostrojenia / przetestowania modeli, SL wymaga dużej mocy obliczeniowej. Dodaj do tego osadzone ponowne próbkowanie

w technikach takich jak tworzenie worków i boosting, a masz widmo piekła obliczeniowego do nadzorowanego uczenia się dużych zbiorów danych. W rzeczywistości ograniczenia pamięci R nakładają dość surowe ograniczenia na rozmiar modeli, które można dopasować za pomocą najlepszych metod, takich jak losowe lasy. Chociaż SL dobrze wykonuje kalibrację wydajności modelu w stosunku do małych zestawów danych, dobrze byłoby zrozumieć wydajność w porównaniu z kosztem obliczeniowym większych danych. Jakie są ograniczenia pamięci R. i czy nakładają poważne ograniczenia na rozmiar modeli, które można dopasować przy użyciu najbardziej skutecznych metod, takich jak losowe lasy?

R wykonuje wszystkie obliczenia w pamięci systemu, tj. w pamięci RAM. Dlatego pojemność pamięci RAM jest bardzo ważnym ograniczeniem dla operacji intensywnie obliczeniowych w R. Po przezwyciężeniu tego ograniczenia dane są obecnie przechowywane w systemach HDFS, w których dane nie są ładowane do pamięci, a program jest zamiast tego uruchamiany, program przechodzi do danych i wykonuje operacje, pokonując w ten sposób ograniczenia pamięci.

RHadoop (https://github.com/RevolutionAnalytics/RHadoop/wiki) to złącze, którego szukasz. Jeśli chodzi o wpływ na algorytmy wymagające intensywnych obliczeń, losowe lasy / drzewa decyzyjne / zespoły na znacznej ilości danych (z mojego doświadczenia co najmniej 50 000 obserwacji) zajmują dużo pamięci i są znacznie powolne. Aby przyspieszyć ten proces, paralelizacja jest właściwą drogą, a paralelizacja jest z natury dostępna w Hadoop! Właśnie tam Hadoop jest naprawdę wydajny. Jeśli więc wybierasz metody złożone, które wymagają dużej mocy obliczeniowej i są wolne, warto wypróbować system HDFS, który zapewnia znaczną poprawę wydajności.

R wykonuje wszystkie obliczenia w pamięci, więc nie można wykonać operacji na zestawie danych większym niż dostępna ilość pamięci RAM. Istnieją jednak biblioteki umożliwiające przetwarzanie bigdata przy użyciu R i jedną z popularnych bibliotek do przetwarzania bigdata, takich jak Hadoop.

Błąd R przy użyciu pakietu tm (eksploracja tekstu)

Próbuję użyć pakietu tm do konwersji wektora ciągów tekstowych na element corpus. Mój kod wygląda mniej więcej tak Korpus (d1 $ Tak), gdzie d1 $ Tak jest czynnikiem ze 124 poziomami, z których każdy zawiera ciąg tekstowy. Na przykład d1 $ Tak [246] = „Abyśmy mogli wydostać łódź!” Otrzymuję następujący błąd: „Błąd: dziedziczy (x,„ Źródło ”) nie jest PRAWDA” Nie jestem pewien, jak temu zaradzić.

Musisz powiedzieć Corpusowi, jakiego źródła używasz. Wypróbuj:

Korpus (VectorSource (d1 $ Tak))

Czy musisz znormalizować dane podczas budowania drzew decyzyjnych przy użyciu R?

Nasz zestaw danych w tym tygodniu ma 14 atrybutów, a każda kolumna ma bardzo różne wartości. Jedna kolumna ma wartości poniżej 1, a druga kolumna ma wartości od trzech do czterech pełnych cyfr. Nauczyliśmy się normalizacji w zeszłym tygodniu i wygląda na to, że powinieneś normalizować dane, gdy mają one bardzo różne wartości. Czy w przypadku drzew decyzyjnych sprawa jest taka sama? Nie jestem tego pewien, ale czy normalizacja wpłynie na wynikowe drzewo decyzyjne z tego samego zestawu danych? Nie wydaje się tak, ale …

Żadna monotoniczna transformacja nie ma wpływu na najczęściej spotykane typy drzew decyzyjnych. Tak długo, jak zachowujesz porządek, drzewa decyzyjne są takie same (oczywiście przez to samo drzewo rozumiem tę samą strukturę decyzyjną, a nie te same wartości dla każdego testu w każdym węźle drzewa). Powodem tego jest to, jak działają zwykłe funkcje zanieczyszczenia. Aby znaleźć najlepszy podział, przeszukuje każdy wymiar (atrybut) punkt podziału, który jest w zasadzie klauzulą ​​if, która grupuje wartości docelowe odpowiadające instancjom, których wartość testowa jest mniejsza niż wartość podziału, a po prawej wartości większe niż równe. Dzieje się tak w przypadku atrybutów numerycznych (co moim zdaniem jest twoim przypadkiem, ponieważ nie wiem, jak znormalizować atrybut nominalny). Teraz możesz zauważyć, że kryteria są mniejsze lub większe niż. Co oznacza, że ​​rzeczywista informacja z atrybutów w celu znalezienia podziału (i całego drzewa) to tylko kolejność wartości. Co oznacza, że ​​dopóki przekształcisz swoje atrybuty w taki sposób, że pierwotne uporządkowanie jest zarezerwowane, otrzymasz to samo drzewo. Nie wszystkie modele są niewrażliwe na tego rodzaju transformację. Na przykład modele regresji liniowej dają takie same wyniki, jeśli pomnożymy atrybut przez coś innego niż zero. Otrzymasz różne współczynniki regresji, ale przewidywana wartość będzie taka sama. Nie dzieje się tak, gdy weźmiesz dziennik tej transformacji. Na przykład w przypadku regresji liniowej normalizacja jest bezużyteczna, ponieważ zapewni ten sam wynik. Jednak nie jest tak w przypadku karanej regresji liniowej, takiej jak regresja kalenicy. W karanych regresjach liniowych do współczynników stosowane jest ograniczenie. Chodzi o to, że ograniczenie jest stosowane do sumy funkcji współczynników. Teraz, jeśli napompujesz atrybut, współczynnik zostanie spuszczony, co oznacza, że ​​w końcu kara za ten współczynnik zostanie sztucznie zmodyfikowana. W takiej sytuacji normalizujesz atrybuty, aby każdy współczynnik był ograniczeniem „sprawiedliwie”. Mam nadzieję, że to pomoże

Wizualizuj poziomy wykres pola w R

Mam taki zestaw danych. Dane zostały zebrane za pomocą kwestionariusza i zamierzam przeprowadzić analizę danych eksploracyjnych.

windows <- c(“yes”, “no”,”yes”,”yes”,”no”)

sql <- c(“no”,”yes”,”no”,”no”,”no”)

excel <- c(“yes”,”yes”,”yes”,”no”,”yes”)

salary <- c(100,200,300,400,500 )

test<- as.data.frame (cbind(windows,sql,excel,salary),stringsAsFactors=TRUE)

test[,”salary”] <- as.numeric(as.character(test[,”salary”] ))

Mam zmienną wynikową (wynagrodzenie) w moim zbiorze danych i kilka zmiennych wejściowych (narzędzia). Zacznijmy od stworzenia fałszywego zestawu danych.

software = sample(c(“Windows”,”Linux”,”Mac”), n=100, replace=T)

salary = runif(n=100,min=1,max=100)

test = data.frame(software, salary)

To powinno stworzyć test ramki danych, który będzie wyglądał mniej więcej tak:

Pomiń wynagrodzenie za oprogramowanie blokowe

1 Windows 96,697217

2 Linux 29,770905

3 Windows 94.249612

4 Mac 71.188701

5 Linux 94,028326

6 Linux 7.482632

7 Mac 98,841689

8 komputerów Mac 81,152623

9 Windows 54,073761

10 Windows 1.707829

EDYCJA na podstawie komentarza Uwaga: jeśli dane nie istnieją już w powyższym formacie, można je zmienić na ten format. Weźmy ramkę danych podaną w pierwotnym pytaniu i załóżmy, że ramka danych nazywa się raw_test.

windows sql excel salary

1 yes no yes 100

2 no yes yes 200

3 yes no yes 300

4 yes no no 400

5 no no yes 500

Teraz, używając funkcji / metody topienia z pakietu przekształcania w R, najpierw utwórz test ramki danych (który zostanie wykorzystany do ostatecznego wydruku) w następujący sposób:

# use melt to convert from wide to long format

test = melt(raw_test,id.vars=c(“salary”))

# subset to only select where value is “yes”

test = subset(test, value == ‘yes’)

# replace column name from “variable” to “software”

names(test)[2] = “software”

Teraz otrzymasz test ramki danych, który wygląda następująco:

wartość oprogramowania wynagrodzeń

1 100 windows yes

3 300 windows yes

4 400 windows yes

7 200 sql yes

11 100 excel yes

12 200 excel yes

13 300 excel yes

15 500 excel yes

Po utworzeniu zestawu danych. Teraz wygenerujemy fabułę. Najpierw utwórz wykres słupkowy po lewej w oparciu o liczbę programów reprezentujących stopień wykorzystania.

p1 <- ggplot(test, aes(factor(software))) + geom_bar() + coord_flip()

Next, create the boxplot on the right.

p2 <- ggplot(test, aes(factor(software), salary)) + geom_boxplot() + coord_flip()

Na koniec umieść oba te wykresy obok siebie

require(‘gridExtra’)

grid.arrange(p1,p2,nrow=1)

To powinno stworzyć wykres taki jak:

Będziesz musiał utworzyć kolumnę zawierającą informacje o oprogramowaniu – na przykład nazwij to oprogramowanie, a kolumna wynagrodzenia ma odpowiednią pensję, więc coś w rodzaju

Wynagrodzenie za oprogramowanie

Software Salary

Microsoft 100

Microsoft 300

Microsoft 400

SQL 200

i tak dalej… możesz wydrukować poniższy kod

p <- ggplot(test, aes(factor(software), salary))

p + geom_boxplot() + coord_flip()

Testowanie oprogramowania dla Data Science w R.

Często używam Nosa, Toxa lub Unittesta podczas testowania mojego kodu python,

 szczególnie gdy musi być zintegrowany z innymi modułami lub innymi częściami kodu. Jednak teraz, kiedy odkryłem, że używam R więcej niż pytona do modelowania i programowania ML. Uświadomiłem sobie, że tak naprawdę nie testuję mojego kodu R (a co ważniejsze, naprawdę nie wiem, jak to zrobić dobrze). Moje pytanie brzmi: jakie są dobre pakiety, które pozwalają testować kod R w podobny sposób, jak Nose, Tox lub Unittest w Pythonie. Docenione zostaną również dodatkowe odniesienia, takie jak samouczki. Punkty bonusowe za pakiety w R podobne do

  1. Hipoteza

lub

  1. Funkcja Forge

Pakiety do testów jednostkowych i testów asertywnych, które są aktywnie utrzymywane: Pakiety do testów jednostkowych

  1. test: więcej informacji na temat korzystania można znaleźć tutaj lub na github
  2. Uruchom: strona Cran

Pakiety dla asercji:

  1. twierdzą, że: informacje na github
  2. Asertywny: Asertywny ma wiele dostępnych podpakietów na wypadek, gdyby nie wszystkie były potrzebne. sprawdź Cran
  3. assertr: informacje na temat github
  4. gwarant: informacje na temat github
  5. tester: informacje na temat github

Jest kwestią preferencji, czego chcesz użyć do asercji. Przeczytaj tę stronę bioprzewodnika, aby uzyskać więcej informacji na temat różnicy między RUnit i tym testem.