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

[35][TEXT MINING]

PYTANIA

Jak stworzyć listę powiązanych słów na podstawie początkowych słów kluczowych?

Ostatnio widziałem fajną funkcję, która była kiedyś dostępna w Arkuszach Google: zaczynasz od napisania kilku powiązanych słów kluczowych w kolejnych komórkach, powiedz: „niebieski”, „zielony”, „żółty”, i automatycznie generuje podobne słowa kluczowe (w tym przypadku , inne kolory). Chciałbym to odtworzyć we własnym programie. Zastanawiam się nad użyciem Freebase i działałoby to intuicyjnie:

  1. Pobierz listę podanych słów w Freebase;
  2. Znajdź ich „wspólny mianownik (-y)” i na tej podstawie zbuduj metrykę odległości;
  3. Ranguj inne pojęcia na podstawie ich „odległości” od oryginalnych słów kluczowych;
  4. Wyświetl następne najbliższe pojęcia.

Ponieważ nie znam tej dziedziny, moje pytania są następujące:

Czy jest na to lepszy sposób?

Jakie narzędzia są dostępne dla każdego kroku?

ODPOWIEDZI

Algorytm word2vec może być dobrym sposobem na uzyskanie większej liczby elementów dla listy podobnych słów. Jest to nienadzorowany algorytm „głębokiego uczenia się”, który został wcześniej zademonstrowany przy użyciu danych szkoleniowych opartych na Wikipedii (skrypty pomocnicze są dostępne na stronie kodowej Google). Obecnie istnieją implementacje C i Python. Ten samouczek Radima Řehůřka, autora biblioteki modelowania tematów Gensim, jest doskonałym miejscem do rozpoczęcia. Demonstracja „jednego tematu” w samouczku jest dobrym przykładem przywracania podobnych słów do pojedynczego terminu (spróbuj wyszukać „czerwony” lub „żółty”). Powinno być możliwe rozszerzenie tej techniki, aby znaleźć słowa, które mają największe ogólne podobieństwo do zestawu słów wejściowych.

Czy rozważałeś podejście oparte na częstotliwości, wykorzystujące proste współwystępowanie słów w ciałach? Przynajmniej tego widziałem większość ludzi do tego. Myślę, że może to być krótko omówione w książce Manninga i Schütze, i wydaje mi się, że pamiętam coś takiego jak zadanie domowe z powrotem w szkole… Na tym etapie: uszereguj inne koncepcje na podstawie ich „odległości” od oryginalnych słów kluczowych; Istnieje kilka wskaźników podobieństwa semantycznego, które można sprawdzić. Oto link do niektórych slajdów, które przygotowałem dla projektu klasowego przy użyciu kilku takich wskaźników podobieństwa w WordNet

Uczenie się funkcji bez nadzoru dla NER

Wdrożyłem system NER z wykorzystaniem algorytmu CRF z moimi ręcznie wykonanymi funkcjami, które dawały całkiem dobre wyniki. Chodzi o to, że użyłem wielu różnych funkcji, w tym tagów POS i lematów. Teraz chcę zrobić ten sam NER dla innego języka. Problem polega na tym, że nie mogę używać tagów POS i lematów. Zacząłem czytać artykuły o głębokim uczeniu się i uczeniu się funkcji bez nadzoru. Moje pytanie brzmi, czy można zastosować metody uczenia funkcji bez nadzoru za pomocą algorytmu CRF. Czy ktoś próbował tego i uzyskał dobry wynik? Czy jest jakiś artykuł lub samouczek na ten temat. Nadal nie rozumiem w pełni tego sposobu tworzenia funkcji, więc nie chcę spędzać zbyt wiele czasu na czymś, co nie zadziała. Tak więc każda informacja byłaby naprawdę pomocna. Stworzenie całego systemu NER opartego na głębokim uczeniu się to na razie trochę za dużo. Z góry dziękuję.

Tak, można całkowicie połączyć uczenie się bez nadzoru z modelem CRF. W szczególności polecam zbadanie możliwości wykorzystania funkcji word2vec jako danych wejściowych do CRF. Word2vec ćwiczy rozróżnianie między słowami, które są odpowiednie dla danego kontekstu, a słowami, które są losowo wybrane. Wybrane wagi modelu można następnie interpretować jako gęstą reprezentację wektorową danego słowa. Te gęste wektory mają atrakcyjną właściwość, że słowa, które są semantycznie lub składniowo podobne, mają podobne reprezentacje wektorowe. Podstawowa arytmetyka wektorów ujawnia nawet kilka interesujących wyuczonych związków między słowami. Na przykład wektor („Paryż”) – wektor („Francja”) + wektor („Włochy”) daje wektor bardzo podobny do wektora („Rzym”). Na wysokim poziomie można uznać reprezentacje word2vec za podobne do reprezentacji LDA lub LSA, w tym sensie, że można przekształcić rzadki wektor wejściowy w gęsty wektor wyjściowy, który zawiera informacje o podobieństwie słów. W tym przypadku LDA i LSA są również ważnymi opcjami uczenia się funkcji bez nadzoru – zarówno próbują reprezentować słowa jako kombinacje „tematów”, jak i gęstą reprezentację słów. W przypadku tekstu w języku angielskim Google dystrybuuje modele word2vec wstępnie wyszkolone na ogromnym 100-miliardowym zestawie danych Google News, ale w przypadku innych języków musisz wyszkolić swój własny model.

Grupowanie ciągów wewnątrz ciągów?

Nie jestem pewien, czy poprawnie sformułowałem pytanie. Zasadniczo chcę: załóżmy, że mam listę 1000 ciągów, które wyglądają tak:

cvzxcvzxstringcvzcxvz

otortorotrstringgrptprt

vmvmvmeopstring2vmrprp

vccermpqpstring2rowerm

proorororstring3potrprt

mprto2435string3famerpaer

itp.

Chciałbym wyodrębnić te ponownie powtarzające się ciągi, które występują na liście. Jakiego rozwiązania powinienem użyć? Czy ktoś wie o algorytmie, który mógłby to zrobić?

Interesujące pytanie! Nie spotkałem się z tym wcześniej, więc oto rozwiązanie, które właśnie wymyśliłem, inspirowane podejściem przyjętym w dokumencie word2vec:

  1. Zdefiniuj pary podobieństwo na podstawie najdłuższego wspólnego podłańcucha (LCS) lub LCS znormalizowanego przez produkty o długości łańcucha. Buforuj to w macierzy dla każdej rozważanej pary ciągów, ponieważ jest to kosztowne do obliczenia. Weź również pod uwagę przybliżenia.
  2. Znajdź osadzenie euklidesowe (być może hipersferalne?), Które minimalizuje błąd (odległość euklidesowa w przypadku korzystania z kuli i iloczyn kropkowy w przypadku korzystania z kuli). Załóżmy losową inicjalizację i zastosuj metodę optymalizacji opartą na gradiencie, biorąc jakobian błędu.
  3. Teraz masz osadzanie przestrzeni Hilberta, więc klastruj, używając wybranego algorytmu! Odpowiedź pytanie, jak grupować wiele podciągów: większość złożoności leży w pierwszym etapie; obliczenia LCS, więc zależy to od tego, jak skutecznie to zrobisz. Miałem szczęście z algorytmami genetycznymi. W każdym razie to, co zrobiłbyś w tym przypadku, to zdefiniowanie wektora podobieństwa zamiast skalara, którego elementami są najdłuższe k-pary LCS; zobacz tę dyskusję dla algorytmów. Następnie zdefiniowałbym błąd przez sumę błędów odpowiadających każdemu podciągowi. Coś, o czym nie wspomniałem, to sposób wyboru wymiaru osadzania. Artykuł word2vec może dostarczyć pewnej heurystyki; zobacz tę dyskusję. Pamiętam, że używali dość dużych spacji, rzędu 1000 wymiarów, ale optymalizowali coś bardziej skomplikowanego, więc sugeruję zacząć od R ^ 2 i posuwać się w górę. Oczywiście, będziesz chciał zastosować wyższą wymiarowość dla wielu przypadków LCS.

Etyczne i ekonomiczne skalowanie skalowania danych

Niewiele rzeczy w życiu sprawia mi przyjemność, jak skrobanie uporządkowanych i nieustrukturyzowanych danych z Internetu i wykorzystywanie ich w moich modelach. Na przykład zestaw narzędzi Data Science Toolkit (lub RDSTK dla programistów R) pozwala mi pobrać wiele dobrych danych opartych na lokalizacji przy użyciu adresów IP lub adresów, a wtyczka tm.webmining.plug dla pakietu tm sprawia, że ​​skrobanie danych finansowych i wiadomości jest proste. Kiedy wychodzę poza takie (częściowo) ustrukturyzowane dane, zwykle używam XPath. Jednak ciągle dławią mnie ograniczenia liczby zapytań, które możesz zadawać. Myślę, że Google ogranicza mnie do około 50 000 żądań na 24 godziny, co jest problemem dla Big Data.

Z technicznego punktu widzenia obejście tych limitów jest łatwe – wystarczy zmienić adresy IP i usunąć inne identyfikatory ze swojego środowiska. Jednak dotyczy to zarówno kwestii etycznych, jak i finansowych (tak myślę?). Czy istnieje rozwiązanie, które przeoczam?

W przypadku wielu interfejsów API (większość, które widziałem) ratelimiting jest funkcją twojego klucza API lub poświadczeń OAuth. (Google, Twitter, NOAA, Yahoo, Facebook itp.) Dobrą wiadomością jest to, że nie musisz sfałszować adresu IP, wystarczy wymienić dane uwierzytelniające, gdy osiągną limit prędkości. Trochę bezwstydnej autopromocji tutaj, ale napisałem specjalnie pakiet Pythona do radzenie sobie z tym problemem.

https://github.com/rawkintrevo/angemilner

https://pypi.python.org/pypi/angemilner/0.2.0

Wymaga demona mongodb i zasadniczo tworzysz stronę dla każdego ze swoich kluczy. Masz więc 4 adresy e-mail, każdy z osobnym kluczem. Po załadowaniu klucza określ maksymalną liczbę połączeń dziennie i minimalny czas między kolejnymi uruchomieniami.

Załaduj klucze:

z angemilner importuj APIKeyLibrarian

l = APIKeyLibrarian ()

l.new_api_key („twój_znaczony_klucz1”, „noaa”, 1000, .2)

l.new_api_key („twój_znaczony_klucz2”, „noaa”, 1000, .2)

Następnie po uruchomieniu skrobaczki, na przykład interfejsu API NOAA:

url = „http://www.ncdc.noaa.gov/cdo-web/api/v2/stations”

ładunek = {„limit”: 1000,

„datasetid”: „GHCND”,

„data rozpoczęcia”: „1999-01-01”}

r = requests.get (adres URL, parametry = ładunek, nagłówki = {‘token’: ‘twój_klucz_znacznika ”})

staje się:

url = „http://www.ncdc.noaa.gov/cdo-web/api/v2/stations”

ładunek = {„limit”: 1000,

„datasetid”: „GHCND”,

„data rozpoczęcia”: „1999-01-01”}

r = requests.get (adres URL, parametry = ładunek, nagłówki = {‘token’: l.check_out_api_key (‘noaa’) [‘key’]})

więc jeśli masz 5 kluczy, l.check_out_api_key zwraca klucz, który ma najmniejsze użycie i czeka, aż upłynie wystarczająco dużo czasu na jego ponowne użycie. Na koniec, aby zobaczyć, jak często Twoje klucze były używane / pozostały dostępny dostęp:

pprint (l.summary ())

Nie napisałem tego dla R, ponieważ większość skrobania odbywa się w Pythonie (większość MOJE skrobanie). Można go łatwo przenieść. W ten sposób można technicznie obejść ograniczenia stawek. Etycznie…

 Wyodrębnij najbardziej pouczające części tekstu z dokumentów

Czy są jakieś artykuły lub dyskusje na temat wyodrębnienia części tekstu, która zawiera najwięcej informacji o bieżącym dokumencie. Na przykład mam duży zbiór dokumentów z tej samej domeny. Istnieją fragmenty tekstu zawierające kluczowe informacje, o których mówi pojedynczy dokument. Chcę wyodrębnić niektóre z tych części i wykorzystać je jako podsumowanie tekstu. Czy jest jakaś przydatna dokumentacja na temat tego, jak osiągnąć coś takiego? Byłoby naprawdę pomocne, gdyby ktoś mógł skierować mnie we właściwym kierunku, czego powinienem szukać lub czytać, aby uzyskać wgląd w pracę, która mogła być już wykonana w tym zakresie dziedzina przetwarzania języka naturalnego.

To, co opisujesz, często osiąga się za pomocą prostej kombinacji TF-IDF i wyciągu podsumowującego. W skrócie, TF-IDF informuje o względnej ważności każdego słowa w każdym dokumencie, w porównaniu do reszty korpusu. W tym momencie masz ocenę każdego słowa w każdym dokumencie, co odpowiada jego „znaczeniu”. Następnie możesz użyć tych pojedynczych ocen słów do obliczenia łącznej oceny każdego zdania, sumując wyniki każdego słowa w każdym zdaniu. Na koniec, po prostu weź najwyższe N ​​zdań z każdego dokumentu jako podsumowanie. Na początku tego roku stworzyłem iPython Notebook, którego kulminacją jest implementacja tego w Pythonie przy użyciu NLTK i Scikit-learn

Jaka jest alternatywna nazwa „danych nieustrukturyzowanych”?

Obecnie piszę swoją pracę magisterską i przez pewien czas – z powodu braku odpowiedniej alternatywy – utknąłem w „nieuporządkowanych danych” za odniesienie do naturalnego, swobodnie płynącego tekstu, np. artykuły z Wikipedii. Ta nomenklatura niepokoiła mnie od samego początku, ponieważ otwiera debatę, w którą nie chcę wchodzić. Mianowicie, że „nieustrukturyzowany” implikuje, że język naturalny nie ma struktury, czego nie ma – najbardziej oczywistą jest składnia. Daje również negatywne wrażenie, ponieważ jest przeciwieństwem „ustrukturyzowanego”, który jest uznawany za pozytywny. Nie jest to przedmiotem mojej pracy, choć sama „nieuporządkowana” część odgrywa ważną rolę. Całkowicie zgadzam się z autorem tego artykułu, ale on nie proponuje żadnej innej alternatywy dla „bogatych danych”, co nie obejmuje mojego punktu. Chodzi mi o to, aby w tekście brakowało tradycyjnej bazy danych (np. Tabelarycznej) danych, przy czym każdy kawałek ma wyraźny typ danych i semantykę, które są łatwe do interpretacji za pomocą programów komputerowych. Oczywiście chciałbym zawęzić tę definicję do terminu, ale jak dotąd nie udało mi się wymyślić lub odkryć akceptowalnej taksonomii w literaturze.

Nie jest dobrym pomysłem przeciwdziałanie „danym niestrukturalnym” na, powiedzmy, danych tabelarycznych (jak w „danych nie tabelarycznych”), ponieważ trzeba będzie również wyeliminować inne alternatywy (np. „Dane nie-tabelaryczne, nie-graficzme i… dane ”). „Zwykły tekst” (- mój wybór), „nieprzetworzony tekst” lub „surowe dane” brzmią dobrze.

[34][NLP]

PYTANIA

Utajony przydział Dirichleta a hierarchiczny proces Dirichleta

Utajone przydzielanie Dirichleta (LDA) i hierarchiczny proces Dirichleta (HDP) to procesy modelowania tematów. Główną różnicą jest to, że LDA wymaga podania liczby tematów, a HDP nie. Dlaczego to jest tak? A jakie są różnice, zalety i wady obu metod modelowania tematów?

ODPOWIEDZI:

HDP jest rozszerzeniem LDA, zaprojektowanym w celu rozwiązania przypadku, gdy liczba składników mieszaniny (liczba „tematów” w kategoriach modelowania dokumentów) nie jest z góry znana. To jest powód, dla którego istnieje różnica. Używając LDA do modelowania dokumentów, każdy „temat” traktuje się jako rozkład słów w znanym słownictwie. Dla każdego dokumentu sporządzana jest mieszanina tematów z dystrybucji Dirichleta, a następnie każde słowo w dokumencie jest niezależnym rysunkiem z tej mieszaniny (to znaczy, wybierając temat, a następnie wykorzystując go do wygenerowania słowa). W przypadku HDP (stosowanego do modelowania dokumentów) stosuje się również proces Dirichleta, aby uchwycić niepewność co do liczby tematów. Tak więc wybierany jest wspólny rozkład podstawowy, który reprezentuje nieskończenie nieskończony zestaw możliwych tematów dla korpusu, a następnie skończony rozkład tematów dla każdego dokumentu jest próbkowany z tego rozkładu podstawowego. Jeśli chodzi o zalety i wady, HDP ma tę zaletę, że maksymalna liczba tematów może być nieograniczona i wyciągnięta z danych, a nie określona z góry. Wydaje mi się, że jego wdrożenie jest bardziej skomplikowane i niepotrzebne w przypadku, gdy dopuszczalna jest ograniczona liczba tematów.

Anegdotycznie nigdy nie byłem pod wrażeniem wyników z hierarchicznej LDA. Po prostu wydaje się, że nie ma optymalnego poziomu szczegółowości przy wyborze liczby tematów. Osiągnąłem znacznie lepsze wyniki, uruchamiając kilka iteracji zwykłej LDA, ręcznie sprawdzając wygenerowane tematy, decydując, czy zwiększyć, czy zmniejszając liczbę tematów i kontynuując iterację, aż uzyskam ziarnistość, której szukam. Pamiętaj: hierarchiczna LDA nie może odczytać twojego umysłu… nie wie, do czego właściwie zamierzasz użyć modelowania tematów. Podobnie jak w przypadku klastrowania k-średnich, powinieneś wybrać k, który najlepiej pasuje do twojego przypadku użycia.

Co to jest model generatywny i dyskryminacyjny? W jaki sposób są używane do przetwarzania języka naturalnego?

To pytanie dotyczy algorytmu generatywnego vs. dyskryminacyjnego, ale czy ktoś może podać przykład różnicy między tymi formami w przypadku przetwarzania języka naturalnego? Jak wykorzystywane są modele generatywne i dyskryminacyjne w NLP?

Powiedzmy, że przewidujesz temat dokumentu, biorąc pod uwagę jego słowa. Model generatywny opisuje prawdopodobieństwo każdego tematu i prawdopodobne słowa. W ten sposób mówi się, że dokumenty są „generowane” przez świat – temat pojawia się zgodnie z pewną dystrybucją, słowa powstają z powodu tematu, masz dokument. Klasyfikacja dokumentów słów W na temat T polega na maksymalizacji prawdopodobieństwa połączenia: P (T, W) = P (W | T) P (T)

Model dyskryminacyjny działa jedynie poprzez opisanie prawdopodobieństwa, że ​​dany temat uzyska dane słowa. Nie mówi nic o tym, jak prawdopodobne są same słowa lub tematy. Zadaniem jest bezpośrednie modelowanie P (T | W) i znalezienie T, który to maksymalizuje. Te podejścia nie dotyczą bezpośrednio P (T) ani P (W).

Rozdzielczość korelacji dla tekstów niemieckich

Czy ktoś zna bibliotekę do rozwiązywania korekt dotyczących tekstów niemieckich?

O ile mi wiadomo, OpenNLP i Standord NLP nie są w stanie wykonać rozwiązywania korelacji dla tekstów niemieckich. Jedyne znane mi narzędzie to CorZu, które jest biblioteką Pythona.

Bart, narzędzie typu open source, które było używane w kilku językach, w tym w języku niemieckim. Dostępne na stronie internetowej Sucre to narzędzie opracowane na Uniwersytecie w Stuttgarcie. Nie wiem czy jest dostępny z łatwością.

Dokładność Stanford NER

Przeprowadzam rozpoznawanie nazwanego podmiotu za pomocą Stanford NER. Z powodzeniem przeszkoliłem i przetestowałem mój model. Teraz chcę wiedzieć:

1) Jaki jest ogólny sposób pomiaru dokładności modelu NER? Na przykład, jakie techniki lub podejścia są stosowane?

2) Czy w STANFORD NER jest jakaś wbudowana metoda oceny dokładności?

Aby ocenić jakość wyników systemu NER, zdefiniowano kilka miar. Chociaż dokładność na poziomie tokena jest jedną z możliwości, ma dwa problemy: ogromna większość tokenów w tekście świata rzeczywistego nie jest częścią nazw jednostek, jak to zwykle definiuje się, więc dokładność linii bazowej (zawsze przewiduj „nie byt”) to ekstrawagancko wysoka, zwykle> 90%; i błędnie przewidując pełny zakres nazwy bytu

nie jest odpowiednio karany (znalezienie tylko imienia osoby, gdy następuje jej nazwisko, jest oceniane jako dokładność ½). Na konferencjach akademickich, takich jak CoNLL, określono wariant wyniku F1 następująco:

* Precyzja to liczba przewidywanych zakresów nazw jednostek, które dokładnie pokrywają się z zakresami w złotych danych oceny standardowej. To znaczy. gdy przewiduje się [Person Hans] [Person Blick], ale wymagana jest [Person Hans Blick], precyzja dla przewidywanej nazwy wynosi zero. Precyzja jest następnie uśredniana dla wszystkich przewidywanych nazw jednostek.

* Recall to podobnie liczba nazw w złotym standardzie, które pojawiają się dokładnie w tym samym miejscu w prognozach.

* Wynik F1 jest średnią harmoniczną tych dwóch.

Z powyższej definicji wynika, że ​​każda prognoza, która nie trafi w pojedynczy żeton, zawiera fałszywy żeton lub ma niewłaściwą klasę, „nie zdobywa punktów”, tj. Nie przyczynia się ani do precyzji, ani do przywołania.

[33][Zbiory danych]

Zestawy danych to ustrukturyzowane pliki danych w dowolnym formacie, gromadzone wraz z dokumentacją wyjaśniającą ich produkcję lub wykorzystanie

PYTANIA:

Publicznie dostępne zestawy danych

Jednym z najczęstszych problemów w nauce o danych jest zbieranie danych z różnych źródeł w jakoś oczyszczonym (częściowo ustrukturyzowanym) formacie i łączenie wskaźników z różnych źródeł w celu przeprowadzenia analizy wyższego poziomu. Patrząc na wysiłki innych ludzi, wydaje się, że wiele osób w tej dziedzinie wykonuje nieco powtarzalną pracę. Na przykład analiza tweetów, postów na Facebooku, artykułów w Wikipedii itp. jest częścią wielu problemów z dużymi danymi. Niektóre z tych zestawów danych są dostępne przy użyciu publicznych interfejsów API udostępnianych przez witrynę dostawcy, ale zwykle brakuje niektórych cennych informacji lub wskaźników w tych interfejsach API i każdy musi ponownie wykonywać te same analizy. Na przykład, chociaż użytkownicy korzystający z klastrów mogą zależeć od różnych przypadków użycia i wybranych funkcji, to jednak bazowe grupowanie użytkowników Twittera / Facebooka może być przydatne w wielu aplikacjach Big Data, które nie są udostępniane przez interfejs API ani dostępne publicznie w niezależnych danych zestawy. Czy istnieje jakaś strona z indeksem lub publicznie dostępnym zestawem danych zawierającym cenne zestawy danych, które można ponownie wykorzystać w rozwiązywaniu innych problemów z dużymi danymi? Mam na myśli coś takiego jak GitHub (lub grupa witryn / publicznych zestawów danych lub przynajmniej obszerna lista) dla nauki danych. Jeśli nie, jakie są powody braku takiej platformy do nauki danych? Wartość handlowa danych, musisz często aktualizować zestawy danych…? Czy nie możemy opracować modelu open source do udostępniania zbiorów danych dla naukowców zajmujących się danymi?

ODPOWIEDZI:

W rzeczywistości istnieje bardzo rozsądna lista publicznie dostępnych zestawów danych, obsługiwanych przez różne przedsiębiorstwa / źródła. Tutaj jest kilka z nich:

* Publiczne zestawy danych w Amazon WebServices

* Repozytorium częstych wdrożeń zestawów wydobywczych;

* Repozytorium uczenia maszynowego UCI;

* KDnuggets – duża lista wielu publicznych repozytoriów.

Teraz dwie kwestie dotyczące twojego pytania. Pierwszy dotyczy zasad udostępniania baz danych. Z własnego doświadczenia wynika, że ​​istnieją pewne bazy danych, których nie można udostępnić publicznie, zarówno w celu ograniczenia prywatności (jak w przypadku niektórych informacji z sieci społecznościowych), jak i dotyczących informacji rządowych (takich jak bazy danych systemu opieki zdrowotnej). Kolejna kwestia dotyczy użycia / zastosowania zestawu danych. Chociaż niektóre bazy danych mogą być przetwarzane ponownie w celu dostosowania do potrzeb aplikacji, byłoby dobrze, gdybyś miał jakąś fajną organizację zbiorów danych według celu. Taksonomia powinna obejmować wykres społeczny , analizę, eksplorację zestawów przedmiotów, klasyfikacja i wiele innych obszarów badań.

Kaggle.com, dom miłośników nowoczesnej nauki i uczenia maszynowego :), otworzył własne repozytorium zbiorów danych.

Istnieje wiele otwartych zestawów danych, jednym z nich często jest przeoczony data.gov. Jak wspomniano wcześniej, Freebase jest świetny

Publicznie dostępne zestawy danych / interfejsy API sieci społecznościowych

Jako rozszerzenie naszej wspaniałej listy publicznie dostępnych zestawów danych chciałbym wiedzieć, czy istnieje jakaś lista publicznie dostępnych interfejsów API indeksowania / indeksowania sieci społecznościowych. Byłoby bardzo miło, gdyby wraz z linkiem do zestawu danych / API dodano charakterystykę dostępnych danych. Takimi informacjami powinny być między innymi: nazwa sieci społecznościowej; jaki rodzaj informacji użytkownika dostarcza (posty, profil, sieć przyjaźni,…); czy pozwala na indeksowanie treści za pośrednictwem interfejsu API (i szybkość: 10 / min, 1k / miesiąc,…); czy po prostu zapewnia migawkę całego zestawu danych. Wszelkie sugestie i dalsze cechy, które należy dodać, są bardzo mile widziane.

Kilka słów o interfejsach API sieci społecznościowych. Około rok temu napisałem recenzję interfejsów API popularnych sieci społecznościowych dla badaczy. Niestety jest po rosyjsku. Oto podsumowanie:

Twitter (https://dev.twitter.com/docs/api/1.1)

* prawie wszystkie dane o tweetach / tekstach i użytkownikach są dostępne;

* brak danych socjodemograficznych;

* świetny streaming API: przydatny do przetwarzania tekstu w czasie rzeczywistym;

* wiele opakowań dla języków programowania;

* uzyskanie struktury sieci (połączeń) jest możliwe, ale czasochłonne (1 żądanie na 1 minutę).

Facebook (https://developers.facebook.com/docs/reference/api/)

* limity stawek: około 1 żądanie na sekundę;

* dobrze udokumentowany, obecny piaskownica;

* FQL (podobny do SQL) i graficzny interfejs API „regularny odpoczynek”;

* obecne dane o przyjaźni i cechy socjodemograficzne;

* wiele danych jest poza horyzontem zdarzeń: tylko dane znajomych i znajomych znajomych są mniej lub bardziej kompletne, prawie nic nie można było zbadać na temat losowego użytkownika;

* kilka dziwnych błędów API i wygląda na to, że nikt się tym nie przejmuje (np. niektóre funkcje dostępne przez FQL, ale nie przez synonim Graph API).

Instagram (http://instagram.com/developer/)

* limity stawek: 5000 wniosków na godzinę;

* API w czasie rzeczywistym (jak Streaming API dla Twittera, ale ze zdjęciami) – połączenie z nim jest trochę trudne: używane są połączenia zwrotne;

* brak danych socjodemograficznych;

* zdjęcia, dostępne filtry danych;

* nieoczekiwane niedoskonałości (np. możliwe jest zebranie tylko 150 komentarzy do postu / zdjęcia).

Foursquare (https://developer.foursquare.com/overview/)

* limity stawek: 5000 wniosków na godzinę;

* królestwo danych geoprzestrzennych 🙂

* dość zamknięte z powodu problemów związanych z prywatnością. Aby zebrać dane do zameldowania, należy zbudować złożony parser współpracujący z interfejsami API 4sq, bit.ly i twitter;

* ponownie: brak danych socjodemograficznych.

Google+ (https://developers.google.com/+/api/latest/) około 5 żądań na sekundę (spróbuj zweryfikować); główne metody: działania i ludzie;

* podobnie jak na Facebooku, wiele danych osobowych przypadkowego użytkownika jest ukrytych;

* brak danych połączeń użytkownika.

I poza konkursem: sprawdziłem sieci społecznościowe dla rosyjskich czytelników, a sieć nr 1 tutaj to vk.com. Jest przetłumaczony na wiele języków, ale popularny tylko w Rosji i innych krajach WNP. Link do dokumentacji API: http://vk.com/dev/. I z mojego punktu widzenia jest to

najlepszy wybór do badań domowych mediów społecznościowych. Przynajmniej w Rosji. Dlatego:

* limity stawek: 3 wnioski na sekundę;

* dostępne publiczne dane tekstowe i medialne;

* dostępne dane socjodemograficzne: dla losowego poziomu dostępności użytkownika wynosi około 60-70%;

* dostępne są również połączenia między użytkownikami: dostępne są prawie wszystkie dane o przyjaźni dla przypadkowego użytkownika;

* niektóre specjalne metody: np. istnieje metoda uzyskania statusu online / offline dla konkretnego użytkownika w czasie rzeczywistym i można stworzyć harmonogram dla jego odbiorców

Nie jest to sieć społecznościowa, ale Stackexchange publikuje okresowo zrzut całej bazy danych:

* Zrzut danych Stackexchange hostowany na archive.org

* Post opisujący schemat zrzutu bazy danych

Możesz wyodrębnić niektóre informacje społecznościowe, analizując, którzy użytkownicy pytają się i odpowiadają sobie nawzajem. Jedną fajną rzeczą jest to, że ponieważ posty są otagowane, możesz łatwo analizować społeczności podrzędne.

Przykład z Niemiec: Xing strona podobna do linksin, ale ograniczona do krajów niemieckojęzycznych. Link do centrali programisty: https://dev.xing.com/overview Zapewnia dostęp do: profili użytkowników, rozmów między użytkownikami (ograniczone do samego użytkownika), ogłoszeń o pracy, kontaktów i kontaktów, wiadomości z sieci i niektórych interfejs geolokalizacji. Tak, ma interfejs API, ale nie znalazłem informacji o stawce. Wydaje mi się jednak, że niektóre informacje są ograniczone do zgody użytkownika.

Interaktywne wykresy podczas rejestrowania danych

Chcę tworzyć wykresy i interaktywnie eksplorować dane na żywo / stale mierzone. Istnieje wiele opcji, a plot.ly jest najbardziej przyjazny dla użytkownika. Plot.ly ma fantastyczny i łatwy w użyciu interfejs użytkownika (łatwo skalowalny, dostosowywalny, łatwo powiększalny / dopasowujący się do ekranu), ale nie obsługuje dużych zbiorów danych, które zbieram. Czy ktoś zna jakieś alternatywy? Mam MATLAB, ale nie mam wystarczającej liczby licencji, aby uruchomić to i jednocześnie rozwijać program. Wiem, że LabVIEW byłby świetną opcją, ale obecnie jest on zbyt kosztowny. Z góry dziękuję!

W tej odpowiedzi założyłem, że wolisz rozwiązania typu open source od wizualizacji dużych zbiorów danych. To założenie opiera się na szczegółach budżetowych z twojego pytania. Jest jednak jedno wyłączenie – poniżej dodam odniesienie do jednego produktu komercyjnego, który moim zdaniem może być korzystny w twoim przypadku (pod warunkiem, że możesz sobie na to pozwolić). Zakładam również, że rozwiązania oparte na przeglądarce są dopuszczalne (wolałbym je, chyba że masz określone sprzeczne wymagania). Oczywiście jako pierwszy kandydat jako rozwiązanie twojego problemu rozważę bibliotekę JavaScript D3.js: http://d3js.org. Jednak pomimo elastyczności i innych korzyści, myślę, że to rozwiązanie jest zbyt niskie. Dlatego polecam przyjrzeć się następującym projektom open source do wizualizacji dużych zbiorów danych, które są wystarczająco wydajne i elastyczne, ale działają w wyższym poziomie abstrakcji (niektóre z nich oparte są na fundamencie D3.js, a czasem nazywane są stosem wizualizacji D3.js).

Bokeh – oparta na Pythonie interaktywna biblioteka wizualizacji, która obsługuje duże zbiory danych i dane strumieniowe: http://bokeh.pydata.org

Flot – interaktywna biblioteka wizualizacji oparta na JavaScript, skoncentrowana na jQuery: http://www.flotcharts.org

NodeBox – unikalny system szybkiej wizualizacji danych (nie oparty na przeglądarce, ale wielojęzyczny i wieloplatformowy), oparty na generatywnym projekcie i wizualnym programowaniu funkcjonalnym: https://www.nodebox.net

Processing- kompletny system programistyczny z własnym językiem programowania, bibliotekami, wtyczkami itp., Zorientowany na treści wizualne: https://www.processing.org (umożliwia wykonywanie programów przetwarzających w przeglądarce za pośrednictwem http: // processingjs. org)

Crossfilter – oparta na JavaScript biblioteka interaktywnej wizualizacji dużych danych według Square (bardzo szybka wizualizacja dużych zbiorów danych na wielu odmianach): http://square.github.io/crossfilter

bigvis – pakiet R do analizy eksploracyjnej dużych zbiorów danych (sam w sobie nie biblioteka wizualizacji, ale może być przydatny do przetwarzania dużych zbiorów danych / agregacji, wygładzania / przed wizualizacją z wykorzystaniem różnych opcji grafiki R): https://github.com/hadley/bigvis

prefuse – interaktywna biblioteka wizualizacji oparta na Javie: http://prefuse.org

Lumify – platforma do integracji, analizy i wizualizacji dużych zbiorów danych (interesująca funkcja: obsługuje Semantic Web): http://lumify.io

Osobno chciałbym wspomnieć o dwóch projektach analizy i wizualizacji dużych zbiorów danych o otwartym kodzie źródłowym, skoncentrowanych na danych grafowych / sieciowych (z pewnym wsparciem dla przesyłania danych tego typu): Cytoscape i Gephi. Jeśli interesują Cię inne, bardziej szczegółowe (obsługa map itp.) Lub komercyjne (podstawowe bezpłatne poziomy), projekty i produkty, zobacz tą niesamowitą kompilację, którą starannie opracowałem, aby wymyślić główną listę powyżej i przeanalizować: http://blog.profitbricks.com/39-data-visualization-tools-for-big-data. Wreszcie, jak obiecałem na początku, Zoomdata – produkt komercyjny, który, jak sądzę, może warto zajrzeć na: http://www.zoomdata.com. Powodem, dla którego go wykluczyłem z mojej kompilacji oprogramowania typu open source, jest jego wbudowana obsługa platform big data. W szczególności Zoomdata zapewnia konektory danych dla Cloudera Impala, Amazon Redshift, MongoDB, Spark i Hadoop, a także wyszukiwarki, główne silniki baz danych i dane przesyłane strumieniowo. Oświadczenie: Nie mam żadnego związku z Zoomdata – byłem pod wrażeniem ich szerokiej gamy opcji łączności (które mogą cię drogo kosztować, ale to kolejny aspekt analizy tego tematu).

Skąd ten nowojorski dziennikarz otrzymał swoje dane z wyszukiwarki Google?

Mam nadzieję, że jest to pytanie odpowiednie dla SO.

Artykuł, o którym mowa: http://www.nytimes.com/2015/01/25/opinion/sunday/sethstephens-davidowitz-search-for-sex.html O ile wiem, jedyne publicznie dostępne dane z wyszukiwarki Google pochodzą z interfejsu API Trends. Strona pomocy stwierdza, że ​​liczby na wykresie odzwierciedlają liczbę wyszukiwań przeprowadzonych dla określonego terminu w stosunku do całkowitej liczby wyszukiwań przeprowadzonych w Google w czasie. Nie reprezentują bezwzględnych liczb operacji wyszukiwania, ponieważ dane są znormalizowane i prezentowane w skali od 0-100. Jednak w artykule autor podaje (bezwzględne) „średnie miesięczne wyszukiwania”. Źródło jest podane jako: Wszystkie miesięczne liczby wyszukiwania są przybliżone i pochodzą z anonimowej i zagregowanej aktywności w sieci.

Źródło: analiza danych Google przez (autora)

Skąd więc wziął tę „anonimową i zagregowaną aktywność internetową”?

Google AdWords. To ma absolutną liczbę wyszukiwań.

Dane dostępne w branży

Zaczynam pracę magisterską i chcę zrobić system wykrywania usterek przy użyciu technik uczenia maszynowego. Potrzebuję zestawów danych do mojej pracy magisterskiej, ale nie wiem, skąd mogę je uzyskać. Szukam danych historycznych dotyczących operacji / konserwacji / usterek dowolnego rodzaju maszyny w przemyśle naftowym i gazowym (wiertarki, wtryskiwacze pary itp.) lub w przedsiębiorstwach elektrycznych (transformatory, generatory itp.).

Publicznie dostępne zestawy danych, w tym Amazon, KDnuggets, Stanford, Twitter, Freebase, Google Public i inne.

[32][Wydajność]

PYTANIA

Jaka jest najbardziej wydajna technika indeksowania danych?

Jak wszyscy wiemy, istnieją pewne techniki indeksowania danych, których używają dobrze znane aplikacje indeksujące, takie jak Lucene (dla java) lub Lucene.NET (dla .NET), MurMurHash, B + Tree itp. Dla obiektu bez Sql / Object Oriented Database (którą próbuję napisać / grać trochę w C#), jaką technikę sugerujesz? Czytałem o MurMurhash-2, a zwłaszcza komentarze v3 mówią, że Murmur jest bardzo szybki. Również Lucene.Net ma na ten temat dobre komentarze. Ale co z ich śladami pamięci w ogóle?

Czy jest jakieś wydajne rozwiązanie, które zużywa mniej miejsca (i oczywiście jeśli preferowane jest szybsze) niż Lucene lub Murmur? Czy powinienem napisać specjalną strukturę indeksu, aby uzyskać najlepsze wyniki? Jeśli spróbuję napisać własną, to czy istnieje jakakolwiek akceptowana skala dobrego indeksowania, coś w rodzaju 1% węzła danych lub 5% węzła danych? Każda przydatna wskazówka zostanie doceniona.

 ODPOWIEDZI

Myślę, że pomieszałeś niektóre rzeczy w swoim pytaniu. Lucene (nic nie wiem o Lucene.NET, ale przypuszczam, że jest tak samo) to biblioteka używana do analizy, dzielenia na tokeny i przechowywania dokumentów w celu późniejszego ich wyszukania i odzyskania. Lucene ma dość stary, ale skuteczny model, wykorzystuje odwrócone drzewa do wyszukiwania i wyszukiwania dokumentów. Bez dalszych szczegółów, wszystkie dokumenty są podzielone na tokeny (warunki), a dla każdego terminu jest utrzymywana struktura danych, która przechowuje wszystkie dokumenty zawierające dany termin. Jako strukturę danych można zastosować BTree, tablicę skrótów i w najnowszych ważnych wersjach możesz to zrobić , nawet podłącz własne struktury danych. BTree jest rodzajem struktury danych drzewa, która jest odpowiednia do pracy z dużymi fragmentami danych i często służy do przechowywania na dysku uporządkowanych struktur przypominających trele. W przypadku pamięci inne drzewa działają lepiej. Murmur hash, to rodzina funkcji hash używanych w tabeli hash. Implementacja tabeli skrótów nie jest ważna, może to być standardowa implementacja łańcuchowa lub bardziej zaawansowany schemat adresowania skrótów. Chodzi o to, że tabele skrótów pozwalają szybko uzyskać klucz z nieuporządkowanego zestawu kluczy i mogą odpowiadać na zadania takie jak: czy ten klucz jest częścią tego zestawu kluczy? jaka jest wartość związana z tym kluczem? Teraz wróć do głównego problemu. Masz jedną bibliotekę (Lucene), a do struktur danych obie struktury danych są używane w Lucene. Teraz widzisz, że na te pytania nie można odpowiedzieć, ponieważ nie są one porównywalne. Jednak w odniesieniu do twojego śladu i wydajności część pytania. Przede wszystkim musisz wiedzieć, jakie operacje musisz wdrożyć. Czy potrzebujesz tylko wartości dla klucza, czy też musisz znaleźć wszystkie elementy w zakresie? Innymi słowy, potrzebujesz zamówienia czy nie? Jeśli tak, to drzewo może pomóc. Jeśli tego nie zrobisz, zamiast tego można użyć szybszej tabeli skrótów. Czy masz dużo danych, które nie pasują do pamięci? Jeśli tak, pomogłoby rozwiązanie oparte na dysku (jak BTree). Jeśli Twoje dane mieszczą się w pamięci, użyj najszybszego rozwiązania w pamięci i użyj dysku tylko jako magazynu (o innej strukturze, o wiele prostszej).

Jak przyspieszyć przekazywanie wiadomości między węzłami obliczeniowymi?

Zajmuję się tworzeniem aplikacji rozproszonej, a ponieważ została zaprojektowana, podczas przetwarzania będzie mnóstwo komunikacji. Ponieważ komunikacja jest już tak szeroko rozłożona na cały proces, jak to możliwe, zastanawiam się, czy istnieją jakieś standardowe rozwiązania poprawiające wydajność warstwy przekazywania wiadomości w mojej aplikacji. Jakie zmiany / ulepszenia mogę zastosować do mojego kodu, aby skrócić czas wysyłania wiadomości? Za to, co jest tego warte, komunikuję się do 10 GB między 9 węzłami obliczeniowymi, a środowisko, którego używam, jest zaimplementowane w OpenMPI.

ODPOWIEDZI

Buforowanie rzeczy jest na ogół dobre, jeśli możesz, ale uważam, że jest nieco kruche, ponieważ jest to bardzo zależne od tego, jaka dokładnie jest twoja aplikacja. Kompresja danych to kolejna bardzo solidna sugestia, ale mam wrażenie, że oba te przyspieszenia będą względnie marginalne. Może nawet 2-5x, ale byłbym bardzo zaskoczony, gdyby byli szybsi. Przy założeniu, że czyste we / wy (zapis do / odczyt z pamięci) nie jest twoim ograniczającym czynnikiem (jeśli tak, prawdopodobnie nie będziesz dużo szybszy), zrobiłbym silną wtyczkę dla zeromq. Słowami twórców:

Wzięliśmy normalne gniazdo TCP, wstrzyknęliśmy mu mieszaninę radioaktywnych izotopów skradzionych z tajnego sowieckiego projektu badań atomowych, zbombardowaliśmy go promieniami kosmicznymi z 1950 roku i włożyliśmy w ręce uzależnionego od narkotyków autora komiksu ze źle ukrytym fetysz wyłupiastych mięśni spandeksowych. Tak, gniazda ØMQ to światowi superbohaterowie świata sieciowego.

Choć może to być trochę dramatyczne, gniazda zeromq są moim zdaniem jednym z najbardziej niesamowitych programów, jakie świat sieci komputerowych stworzył od kilku lat. Nie jestem pewien, czego używasz w tej chwili do przekazywania wiadomości, ale jeśli używasz czegoś tradycyjnego, takiego jak rabbitmq, możesz zobaczyć przyspieszenie wielu rzędów wielkości (osobiście zauważyłem około 500x, ale zależy dużo architektury). Sprawdź tutaj kilka podstawowych testów porównawczych.

Jeśli oczekujesz (lub stwierdzisz), że węzły żądają tych samych danych więcej niż raz, być może mógłbyś skorzystać ze strategii buforowania? Zwłaszcza tam, gdzie niektóre dane są wykorzystywane znacznie częściej niż inne, więc możesz kierować reklamy tylko na najczęściej używane informacje. Jeśli dane są zmienne, potrzebujesz również sposobu, aby potwierdzić, że nie uległy one zmianie od ostatniego żądania, które jest tańsze niż jego powtórzenie. Jest to dodatkowo skomplikowane, jeśli każdy węzeł ma swoją własną pamięć podręczną. W zależności od charakteru systemu i zadań możesz rozważyć dodanie węzła dedykowanego do udostępniania informacji między węzłami przetwarzającymi i zbudowanie pojedynczej pamięci podręcznej na tym węźle. Na przykład, kiedy może to być dobry pomysł, załóżmy, że pobieram niektóre dane ze zdalnego magazynu danych przez połączenie o niskiej przepustowości i mam pewne zadania wymagające tych danych, które są dystrybuowane wyłącznie między węzłami lokalnymi. Na pewno nie chcę, aby każdy węzeł żądał informacji osobno przez to połączenie o niskiej przepustowości, o które wcześniej mógł poprosić inny węzeł. Ponieważ moje lokalne operacje we / wy są znacznie tańsze niż moje operacje we / wy przez połączenie o niskiej przepustowości, mogę dodać węzeł między węzłami przetwarzającymi a zdalnym źródłem, który działa jak serwer pośredni. Ten węzeł pobierałby żądania od węzłów przetwarzających, komunikował się ze zdalnym magazynem danych i buforował często żądane dane, aby zminimalizować wykorzystanie tego połączenia o niskiej przepustowości. Podstawowe pojęcia, które mogą mieć zastosowanie w konkretnym przypadku, to:

* Wyeliminuj lub zmniejsz zbędne I / O;

* Skorzystaj z kompromisów między zużyciem pamięci a czasem obliczeniowym;

* Nie wszystkie wejścia / wyjścia są sobie równe.

Scikit Learn Regresja Logistyczna Wyciek pamięci

Jestem ciekawy, czy ktoś na to wpadł. Mam zestaw danych z około 350 tys. Próbek, każda z 4k rzadkimi funkcjami. Niski poziom wypełnienia wynosi około 0,5%. Dane są przechowywane w obiekcie scipy.sparse.csr.csr_matrix, z dtype = ‘numpy.float64’. Używam tego jako danych wejściowych do klasyfikatora regresji logistycznej sklearn. Dokumentacja wskazuje, że rzadkie macierze CSR są akceptowalnymi danymi wejściowymi dla tego klasyfikatora. Jednak, kiedy trenuję klasyfikator, mam bardzo niską wydajność pamięci; użycie pamięci przez mój proces eksploduje z ~ 150 MB, aby wypełnić całą dostępną pamięć, a następnie wszystko zatrzymuje się, gdy następuje zamiana pamięci na dysk. Czy ktoś wie, dlaczego ten klasyfikator może rozszerzyć macierz rzadką do macierzy gęstej? Obecnie używam domyślnych parametrów klasyfikatora w ramach zaktualizowanej dystrybucji anakody. Dzięki!

scipy .__ version__ = „0.14.0”

sklearn .__ version__ = „0.15.2”

Ok, skończyło się to sytuacją RTFM, chociaż w tym przypadku był to komunikat o błędzie RTF. Podczas uruchamiania tego nadal pojawiał się następujący błąd: DataConversionWarning: Wektor kolumnowy y został przekazany, gdy oczekiwano tablicy 1d. Proszę zmienić kształt. Zakładałem, że ponieważ miało to związek z wektorem docelowym, a ponieważ było to tylko ostrzeżenie, to po prostu po cichu zmieniłoby mój wektor docelowy na 1-D. Jednak gdy jawnie przekonwertowałem mój wektor docelowy na 1-D, moje problemy z pamięcią zniknęły. Najwyraźniej posiadanie wektora docelowego w niepoprawnej formie spowodowało, że zamienił on moje wektory wejściowe w gęste wektory z wektorów rzadkich. Wyciągnięta lekcja: postępuj zgodnie z zaleceniami, gdy sklearn „sugeruje”, że coś robisz.