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

[31][Algorytmy]

PYTANIA: Czy regresja logistyczna jest w rzeczywistości algorytmem regresji?

Zazwyczaj definicja regresji (o ile mi wiadomo) przewiduje ciągłą zmienną wyjściową z danego zestawu zmiennych wejściowych. Regresja logistyczna jest algorytmem klasyfikacji binarnej, więc daje wyniki jakościowe. Czy to naprawdę algorytm regresji? Jeśli tak, to dlaczego?

ODPOWIEDZI:

Tak, regresja logistyczna jest algorytmem regresji i przewiduje ciągły wynik: prawdopodobieństwo zdarzenia. To, że używamy go jako binarnego klasyfikatora, wynika z interpretacji wyniku.

Szczegóły : Regresja logistyczna jest rodzajem uogólnionego modelu regresji liniowej.

W zwykłym modelu regresji liniowej wynik ciągły y modeluje się jako sumę iloczynu predyktorów i ich efektu:

y = b_0 + b_1 * x_1 + b_2 * x_2 + … b_n * x_n + e

gdzie e jest błędem.

Uogólnione modele liniowe nie modelują bezpośrednio. Zamiast tego używają transformacji, aby rozszerzyć domenę y na wszystkie liczby rzeczywiste. Ta transformacja nazywa się funkcją link. W przypadku regresji logistycznej funkcją łącza jest funkcja logit (zazwyczaj patrz uwaga poniżej). Funkcja logowania jest zdefiniowana jako

ln (t / (1 + y))

Formą regresji logistycznej jest zatem:

ln (t / (1 + y)) = b_0 + b_1 * x_1 + b_2 * x_2 + … b_n * x_n + e

gdzie y jest prawdopodobieństwem zdarzenia. Fakt, że używamy go jako binarnego klasyfikatora, wynika z interpretacji wyniku.

Uwaga: probit to kolejna funkcja łącza używana do regresji logistycznej, ale najczęściej używana jest logit.

Czy istnieją jakieś nienadzorowane algorytmy uczenia się danych sekwencyjnych?

Każda obserwacja w moich danych była zbierana z różnicą 0,1 sekundy. Nie nazywam tego szeregiem czasowym, ponieważ nie ma znacznika daty i godziny. W przykładach algorytmów grupowania (znalazłem online) i PCA przykładowe dane mają 1 obserwację na przypadek i nie są mierzone w czasie. Ale moje dane zawierają setki obserwacji zbieranych co 0,1 sekundy na pojazd i jest wiele pojazdów.

To, co masz, to sekwencja wydarzeń według czasu, więc nie wahaj się nazwać to Szeregiem Czasowym!

Grupowanie w szeregi czasowe ma 2 różne znaczenia:

  1. Segmentacja szeregów czasowych, tzn. Chcesz podzielić poszczególne szeregi czasowe na różne przedziały czasowe zgodnie z wewnętrznymi podobieństwami.
  2. Grupowanie szeregów czasowych, tzn. Masz kilka szeregów czasowych i chcesz znaleźć różne klastry zgodnie z podobieństwami między nimi.

Zakładam, że masz na myśli drugi, a oto moja propozycja:

Masz wiele pojazdów i wiele obserwacji na pojazd, tj. masz wiele pojazdów.

Masz więc kilka macierzy (każdy pojazd jest macierzą), a każda macierz zawiera N wierszy (Liczba obserwacji) i T kolumn (punkty czasowe). Jedną z sugestii może być zastosowanie PCA do każdej matrycy, aby zmniejszyć wymiarowość i obserwować dane w przestrzeni PC i sprawdzić, czy istnieją znaczące relacje między różnymi obserwacjami w obrębie matrycy (pojazdu). Następnie możesz umieścić każdą obserwację dla wszystkich pojazdów na sobie i zrobić matrycę i zastosować do tego PCA, aby zobaczyć relacje pojedynczej obserwacji między różnymi pojazdami. Jeśli nie masz wartości ujemnych, zdecydowanie zaleca się faktoryzację macierzy i redukcję wymiarów danych matrycowych. Inną sugestią może być umieszczenie wszystkich macierzy jeden na drugim i zbudowanie tensora NxMxT, gdzie N to liczba pojazdów, M to liczba obserwacji, a T to sekwencja czasowa i zastosowanie dekompozycji Tensor, aby zobaczyć relacje globalnie. Bardzo przyjemne podejście do klastrowania szeregów czasowych zostało przedstawione w tym artykule, w którym wdrożenie jest ciche od samego początku.

Mam nadzieję, że to pomogło!

Powodzenia 🙂

Jak wspomniałeś, masz na myśli segmentację szeregów czasowych. Dodaję to do odpowiedzi. Segmentacja szeregów czasowych jest jedynym problemem klastrowym, który ma podstawową prawdę do oceny. Rzeczywiście, rozważasz rozkład generowania poza szeregami czasowymi i analizujesz go. Zdecydowanie polecam to, to, to, to, to i tam, gdzie twój problem jest kompleksowo badany. Szczególnie ostatni i praca doktorska.

Powodzenia!

Z jakich algorytmów lub metod można wykryć wartość odstającą z tego zestawu danych?

Załóżmy, że mam zestaw danych: Kwota pieniędzy (100, 50, 150, 200, 35, 60, 50, 20, 500). Szukałem w Google informacji o technikach, które można wykorzystać do znalezienia możliwej wartości odstającej w tym zbiorze danych, ale skończyło się to zdezorientowane. Moje pytanie brzmi: jakich algorytmów, technik lub metod można użyć do wykrycia możliwej wartości odstającej w tym zbiorze danych?

PS: Weź pod uwagę, że dane nie mają normalnego rozkładu. Dzięki.

Prostym podejściem byłoby użycie tego samego, co robi wykresy pudełkowe: z dala od 1,5 (mediana-q1) lub 1,5 (q3-mediana) = wartość odstająca. Uważam to za przydatne w wielu przypadkach, nawet jeśli nie jest idealne i może zbyt proste. Ma tę zaletę, że nie zakłada normalności.

Jednym ze sposobów myślenia o wykrywaniu wartości odstających jest to, że tworzysz model predykcyjny, a następnie sprawdzasz, czy punkt mieści się w zakresie prognoz. Z teoretycznego punktu widzenia możesz zobaczyć, jak bardzo każda obserwacja zwiększa entropię twojego modelu. Jeśli traktujesz te dane jako zbiór liczb i nie masz proponowanego modelu ich generowania, równie dobrze możesz spojrzeć na średnią. Jeśli masz pewność, że liczby nie są normalnie dystrybuowane, nie możesz składać oświadczeń jak daleko „od” jest dana liczba od średniej, ale możesz po prostu spojrzeć na nią w wartościach bezwzględnych. Stosując to, możesz wziąć średnią wszystkich liczb, a następnie wykluczyć każdą liczbę i wziąć średnią pozostałych. Jakakolwiek średnia najbardziej różni się od średniej globalnej, jest największą wartością odstającą. Oto kilka python:

def avg(a):

return sum(a)/len(a)

l = [100, 50, 150, 200, 35, 60 ,50, 20, 500]

m = avg(l)

for idx in range(len(l)):

print(“outlier score of {0}: {1}”.format(l[idx], abs(m – avg([elem for i, elem in enumerate(l) if i!=idx]))))

>> 

outlier score of 100: 4

outlier score of 50: 10

outlier score of 150: 3

outlier score of 200: 9

outlier score of 35: 12

outlier score of 60: 9

outlier score of 50: 10

outlier score of 20: 14

outlier score of 500: 46

[30][Hadoop]

W projekcie Apache Hadoop opracowano oprogramowanie typu open source do niezawodnego, skalowalnego przetwarzania rozproszonego.

„Hadoop” zazwyczaj odnosi się do oprogramowania w projekcie, które implementuje platformę analizy danych mapreduce, a także rozproszony system plików (HDFS), który ją stanowi. Od wersji 0.23 Hadoop posiada autonomiczny menedżer zasobów: yarn. Ten menedżer zasobów ułatwia korzystanie z innych modułów oprócz silnika MapReduce, takich jak: Ambari, internetowe narzędzie do udostępniania, zarządzania i monitorowania klastrów Apache Hadoop, które obejmuje obsługę Hadoop HDFS, Hadoop MapReduce, Hive, HCatalog, HBase, ZooKeeper, Oozie, Pig i Sqoop. Ambari zapewnia również pulpit nawigacyjny do przeglądania stanu klastrów, takich jak mapy cieplne i możliwość wizualnego przeglądania aplikacji MapReduce, Pig i Hive wraz z funkcjami do diagnozowania ich charakterystyk wydajności w przyjazny dla użytkownika sposób:

Avro, system serializacji danych oparty na schematach JSON.

Cassandra, replikowany, odporny na awarie, zdecentralizowany i skalowalny system bazy danych.

Chukwa: System gromadzenia danych do zarządzania dużymi systemami rozproszonymi.

HBase, skalowalna, rozproszona baza danych, która obsługuje ustrukturyzowane przechowywanie danych dla dużych tabel.

Hive, infrastruktura hurtowni danych, która zapewnia podsumowanie danych i zapytania ad hoc.

Mahout, biblioteka algorytmów uczenia maszynowego zgodnych z paradygmatem M / R.

Pig, platforma / język programowania do tworzenia zadań równoległych

Storm, system przetwarzania w czasie rzeczywistym i przetwarzania strumieniowego

ZooKeeper, system koordynujący rozproszone węzły, podobny do Google Chubby

Oozie, system planowania przepływu pracy do zarządzania zadaniami Apache Hadoop.

Spark, szybki i ogólny silnik do przetwarzania danych na dużą skalę.

Flink, szybki i niezawodny silnik przetwarzania danych na dużą skalę.

PYTANIA:

 Jaka jest różnica między Hadoop a noSQL?

Słyszałem o wielu narzędziach / strukturach pomagających ludziom w przetwarzaniu ich danych (środowisko dużych zbiorów danych). Jeden nazywa się Hadoop, a drugi to koncepcja noSQL. Jaka jest różnica w punkcie przetwarzania? Czy się uzupełniają?

ODPOWIEDZI:

NoSQL to sposób na przechowywanie danych, które nie wymagają żadnej relacji. Kluczem jest prostota konstrukcji i możliwość skalowania w poziomie, jednym ze sposobów przechowywania danych jest: projektowanie par wartości. To nadaje się do przetwarzania podobnego do Hadoop. Korzystanie z bazy danych NoSQL naprawdę zależy od typu problemu, który występuje.

Hadoop to system przeznaczony do przechowywania i przetwarzania ogromnych ilości danych. Jest to rozproszony system plików dfs. Powodem tego jest to, że jego konstrukcja jest tak ważna, że ​​zakłada założenie, że awarie sprzętu są powszechne, tworząc w ten sposób wiele kopii tej samej informacji i rozprowadzając ją na wielu maszynach i stojakach, więc jeśli ktoś się zepsuje, nie ma problemu, my mam jeszcze dwie kopie. Oto świetny link do Hadoop również z wikipedii, zobaczysz, że moim zdaniem jest to nie tylko przechowywanie, ale także przetwarzanie: Hadoop

Można przenosić algorytmy zmniejszania mapy napisane dla MongoDB Hadoop później?

W naszej firmie mamy bazę danych MongoDB zawierającą wiele nieustrukturyzowanych danych, na których musimy uruchamiać algorytmy zmniejszania mapy w celu generowania raportów i innych analiz. Mamy do wyboru dwa podejścia do wdrożenia wymaganych analiz:

  1. Jednym z podejść jest wyodrębnienie danych z MongoDB do klastra Hadoop i wykonanie analizy całkowicie na platformie Hadoop. Wymaga to jednak znacznych inwestycji w przygotowanie platformy (oprogramowania i sprzętu) oraz wykształcenie zespołu do pracy z Hadoop i pisania zadań zmniejszania mapy.
  2. Innym podejściem jest po prostu włożenie wysiłku w zaprojektowanie algorytmów zmniejszania mapy i uruchomienie algorytmów w funkcjach zmniejszania mapy MongoDB. W ten sposób możemy stworzyć początkowy prototyp końcowego systemu, który może generować raporty. Wiem, że funkcje redukcji map MongoDB są znacznie wolniejsze w porównaniu do Hadoop, ale obecnie dane nie są tak duże, że czyni to jeszcze wąskim gardłem, przynajmniej nie przez następne sześć miesięcy.

Pytanie polega na tym, że korzystając z drugiego podejścia i pisząc algorytmy dla MongoDB, można je później przenieść do Hadoop przy niewielkiej potrzebie modyfikacji i przeprojektowaniu algorytmu? MongoDB obsługuje tylko JavaScript, ale różnice w języku programowania są łatwe do opanowania. Czy istnieją jednak fundamentalne różnice w modelu MongoDB i Hadoop z redukcją mapy, który może zmusić nas do przeprojektowania algorytmów w celu przeniesienia do Hadoop?

ODPOWIEDŹ:

Jeśli wykonasz prototyp używając tylko mongo, na pewno będzie zadanie tłumaczenia. Kiedy uruchomisz zadanie MapReduce na mongodb, ma ono wbudowane źródło danych i strukturę. Kiedy ostatecznie przekonwertujesz na hadoop, twoje struktury danych mogą nie wyglądać tak samo. Możesz wykorzystać złącze mongodb-hadoop, aby uzyskać dostęp do danych mongo bezpośrednio z poziomu hadoop, ale nie będzie to tak proste, jak mogłoby się wydawać. Czas, aby dowiedzieć się, jak dokładnie przeprowadzić konwersję w najbardziej optymalny sposób, raz łatwiej będzie uzasadnić ,że masz prototyp na miejscu, IMO. Podczas gdy będziesz musiał przetłumaczyć funkcje mapreduce, podstawowy pseudokod powinien mieć zastosowanie do obu systemów. W MongoDB nie znajdziesz niczego, co można zrobić przy użyciu Javy lub które jest znacznie bardziej skomplikowane w Javie.

Możesz używać algorytmów zmniejszania mapy w Hadoop bez programowania ich w Javie. Nazywa się to streamingiem i działa jak potokowanie Linux. Jeśli uważasz, że możesz przenieść swoje funkcje do odczytu i zapisu na terminalu, powinno działać dobrze. Oto przykładowy wpis na blogu, który pokazuje, jak korzystać z funkcji zmniejszania mapy napisanych w Pythonie w Hadoop.

Możesz także utworzyć połączenie MongoDB-Hadoop

Czy Amazon RedShift zastępuje Hadoop dla danych ~ 1XTB?

Hadoop i jego ekosystem są bardzo popularne. Jednak w praktyce, gdy wiele zestawów danych znajduje się w zakresie terabajtów, nie jest rozsądniej używać Amazon RedShift do odpytywania dużych zestawów danych, zamiast spędzać czas i wysiłek na budowie klastra Hadoop? W jaki sposób Amazon Redshift wypada w porównaniu z Hadoop pod względem złożoności konfiguracji, kosztów i wydajności?

Różnią się znacznie pod wieloma względami i nie sądzę, że Redshift zastąpi Hadoop. –Function. Na Redshift nie można uruchamiać niczego innego niż SQL. Co najważniejsze, nie można uruchamiać żadnych niestandardowych funkcji w Redshift. W Hadoop możesz, używając wielu języków (Java, Python, Ruby … nazywasz to). Na przykład NLP w Hadoop jest łatwe, podczas gdy w Redshift jest mniej lub bardziej niemożliwe. To znaczy. istnieje wiele rzeczy, które możesz zrobić w Hadoop, ale nie w Redshift. To chyba najważniejsza różnica. -Wykonanie zapytania o profil wydajności w trybie Redshift jest w większości przypadków znacznie wydajniejsze niż w Hadoop. Jednak ta wydajność pochodzi z indeksowania, które jest wykonywane, gdy dane są ładowane do Redshift (używam tutaj terminu indeksowanie bardzo luźno). Dlatego świetnie jest, jeśli załadujesz dane raz i wykonasz wiele zapytań, ale jeśli chcesz na przykład wykonać tylko jedno zapytanie, możesz stracić ogólną wydajność.

Które rozwiązanie wygrywa pod względem kosztów, zależy od sytuacji (np. wydajności), ale prawdopodobnie potrzebujesz sporo zapytań, aby uczynić go tańszym niż Hadoop (a dokładniej elastyczna redukcja mapy Amazon). Na przykład, jeśli wykonujesz OLAP, jest bardzo prawdopodobne, że Redshift wychodzi taniej. Jeśli wykonujesz codzienne partie ETL, bardziej prawdopodobne jest, że Hadoop będzie tańszy. Powiedziawszy to, zastąpiliśmy część naszej ETL, która została wykonana w Hive to Redshift, i to było całkiem wspaniałym doświadczeniem; głównie ze względu na łatwość rozwoju. Silnik zapytań Redshift jest oparty na PostgreSQL i jest bardzo dojrzały w porównaniu do Hive. Jego właściwości ACID ułatwiają uzasadnienie, a szybszy czas reakcji pozwala na przeprowadzenie większej liczby testów. To świetne narzędzie, ale nie zastąpi Hadoop.

EDYCJA: Jeśli chodzi o złożoność konfiguracji, powiedziałbym nawet, że dzięki Hadoop jest łatwiej, jeśli używasz EMR AWS. Ich narzędzia są tak dojrzałe, że uruchomienie zadania Hadoop jest absurdalnie proste. Narzędzia i mechanizmy związane z działaniem Redshift nie są jeszcze tak dojrzałe. Na przykład Redshift nie jest w stanie poradzić sobie z ładowaniem podtrzymującym, dlatego musisz wymyślić coś, co zamieni to w partię ładunków, co może zwiększyć złożoność twojego ETL.

Obecny limit rozmiaru dla Amazon Redshift to 128 węzłów lub 2 PB skompresowanych danych. Może być około 6PB nieskompresowany, chociaż przebieg różni się dla kompresji. Zawsze możesz nas poinformować, jeśli potrzebujesz więcej.

Osobiście nie sądzę, że tak trudno jest skonfigurować klaster hadoop, ale wiem, że czasem jest to bolesne, gdy zaczynasz. Ograniczenia rozmiaru HDFS znacznie przekraczają TB (czy miałeś na myśli eksabajt?). Jeśli się nie mylę, skaluje się do yottabajtów lub innego pomiaru, dla którego nawet nie znam tego słowa. Cokolwiek to jest, jest naprawdę duże. Narzędzia takie jak Redshift mają swoje miejsce, ale zawsze martwię się o rozwiązania specyficzne dla dostawcy. Moją główną troską jest  zawsze „co mam zrobić, gdy jestem niezadowolony z ich usług?” – Mogę przejść do wyszukiwarki Google i przenieść swoją analizę do paradygmatu lub przejść do hadoop i przenieść tę samą pracę do tego systemu. Tak czy inaczej, będę musiał nauczyć się czegoś nowego i dużo pracy przy tłumaczeniu. Biorąc to pod uwagę, miło jest móc przesłać zestaw danych i szybko rozpocząć pracę – szczególnie, jeśli to, co robię, ma krótki cykl życia. Amazon wykonał dobrą robotę, rozwiązując problem bezpieczeństwa danych. Jeśli chcesz uniknąć hadoopa, zawsze będzie alternatywa. Ale praca z tym nie jest wcale taka trudna.

Jakie są przypadki użycia dla Apache Spark vs. Hadoop?

Z Hadoop 2.0 i YARN Hadoop prawdopodobnie nie jest już związany tylko rozwiązaniami zmniejszającymi mapę. Z tym postępem, jakie są przypadki użycia Apache Spark vs Hadoop, biorąc pod uwagę, że oba siedzą na szczycie HDFS? Przeczytałem dokumentację wprowadzającą do Spark, ale jestem ciekawy, czy ktoś napotkał problem, który był bardziej wydajny i łatwiejszy do rozwiązania w przypadku Spark w porównaniu do Hadoop.

Hadoop oznacza HDFS, YARN, MapReduce i wiele innych rzeczy. Czy masz na myśli Spark vs MapReduce? Ponieważ Spark działa na / z Hadoop, co jest raczej celem. Głównym powodem używania Spark jest szybkość, a wynika to z faktu, że jego wykonanie może przechowywać dane w pamięci między etapami, a nie zawsze utrzymywać HDFS po mapie lub zmniejszeniu. Ta zaleta jest bardzo wyraźna w przypadku obliczeń iteracyjnych, które mają dziesiątki etapów, z których każdy dotyka tych samych danych. Tutaj rzeczy mogą być „100x” szybsze. W przypadku prostych, jednoprzebiegowych zadań podobnych do ETL, dla których zaprojektowano MapReduce, generalnie nie jest to szybsze. Innym powodem używania Spark jest jego ładniejszy język wysokiego poziomu w porównaniu do MapReduce. Zapewnia funkcjonalny widok podobny do programowania, który naśladuje Scalę, co jest o wiele ładniejsze niż pisanie kodu MapReduce. (Chociaż musisz albo użyć Scali, albo zaadaptować nieznacznie rozwinięte API Java lub Python dla Spark). Crunch and Cascading już teraz zapewniają podobną abstrakcję na MapReduce, ale wciąż jest to obszar, w którym Spark jest miły. Wreszcie Spark ma jeszcze młode, ale obiecujące podprojekty dla ML, analizy wykresów i streamingu, które ujawniają podobny, spójny API. Z MapReduce musiałbyś w tym celu zwrócić się do kilku innych projektów (Mahout, Giraph, Storm). Miło jest mieć go w jednym opakowaniu, choć jeszcze nie jest „wypiekany”. Dlaczego nie używałbyś Spark? parafrazując siebie:

* Spark to przede wszystkim Scala z przeniesionymi interfejsami API Java; MapReduce może być bardziej przyjazny i bardziej natywny dla programistów Java

* Obecnie istnieje więcej wiedzy MapReduce niż Spark

* Do zadań równoległych do danych, jednoprzebiegowych, podobnych do ETL zaprojektowano MapReduce,

* MapReduce jest lżejszy w porównaniu do odpowiednika Spark

Spark jest dość dojrzały, podobnie jak YARN, ale Spark-on-YARN jest wciąż całkiem nowy. Oba mogą nie być jeszcze optymalnie zintegrowane. Na przykład do niedawna nie sądzę, aby Spark mógł poprosić YARN o przydziały na podstawie liczby rdzeni? Oznacza to, że MapReduce może być łatwiejszy do zrozumienia, zarządzania i dostrojenia

Przetwarzanie danych przechowywanych w Redshift

Obecnie używamy Redshift jako hurtowni danych, z czego jesteśmy bardzo zadowoleni. Mamy jednak teraz obowiązek uczenia maszynowego na podstawie danych w naszym magazynie. Biorąc pod uwagę ilość danych, najlepiej byłoby wykonać obliczenia w tym samym miejscu, co dane, zamiast je przesuwać, ale nie wydaje się możliwe dzięki Redshift. Patrzyłem na MADlib, ale nie jest to opcja, ponieważ Redshift nie obsługuje UDF (czego wymaga MADlib). Obecnie zastanawiam się nad przeniesieniem danych do EMR i przetwarzaniem ich za pomocą biblioteki uczenia maszynowego Apache Spark (a może H20, Mahout lub cokolwiek innego). Więc moje pytania to:

  1. czy jest lepszy sposób?
  2. Jeśli nie, jak mam udostępnić dane Sparkowi? Do tej pory zidentyfikowałem następujące opcje: użyj Sqoop, aby załadować go do HDFS, użyj DBInputFormat, zrób eksport Redshift do S3 i każ Sparkowi pobrać go stamtąd. Jakie są zalety / wady dla tych różnych podejść (i innych) podczas korzystania ze Spark?

Pamiętaj, że jest to nauka wsadowa offline, ale chcielibyśmy móc to zrobić tak szybko, jak to możliwe, abyśmy mogli szybko iterować eksperymenty.

Nowa usługa Amazon Machine Learning Service może działać dla Ciebie. Działa bezpośrednio z Redshift i może być dobrym sposobem na rozpoczęcie. Jeśli chcesz przetwarzać za pomocą EMR, możesz użyć polecenia UNLOAD Redshift, aby wyładować dane na S3. Spark na EMR może następnie uzyskać do niego bezpośredni dostęp bez konieczności wciągania go do HDFS.