[011][Data Cleaning](2)

PYTANIE: Radzenie sobie z zestawem treningowym o wątpliwej jakości

Większość materiałów, które przeczytałem w przeszłości, zwykle zakłada, że ​​zestaw treningowy jest bezbłędny. Wydaje się jednak, że tak nie jest w przypadku tego, co otrzymałem. Dane, które mają zostać przesłane do zestawu treningowego, są często wątpliwe (nawet nie wiem, jak zacząć oddzielać dobre od złych). Spędziłem znacznie więcej czasu próbując wstępnie przetworzyć pliki w celu zwiększenia ważności danych, niż budować prototyp. Zrzuciłem tylko część danych, które mają być lepsze. Wciąż są dane z innych źródeł, które uzupełniają brakującą część pierwszego zestawu danych treningowych. Biorąc pod uwagę ilość danych, praktycznie nie mogę poświęcić im zbyt wiele czasu. Pytanie brzmi: w jaki sposób ludzie radzą sobie z naprawdę okropnymi, niespójnymi danymi w prawdziwym życiu (zakładając, że pracuję z adresami, w których ludzie często piszą zły kod pocztowy z powodu złego planowania miasta lub braku jasnych instrukcji, źle wpisują nazwę dzielnicy, plus dane zostały „automatycznie skorygowane” przez program Excel, tak że „1-2” staje się „1 lutego” itp.)? W szczególności, w jaki sposób mogę zapewnić jakość klasyfikatora pociągu, biorąc pod uwagę, że zestaw szkoleniowy (i zestaw krzyżowej weryfikacji) ma wątpliwą jakość?

ODPOWIEDŹ: Witamy w prawdziwym świecie nauki o danych. Tutaj zestawy danych nie są tak czyste, jak myślałeś podczas tych kursów / samouczków online. Są super dopracowane i dopracowane. Ale dane ze świata rzeczywistego nie są takie. Etap czyszczenia nazywany jest etapem wstępnego przetwarzania danych. Tak więc niektóre fajne techniki czyszczenia danych to:

  1. Eliminacja kolumn / predyktorów zerowej wariancji: kolumny te nie są ważne i powodują awarię modelu i dopasowania. Wyeliminowanie ich byłoby więc całkowicie sensowne.
  2. Korelowane predyktory: Zmniejszenie poziomu korelacji między predyktorami byłoby bardzo dobrym krokiem w procesie wstępnego przetwarzania.
  3. Skalowanie: Musisz wiedzieć, dlaczego skalowanie jest ważne podczas procesu wstępnego.
  4. Transformacje predyktorów

ODPOWIEDŹ: Możesz użyć technik częściowo nadzorowanego uczenia, w którym masz mały czysty zestaw treningowy i niektóre brudne dane. Rozbudowujesz swoją bazę danych, oceniając, jak dobre są inne dane i włączasz „najlepsze” punkty danych do swojego zestawu treningowego

[010][Data Cleaning]

Czyszczenie danych jest wstępnym krokiem do analizy statystycznej, w której zestaw danych jest edytowany w celu poprawienia błędów i nadania mu formy odpowiedniej do przetwarzania przez oprogramowanie statystyczne. Techniki analizy danych eksploracyjnych są często stosowane w celu identyfikacji problemu.

PYTANIE: Jak mogę przekształcić nazwy w poufny zestaw danych, aby uczynić go anonimowym, ale zachować niektóre cechy tych nazw?

Pracuję z zestawami danych, które zawierają dane osobowe (PII) i czasami muszę udostępniać część zbioru danych stronom trzecim w sposób, który nie naraża PII i nie naraża mojego pracodawcy na odpowiedzialność. Nasze zwykłe podejście polega tutaj na całkowitym wstrzymaniu danych, a w niektórych przypadkach na zmniejszeniu ich rozdzielczości; np. zastąpienie dokładnego adresu ulicy odpowiednim okręgiem lub spisem spisowym. Oznacza to, że niektóre rodzaje analiz i przetwarzania muszą być wykonywane wewnętrznie, nawet jeśli strona trzecia ma zasoby i wiedzę bardziej dostosowane do tego zadania. Ponieważ dane źródłowe nie są ujawniane, sposób, w jaki podchodzimy do tej analizy i przetwarzania, nie jest przejrzysty. W rezultacie zdolność jakiejkolwiek strony trzeciej do przeprowadzania kontroli jakości / kontroli jakości, dostosowywania parametrów lub wprowadzania udoskonaleń może być bardzo ograniczona.

Anonimizacja poufnych danych

Jedno z zadań obejmuje identyfikację osób według ich nazw, w danych przesłanych przez użytkownika, z uwzględnieniem błędów i niespójności. Osoba prywatna może być zapisana w jednym miejscu jako „Dave”, a w innym jako „David”, podmioty komercyjne mogą mieć wiele różnych skrótów i zawsze są jakieś literówki. Opracowałem skrypty oparte na wielu kryteriach, które określają, kiedy dwa rekordy o nieidentycznych nazwach reprezentują tę samą osobę, i przypisują im wspólny identyfikator. W tym momencie możemy uczynić zestaw danych anonimowym, ukrywając nazwy i zastępując je tym osobistym numerem identyfikacyjnym. Ale to oznacza, że ​​odbiorca prawie nie ma informacji o np. siła meczu. Wolelibyśmy móc przekazywać jak najwięcej informacji bez ujawniania tożsamości.

Co nie działa

Na przykład byłoby wspaniale móc szyfrować ciągi przy zachowaniu odległości edycji. W ten sposób osoby trzecie mogą wykonać niektóre z własnej kontroli jakości / kontroli jakości lub zdecydować się na dalsze przetwarzanie samodzielnie, bez uzyskiwania dostępu (lub możliwości potencjalnej zmiany) danych osobowych. Być może dopasowujemy ciągi wewnętrznie z odległością edycji <= 2, a odbiorca chce przyjrzeć się implikacjom zaostrzenia tej tolerancji na odległość edycji <= 1. Ale jedyną znaną mi metodą jest ROT13 (bardziej ogólnie , każdy szyfr szyfrujący), który nawet nie liczy się jako szyfrowanie; to tak, jakby napisać nazwiska do góry nogami i powiedzieć: „Obiecujesz, że nie przewrócisz papieru?” Innym złym rozwiązaniem byłoby skrócenie wszystkiego. „Ellen Roberts” zmienia się w „ER” i tak dalej. To kiepskie rozwiązanie, ponieważ w niektórych przypadkach inicjały, w połączeniu z danymi publicznymi, ujawnią tożsamość osoby, aw innych przypadkach są zbyt niejednoznaczne; „Benjamin Othello Ames” i „Bank of America” będą miały takie same inicjały, ale ich nazwy są inaczej różne. Więc nie robi żadnej z rzeczy, których chcemy. Nieelegancką alternatywą jest wprowadzenie dodatkowych pól w celu śledzenia niektórych atrybutów nazwy, np .:

Nazywam to „nieeleganckim”, ponieważ wymaga przewidywania, które cechy mogą być interesujące i jest stosunkowo szorstkie. Jeśli nazwy zostaną usunięte, niewiele można rozsądnie wnioskować o sile dopasowania między rzędami 2 i 3 lub o odległości między rzędami 2 i 4 (tj. O tym, jak blisko są dopasowania).

Wniosek

Celem jest transformacja ciągów w taki sposób, aby zachować jak najwięcej użytecznych właściwości oryginalnego ciągu, jednocześnie zasłaniając oryginalny ciąg. Odszyfrowanie powinno być niemożliwe lub tak niepraktyczne, aby było faktycznie niemożliwe, bez względu na rozmiar zestawu danych. W szczególności bardzo przydatna byłaby metoda, która zachowuje odległość edycji między dowolnymi ciągami.

ODPOWIEDŹ: Jedno z odniesień, które wspomniałem w PO, doprowadziło mnie do potencjalnego rozwiązania, które wydaje się dość potężne, opisane w „Zachowującym prywatność powiązaniu rekordów za pomocą filtrów Bloom” (doi: 10.1186 / 1472-6947-9-41):

Opracowano nowy protokół służący do zachowania poufności powiązania rekordów z zaszyfrowanymi identyfikatorami, pozwalający na błędy w identyfikatorach. Protokół oparty jest na filtrach Blooma na q-gramach identyfikatorów. Artykuł szczegółowo opisuje metodę, którą streszczę tutaj najlepiej jak potrafię. Filtr Blooma to seria bitów o stałej długości, przechowująca wyniki ustalonego zestawu niezależnych funkcji skrótu, z których każdy jest obliczany na tej samej wartości wejściowej. Wyjściem każdej funkcji skrótu powinna być wartość indeksu spośród możliwych indeksów w filtrze; tzn. jeśli masz serię 10 bitów z indeksowaniem 0, funkcje skrótu powinny zwracać (lub być odwzorowane na) wartości od 0 do 9. Filtr rozpoczyna się od każdego bitu ustawionego na 0. Po zaszyfrowaniu wartości wejściowej każdą funkcją z zestaw funkcji skrótu, każdy bit odpowiadający wartości indeksu zwracanej przez dowolną funkcję skrótu jest ustawiony na 1. Jeśli ten sam indeks jest zwracany przez więcej niż jedną funkcję skrótu, bit o tym indeksie jest ustawiany tylko raz. Można uznać filtr Bloom za superpozycję zbioru skrótów na ustalony zakres bitów. Protokół opisany w powyższym artykule dzieli łańcuchy na n-gram, które są w tym przypadku zestawami znaków. Na przykład „cześć” może dać następujący zestaw 2 gramów:

Wypełnianie przodu i tyłu spacjami wydaje się być ogólnie opcjonalne przy konstruowaniu n-gramów; przykłady podane w artykule, który proponuje tę metodę, wykorzystują takie wypełnienie. Każdy n-gram można haszować, aby uzyskać filtr Bloom, a ten zestaw filtrów Bloom może  nakłada się na siebie (bitowa operacja LUB), aby utworzyć filtr Bloom dla łańcucha. Jeśli filtr zawiera o wiele więcej bitów niż w przypadku funkcji skrótu lub n-gramów, stosunkowo mało prawdopodobne jest, aby arbitralne łańcuchy tworzyły dokładnie ten sam filtr. Jednak im więcej ngramów mają dwa ciągi, tym więcej bitów ich filtry będą ostatecznie dzielić. Następnie możesz porównać dowolne dwa filtry A, B za pomocą współczynnika Dicei:

Gdzie h jest liczbą bitów ustawionych na 1 w obu filtrach, a jest liczbą bitów ustawioną na 1 tylko w filtrze A, a b jest liczbą bitów ustawioną na 1 w samym filtrze B. Jeśli łańcuchy są dokładnie to samo, współczynnik kości wyniesie 1; im bardziej się różnią, tym bliższy współczynnik będzie 0. Ponieważ funkcje mieszające odwzorowują nieokreśloną liczbę unikalnych danych wejściowych na niewielką liczbę możliwych indeksów bitowych, różne dane wejściowe mogą generować ten sam filtr, więc współczynnik wskazuje tylko prawdopodobieństwo że łańcuchy są takie same lub podobne. Liczba różnych funkcji skrótu i ​​liczba bitów w filtrze są ważnymi parametrami do określania prawdopodobieństwa fałszywych trafień – pary danych wejściowych, które są znacznie mniej podobne niż współczynnik kostki wytwarzany tą metodą. Istnieje pewna elastyczność we wdrażaniu tej metody; zobacz także ten artykuł z 2010 r. (również link na końcu pytania), aby uzyskać pewne wskazówki na temat jego skuteczności w stosunku do innych metod i różnych parametrów.

ODPOWIEDŹ: Jeśli to możliwe, powiążę powiązane rekordy (np. Dave, David itp.) I zastąpię je numerem sekwencyjnym (1,2,3 itd.) Lub solonym hashem ciągu, który jest używany do reprezentowania wszystkich powiązanych rekordy (np. David zamiast Dave). Zakładam, że osoby trzecie nie muszą mieć pojęcia, jak naprawdę się nazywa, w przeciwnym razie równie dobrze możesz im je podać. edycja: Musisz zdefiniować i uzasadnić, jakie operacje musi wykonywać osoba trzecia. Na przykład, co jest złego w używaniu inicjałów, po których następuje liczba (np. BOA-1, BOA-2 itd.), Aby ujednoznacznić Bank of America od Benjamina Othello Amesa? Jeśli to zbyt odkrywcze, możesz skasować niektóre litery lub nazwiska; np. [AE] -> 1, [FJ] -> 2 itd., więc BOA zmieni się w 1OA, lub [„Bank”, „Barry”, „Bruce” itp.] -> 1, więc Bank of America ponownie 1OA.

ODPOWIEDŹ: Jedną z opcji (w zależności od rozmiaru zestawu danych) jest podanie odległości edycji (lub innych miar podobieństwa, których używasz) jako dodatkowego zestawu danych.

Na przykład.:

  1. Wygeneruj zestaw unikalnych nazw w zbiorze danych
  2. Dla każdej nazwy oblicz odległość edycji względem siebie
  3. Wygeneruj identyfikator lub nieodwracalny skrót dla każdej nazwy
  4. Zastąp nazwy w oryginalnym zestawie danych tym identyfikatorem
  5. Podaj macierz odległości edycji między numerami ID jako nowy zestaw danych

Chociaż można jeszcze wiele zrobić, aby nawet zdeanonimizować dane z tych danych.

Na przykład. jeśli wiadomo, że „Tim” jest najpopularniejszym imieniem dla chłopca, liczenie częstotliwości identyfikatorów, które ściśle pasują do znanego odsetka Timi w całej populacji, może to dać. Następnie możesz poszukać imion z odległością edycji 1 i dojść do wniosku, że te identyfikatory mogą odnosić się do „Toma” lub „Jima” (w połączeniu z innymi informacjami).

[009][Aws]

PYTANIE: Instancje vs. rdzenie przy użyciu EC2

Pracując nad czymś, co często można nazwać projektami „średnich danych”, byłem w stanie zrównoleglać mój kod (głównie do modelowania i prognozowania w Pythonie) w jednym systemie w dowolnym miejscu od 4 do 32 rdzeni. Teraz zastanawiam się nad skalowaniem do klastrów w EC2 (prawdopodobnie z StarCluster / IPython, ale także otwartym na inne sugestie) i zastanawiałem się, jak pogodzić dystrybucję pracy między rdzeniami w instancji vs. instancje w klastrze.

Czy praktyczna jest nawet równoległość między instancjami, a także między rdzeniami w każdej instancji?

Jeśli tak, to czy ktoś może szybko podsumować zalety i wady prowadzenia wielu instancji z kilkoma rdzeniami w porównaniu do kilku instancji z wieloma rdzeniami? Czy istnieje ogólna zasada wyboru właściwego stosunku liczby instancji do liczby rdzeni na instancję?

Przepustowość i pamięć RAM nie są trywialnymi problemami w moich projektach, ale łatwo jest zauważyć, kiedy są to wąskie gardła i dostosować je. Wyobrażam sobie, że o wiele trudniej jest porównać właściwą kombinację rdzeni z instancjami bez powtarzania testów, a moje projekty różnią się zbytnio, aby każdy test mógł być zastosowany w każdych okolicznościach. Z góry dziękuję, a jeśli nie udało mi się poprawnie google google, możesz wskazać mi właściwą odpowiedź w innym miejscu!

ODPOWIEDŹ: Korzystając z IPython, prawie nie musisz się o to martwić (kosztem pewnej utraty wydajności / większego narzutu komunikacji). Równoległa wtyczka IPython w StarCluster domyślnie uruchomi jeden silnik na fizyczny rdzeń w każdym węźle (uważam, że można to skonfigurować, ale nie jestem pewien, gdzie). Po prostu uruchamiasz, co chcesz we wszystkich silnikach, używając interfejsu API DirectView (map_sync, Apply_sync,…) lub magicznych poleceń %px. Jeśli używasz już IPython równolegle na jednym komputerze, użycie go w klastrze nie różni się. Odpowiadając na niektóre z twoich szczegółowych pytań: „jak pogodzić dystrybucję pracy między rdzeniami w instancji a instancjami w klastrze” – otrzymujesz przynajmniej jeden silnik na rdzeń (przynajmniej); praca jest automatycznie dystrybuowana we wszystkich rdzeniach i we wszystkich instancjach. „Czy praktyczna jest nawet równoległość między instancjami, a także między rdzeniami w każdej instancji?” – Tak 🙂 Jeśli kod, który uruchamiasz, jest krępująco równoległy (dokładnie ten sam algorytm na wielu zestawach danych), możesz w większości zignorować, gdzie działa dany silnik. Jeśli rdzeń wymaga dużej komunikacji między silnikami, to oczywiście musisz go tak skonstruować, aby silniki komunikowały się przede wszystkim z innymi silnikami na tej samej maszynie fizycznej; ale myślę, że tego rodzaju problem nie jest idealny dla IPython. „Jeśli tak, to czy ktoś może szybko podsumować zalety i wady prowadzenia wielu instancji z kilkoma rdzeniami w porównaniu do kilku instancji z wieloma rdzeniami? Czy istnieje ogólna zasada wyboru właściwego stosunku liczby instancji do liczby rdzeni na instancję? ” – Użyj największych instancji c3 dla ograniczeń obliczeniowych, a najmniejszych dla problemów związanych z przepustowością pamięci (lub wystarczająco małych, aby problem prawie przestał być związany z przepustowością pamięci); w przypadku problemów związanych z przekazywaniem wiadomości należy również użyć największych instancji, ale spróbuj podzielić problem na partycje, aby każda partycja działała na jednym fizycznym komputerze, a większość przekazywanych wiadomości była w tej samej partycji. Problemy, które działają znacznie wolniej na N poczwórnej c3 niż na 2N podwójnej c3, są rzadkie (sztuczny przykład może polegać na uruchamianiu wielu prostych filtrów na dużej liczbie obrazów, w których przeglądasz wszystkie obrazy dla każdego filtra zamiast wszystkich filtrów dla tego samego obrazu ). Używanie największych instancji jest dobrą regułą.

ODPOWIEDŹ: Ogólną zasadą jest, aby nie rozpowszechniać, dopóki nie będziesz musiał. Zazwyczaj bardziej wydajne jest posiadanie N serwerów o określonej pojemności niż 2N serwerów o połowie takiej pojemności. Większy dostęp do danych będzie lokalny, a zatem szybki w pamięci w porównaniu do wolnego w sieci.

W pewnym momencie skalowanie jednej maszyny staje się nieekonomiczne, ponieważ koszt dodatkowych zasobów skaluje się bardziej niż liniowo. Jednak ten punkt jest wciąż niezwykle wysoki. W szczególności na Amazon, ekonomia każdego typu instancji może się znacznie różnić, jeśli używasz instancji rynku kasowego. Domyślna wycena mniej więcej oznacza, że ​​ta sama kwota kosztów zasobów mniej więcej taka sama, niezależnie od typu wystąpienia, która może się znacznie różnić; duże instancje mogą być tańsze niż małe lub N małych instancji może być znacznie tańsze niż jedna duża maszyna z równoważnymi zasobami. Ogromne znaczenie ma tutaj to, że algorytm obliczeń może się bardzo zmienić, gdy przenosisz się z jednej maszyny na wiele maszyn. Kompromisy, które wywołują narzuty komunikacyjne, mogą zmusić Cię do przyjęcia na przykład paradygmatu równoległego do skalowania. Oznacza to inny wybór narzędzi i algorytmu. Na przykład SGD wygląda zupełnie inaczej w pamięci iw Pythonie niż na MapReduce. Abyś  tak zrobił należy to rozważyć przed zrównolegleniem. Możesz zdecydować się na dystrybucję pracy w klastrze, nawet jeśli jeden węzeł i niedystrybuowane paradygmaty działają dla Ciebie, dla niezawodności. Jeśli pojedynczy węzeł zawiedzie, tracisz wszystkie obliczenia; obliczenia rozproszone mogą potencjalnie odzyskać i zakończyć tylko część obliczeń, która została utracona.

ODPOWIEDŹ: Wszystkie rzeczy uważane za równe (koszt, wydajność procesora itp.), Możesz wybrać najmniejszą instancję, która może przechowywać cały mój zestaw danych w pamięci i skalować. W ten sposób upewniasz się, że nie wywołujesz niepotrzebnych opóźnień z powodu komunikacji sieciowej i dążysz do maksymalizacji całkowitej dostępnej przepustowości pamięci dla swoich procesów. Zakładając, że korzystasz z jakiegoś schematu weryfikacji krzyżowej w celu zoptymalizowania niektórych meta-parametrów twojego modelu, przypisz każdemu rdzeniu wartość do przetestowania i wybierz wiele instancji w razie potrzeby, aby pokryć całą przestrzeń parametrów w tak małej liczbie rund, jak uznasz za stosowne. Jeśli Twoje dane nie mieszczą się w pamięci jednego systemu, oczywiście musisz rozdzielić je między instancje. Następnie chodzi o zrównoważenie opóźnienia pamięci (lepiej w wielu instancjach) z opóźnieniem sieci (lepiej w mniejszej liczbie instancji), ale biorąc pod uwagę naturę EC2, założę się, że często wolisz pracować z kilkoma grubymi instancjami.

[008][Wykresy]

Ogromna baza danych Facebooka

PYTANIE: Zakładam, że każda osoba na Facebooku jest reprezentowana jako węzeł (wykresu) na Facebooku, a związek / przyjaźń między każdą osobą (węzłem) jest reprezentowany jako krawędź między zaangażowanymi węzłami. Biorąc pod uwagę, że na Facebooku są miliony ludzi, w jaki sposób jest przechowywany Wykres?

ODPOWIEDŹ: Dziwne, jak się wydaje, wykresy i bazy danych wykresów są zazwyczaj implementowane jako listy połączone. Jak wspomniano tutaj, nawet najpopularniejsza baza danych grafów (neo4j), potajemnie używa czegoś podobnego do podwójnie powiązanej listy. Reprezentowanie wykresu w ten sposób ma wiele znaczących zalet, ale ma także kilka wad. Po pierwsze, przedstawienie wykresu w ten sposób oznacza, że ​​możesz wstawiać krawędzie w niemal stałym czasie. Po drugie, oznacza to, że przemierzanie wykresu może nastąpić niezwykle szybko, jeśli chcemy tylko zwiększyć lub zmniejszyć listę połączoną. Największa wada tego wynika jednak z czegoś, co czasami nazywa się efektem Justina Biebera, w którym węzły z dużą liczbą połączeń są bardzo powolne w ocenie. Wyobraź sobie, że musisz przemierzać milion pół redundantnych linków za każdym razem, gdy ktoś jest powiązany z Justinem Bieberem. Wiem, że wspaniali ludzie z Neo4j pracują nad drugim problemem, ale nie jestem pewien, jak sobie z tym poradzą ani jaki sukces odnieśli.

Trochę pracując z danymi na Facebooku (zebranymi od użytkowników Facebooka), zapisaliśmy je jako parę wartości: USER_ID, FRIEND_USER_ID. Ale myślę, że twoje pytania są nieco głębsze? Możesz przechowywać go na różne sposoby, w zależności od pytania badawczego. Jedną interesującą opcją są na przykład triady

[007][Walidacja krzyżowa]

PYTANIE : K-krotnie vs powtarzane losowe podpróbkowanie. Zastanawiam się, jaki rodzaj krzyżowej walidacji modelu wybrać dla problemu klasyfikacji: Kfold czy losowe podpróbkowanie (próbkowanie bootstrap)? Moje najlepsze przypuszczenie to użycie 2/3 zbioru danych (około ~ 1000 pozycji) do treningu i 1/3 do walidacji. W tym przypadku K-fold daje tylko trzy iteracje (fałdy), co nie wystarczy, aby zobaczyć stabilny średni błąd. Z drugiej strony nie podoba mi się funkcja losowego podpróbkowania: niektóre elementy nigdy nie zostaną wybrane do szkolenia / walidacji, a niektóre zostaną użyte więcej niż jeden raz. Zastosowane algorytmy klasyfikacji: losowa regresja leśna i logistyczna.

ODPOWIEDŹJeśli masz wystarczającą liczbę próbek i chcesz wykorzystać wszystkie dane, to dobrym wyborem jest cross-walidacja k-fold. Posiadanie ~ 1500 wydaje się bardzo dużo, ale to, czy jest to wystarczające do k-fols walidacji krzyżowej, zależy również od wymiarów danych (liczby atrybutów i liczby wartości atrybutów). Na przykład, jeśli każda obserwacja ma 100 atrybutów, wówczas 1500 obserwacji jest niska. Kolejnym potencjalnym minusem k-krotnej walidacji krzyżowej jest możliwość pojedynczego, skrajnego odchylenia wypaczającego wyniki. Na przykład, jeśli masz jedną skrajną wartość odstającą, która może mocno wpłynąć na twój klasyfikator, to w 10-krotnej walidacji krzyżowej wpłynie to na 9 z 10 partycji (chociaż w przypadku losowych lasów nie sądzę, abyś miał ten problem ). Losowe podpróbkowanie (np. Próbkowanie bootstrap) jest preferowane, gdy masz niedoświadczony lub gdy masz powyższą sytuację, w której nie chcesz, aby każda obserwacja pojawiała się w fałdach k-1.

ODPOWIEDŹWydaje mi się, że mówisz, że chcesz zastosować 3-krotną walidację krzyżową, ponieważ wiesz coś o swoich danych (że użycie k = 10 spowodowałoby nadmierne dopasowanie? Jestem ciekaw twojego rozumowania). Nie jestem pewien, czy o tym wiesz, jeśli nie, możesz po prostu użyć większego k. Jeśli nadal uważasz, że nie możesz użyć standardowej krzyżowej weryfikacji k-fold, to możesz zmodyfikować nieco algorytm: powiedz, że podzieliłeś dane na 30 krotności i za każdym razem użyj 20 do treningu i 10 do oceny (a następnie przesuń w górę jeden krotnie i użyj pierwszej i ostatniej 9 jako oceny, a resztę jako treningu). Oznacza to, że możesz korzystać ze wszystkich swoich danych. Kiedy używam k-krotnej weryfikacji krzyżowej, zwykle uruchamiam ten proces wielokrotnie z inną randomizacją, aby upewnić się, że mam wystarczającą ilość danych, jeśli nie, zobaczysz różne wyniki w zależności od randomizacji. W takich przypadkach sugerowałbym pobieranie próbek. Sztuka polega na tym, aby robić to wystarczająco często.

[006][Apache Spark](2)

PYTANIE : Operacje oparte na skanowaniu Apache Spark 

Patrząc na pierwszy artykuł na temat RDD / Apache Spark, znalazłem stwierdzenie, że „RDD ulegają degradacji z wdziękiem, gdy nie ma wystarczającej ilości pamięci do ich przechowywania, o ile są one używane tylko w operacjach opartych na skanowaniu”.

Czym są operacje oparte na skanowaniu w kontekście RDD, a które z transformacji w Spark są operacjami opartymi na skanowaniu?

ODPOWIEDŹ :

Operacje oparte na skanowaniu to w zasadzie wszystkie operacje wymagające oceny predykatu na RDD. Innymi słowy, za każdym razem, gdy utworzysz RDD lub ramkę danych, w której musisz obliczyć predykat, taki jak wykonanie filtru, mapy dla klasy sprawy, na przykład, a nawet metody wyjaśnienia, będzie uważany za operację opartą na skanowaniu.

Aby być bardziej przejrzystym, przejrzyjmy definicję predykatu. Predykat lub predykat funkcjonalny jest logicznym symbolem, który może być zastosowany do terminu przedmiotowego w celu wytworzenia innego terminu przedmiotowego. Predykaty funkcjonalne są również czasami nazywane odwzorowaniami, ale termin ten może mieć również inne znaczenie.

Przykład:

// transformacja oparta na skanie

rdd.filter(!_.contains(“#”)) // here the predicate is !_.contains(“#”)

// kolejna transformacja oparta na skanie

rdd.filter(myfunc) // myfunc jest funkcją logiczną

// trzecia również trywialna transformacja oparta na skanie, po której następuje transformacja nie oparta na skanie.

rdd.map (myfunc2)

.reduce (myfunc3)

Jeśli chcesz zrozumieć, jak działają wewnętrzne iskierki, sugeruję, abyś obejrzał prezentację Databricks na ten temat

[005][Apache Spark](1)

Apache Spark to system obliczeń klastrowych typu open source, którego celem jest szybkie analizowanie danych – zarówno szybkie uruchamianie, jak i szybkie pisanie. Aby szybciej uruchamiać programy, Spark oferuje ogólny model wykonywania, który może optymalizować dowolne wykresy operatorów, i obsługuje obliczenia w pamięci, co pozwala wyszukiwać dane szybciej niż silniki oparte na dyskach, takie jak hadoop. Spark nie jest powiązany z dwustopniowym paradygmatem mapreduce i obiecuje wydajność do 100 razy szybszą niż Hadoop MapReduce. Spark zapewnia operacje podstawowe dla obliczeń klastrowych w pamięci, które umożliwiają programom użytkownika ładowanie danych do pamięci klastra i wielokrotne sprawdzanie ich, co czyni dobrze nadającym się do algorytmu uczenia się maszyny. Aby przyspieszyć programowanie, Spark zapewnia czyste, zwięzłe interfejsy API w językach scala, java i python. Możesz także używać Spark interaktywnie z powłok Scala i Pythona, aby szybko wyszukiwać duże zestawy danych. Spark działa na przędzy, mesosie, autonomicznie lub w chmurze. Może uzyskać dostęp do różnych źródeł danych, w tym hdfs, cassandra, hbase i amazon-s3.

PYTANIE:

 Rozwój lokalny dla Apache Spark

Zastanawiam się, jak inni programiści konfigurują lokalne środowiska do pracy nad projektami Spark. Czy konfigurujesz klaster „lokalny” za pomocą narzędzia takiego jak Vagrant? A może SSH najczęściej występuje w środowisku chmurowym, takim jak klaster w AWS? Być może istnieje wiele zadań, w których klaster z jednym węzłem jest odpowiedni i może być uruchamiany lokalnie łatwiej.

ODPOWIEDŹ:

Spark ma być skierowany na duże rozproszone zestawy danych, więc jak sugerujesz, najbardziej typowe przypadki użycia będą wymagać połączenia z jakimś systemem chmurowym, takim jak AWS. W rzeczywistości, jeśli zestaw danych, który chcesz przeanalizować, może zmieścić się w twoim systemie lokalnym, zwykle zauważysz, że możesz go przeanalizować równie prosto, używając czystego pytona. Jeśli próbujesz wykorzystać serię lokalnych maszyn wirtualnych, dość szybko zabraknie pamięci, a zadania albo się nie powiodą, albo się zatrzymają. To powiedziawszy, lokalna instancja iskry jest bardzo przydatna do celów rozwoju. Jednym ze sposobów, który według mnie działa, jest to, że jeśli mam katalog w HDFS z wieloma plikami, przeciągnę jeden plik, opracuję lokalnie, a następnie prześlę mój skrypt Spark do mojego systemu w chmurze w celu wykonania. Jeśli korzystasz z AWS, jest to naprawdę pomocne w unikaniu dużych opłat podczas rozwoju

[004][Dane kategoryczne]

Do celów analizy ,wartości kategoryczne są traktowane jako abstrakcyjne byty bez jakiejkolwiek struktury matematycznej, takiej jak porządek lub topologia, niezależnie od tego, jak są kodowane i przechowywane.

PYTANIE: Jak mogę dynamicznie odróżnić dane kategoryczne od danych liczbowych?

Znam kogoś, kto pracuje nad projektem, który obejmuje przyjmowanie plików danych bez względu na kolumny lub typy danych. Zadanie polega na pobraniu pliku z dowolną liczbą kolumn i różnych typów danych oraz wyjściowych statystyk podsumowujących dane liczbowe. Nie ma jednak pewności, jak dynamicznie przypisywać typy danych do niektórych danych liczbowych. Na przykład:

MIASTO

Albuquerque

Boston

Chicago

To oczywiście nie są dane liczbowe i będą przechowywane jako tekst. Jednak,

ZIP

80221

60653

25525

nie są wyraźnie oznaczone jako kategoryczne. Jego oprogramowanie przypisuje kod pocztowy jako statystyki numeryczne i podsumowujące dane wyjściowe, co nie ma sensu dla tego rodzaju danych. Kilka pomysłów, które mieliśmy:

  1. Jeśli kolumna zawiera wszystkie liczby całkowite, oznacz ją jako kategoryczną. To oczywiście nie zadziałałoby, ale to był pomysł.
  2. Jeśli kolumna ma mniej niż n unikalnych wartości i jest liczbowa, oznacz ją kategorycznie. Może to być bliżej, ale nadal mogą występować problemy z przepływaniem danych liczbowych.
  3. Utrzymaj listę typowych danych liczbowych, które powinny faktycznie być jakościowe, i porównaj nagłówki kolumn z tą listą w celu dopasowania. Na przykład wszystko, co zawiera „ZIP”, byłoby kategoryczne. Mój żołądek mówi mi, że nie ma sposobu, aby dokładnie przypisać dane liczbowe jako kategoryczne lub liczbowe, ale liczyłem na sugestię. Wszelkie informacje, które posiadasz, są bardzo mile widziane.

ODPOWIEDŹ

(1) Nie znam niezawodnego sposobu na zrobienie tego. Oto jeden pomysł z mojej głowy:

  1. Domyślnie traktuj wartości jako jakościowe.
  2. Sprawdź różne atrybuty danych, które sugerowałyby, że są one rzeczywiście ciągłe. Wagi tych atrybutów na podstawie prawdopodobieństwa korelacji z ciągłymi danymi. Oto kilka możliwych przykładów:

* Wartości są liczbami całkowitymi: +.7

* Wartości są zmiennoprzecinkowe: +.8

* Wartości są zwykle dystrybuowane: +.3

* Wartości zawierają stosunkowo niewielką liczbę unikalnych wartości: +.3

* Wartości nie są taką samą liczbą znaków: +.1

* Wartości nie zawierają wiodących zer: +.1

  1. Traktuj wszystkie kolumny o wartości większej niż 1 jako liczbowe. Dostosuj współczynniki i wagi w oparciu o testowanie różnych zestawów danych do swoich potrzeb. Aby to zrobić, możesz nawet zbudować i wyszkolić osobny algorytm uczenia maszynowego.

(2) Jeśli masz na przykład liczbę dzieci w rodzinie (która może wynosić na przykład od 0 do 5), czy jest to zmienna kategoryczna lub liczbowa? W rzeczywistości zależy to od twojego problemu i tego, jak zamierzasz go rozwiązać. W tym sensie możesz wykonać następujące czynności:

* Oblicz liczbę unikalnych wartości w tej kolumnie

* Podziel tę liczbę przez całkowitą liczbę wierszy

* Jeśli stosunek ten jest poniżej pewnego progu (na przykład 20%), uznajesz go za kategoryczny.

W przypadku wartości dyskretnych jednym dodatkowym testem może być: użycie modelu regresji do oszacowania niektórych parametrów i sprawdzenie, czy oszacowane wartości są zawarte w oryginalnym zestawie wartości. Jeśli nie

[003][Hierarchiczny format danych]

PYTANIE : Jakie są zalety w porównaniu do alternatywnych formatów? Jakie są główne korzyści z przechowywania danych w HDF? A jakie są główne zadania związane z nauką danych, w których HDF jest naprawdę odpowiedni i przydatny?

ODPOWIEDŹ : Być może dobrym sposobem na sparafrazowanie pytania jest, jakie są zalety w porównaniu do alternatywnych formatów? Myślę, że głównymi alternatywami są baza danych, pliki tekstowe lub inny format spakowany / binarny. Opcje bazy danych, które należy wziąć pod uwagę, to prawdopodobnie magazyn kolumnowy lub NoSQL lub małe samodzielne zestawy danych SQLite. Główną zaletą bazy danych jest możliwość pracy z danymi znacznie większymi niż pamięć, dostęp losowy lub indeksowany oraz szybkie dodawanie / dołączanie / modyfikowanie danych. Główną zaletą * dis * jest to, że jest znacznie wolniejszy niż HDF, w przypadku problemów, w których cały zestaw danych musi zostać wczytany i przetworzony. Kolejną wadą jest to, że z wyjątkiem baz danych w stylu osadzonym, takich jak SQLite, baza danych jest systemem (wymagającym podziwu, konfiguracji, konserwacji itp.), A nie prostym, niezależnym magazynem danych. Opcje formatu pliku tekstowego to XML / JSON / CSV. Są to narzędzia typu crosssplatform / language / toolkit i są dobrym formatem archiwalnym ze względu na możliwość samodzielnego opisywania. Jeśli nieskompresowane, są ogromne (10x-100x HDF), ale jeśli są skompresowane, mogą być dość wydajne pod względem przestrzeni (skompresowany XML jest mniej więcej taki sam jak HDF). Główną wadą jest tutaj szybkość: parsowanie tekstu jest znacznie, dużo wolniejsze niż HDF. Inne formaty binarne (pliki numy npy / npz, pliki blz blaze, bufory protokołów, Avro,…) mają bardzo podobne właściwości do HDF, z tym że są mniej obsługiwane (mogą być ograniczone tylko do jednej platformy: numpy) i mogą mieć określone inne ograniczenia. Zazwyczaj nie oferują one istotnych korzyści. HDF stanowi dobre uzupełnienie baz danych, może być sensowne uruchomienie zapytania w celu wygenerowania zbioru danych o wielkości mniej więcej pamięci, a następnie buforowanie go w HDF, jeśli te same dane zostaną użyte więcej niż jeden raz. Jeśli masz zestaw danych, który jest stały i zwykle przetwarzany jako całość, przechowywanie go jako zbioru plików HDF o odpowiednim rozmiarze nie jest złą opcją. Jeśli masz często aktualizowany zestaw danych, okresowe umieszczanie niektórych z nich jako plików HDF może być nadal pomocne. Podsumowując, HDF jest dobrym formatem dla danych, które są odczytywane (lub zapisywane) zazwyczaj jako całość; dla wielu jest to lingua franca lub wspólny / preferowany format wymiany aplikacji ze względu na szerokie wsparcie i kompatybilność, przyzwoity jako format archiwalny i bardzo szybki.

P.S. Aby nadać temu praktyczny kontekst, ostatnie doświadczenie w porównywaniu HDF z alternatywami, pewien mały (znacznie mniejszy niż pamięć) zestaw danych potrzebował 2 sekund na odczytanie jako HDF (a większość z nich to prawdopodobnie narzut z Pandas); ~ 1 minuta do odczytania z JSON; i 1 godzina na zapis do bazy danych. Z pewnością można przyspieszyć zapis w bazie danych, ale lepiej mieć dobry DBA.

Jedną z korzyści jest szerokie wsparcie – wszystkie C, Java, Perl, Python i R mają powiązania HDF5. Kolejną zaletą jest szybkość. Nigdy nie widziałem, żeby był testowany, ale HDF ma być szybszy niż bazy danych SQL. Rozumiem, że jest bardzo dobry, gdy jest używany zarówno z dużymi zestawami danych naukowych, jak i szeregami czasowymi – monitorowanie sieci, śledzenie użytkowania itp. Nie sądzę, aby istniało ograniczenie rozmiaru plików HDF (chociaż nadal obowiązywałyby ograniczenia systemu operacyjnego.

[002][xgboost]

PYTANIE: Czy istnieje sposób na nadanie większego znaczenia punktom, które są nowsze podczas analizy danych za pomocą xgboost?

ODPOWIEDŹ : Możesz spróbować zbudować wiele modeli xgboost, przy czym niektóre z nich ograniczają się do nowszych danych, a następnie zważyć wyniki razem. Innym pomysłem byłoby stworzenie zindywidualizowanej miary oceny, która będzie silniej karać ostatnie punkty, co dałoby im większe znaczenie.