Čo sa môže pokaziť na Data Science? Zber dát

Čo sa môže pokaziť na Data Science? Zber dát
Dnes existuje 100500 XNUMX kurzov Data Science a už dlho je známe, že najviac peňazí v Data Science sa dá zarobiť prostredníctvom kurzov Data Science (načo kopať, keď môžete predávať lopaty?). Hlavnou nevýhodou týchto kurzov je, že nemajú nič spoločné s reálnou prácou: nikto vám nedá čisté, spracované dáta v požadovanom formáte. A keď opustíte kurz a začnete riešiť skutočný problém, objaví sa veľa nuancií.

Preto začíname sériu poznámok „Čo sa môže pokaziť s Data Science“, založených na skutočných udalostiach, ktoré sa stali mne, mojim súdruhom a kolegom. Budeme analyzovať typické úlohy Data Science na skutočných príkladoch: ako sa to v skutočnosti deje. Začnime dnes úlohou zberu údajov.

A prvá vec, o ktorú ľudia zakopnú, keď začnú pracovať so skutočnými údajmi, je vlastne zhromažďovanie týchto údajov, ktoré sú pre nás najrelevantnejšie. Hlavné posolstvo tohto článku:

Systematicky podceňujeme čas, zdroje a úsilie potrebné na zber, čistenie a prípravu údajov.

A čo je najdôležitejšie, povieme si, čo robiť, aby sme tomu zabránili.

Podľa rôznych odhadov zaberá čistenie, transformácia, spracovanie údajov, inžinierstvo funkcií atď. 80 – 90 % času a analýza 10 – 20 %, pričom takmer všetky vzdelávacie materiály sa zameriavajú výlučne na analýzu.

Pozrime sa na jednoduchý analytický problém v troch verziách ako typický príklad a pozrime sa, čo sú to „priťažujúce okolnosti“.

A ako príklad opäť zvážime podobné variácie úlohy zhromažďovania údajov a porovnávania komunít pre:

  1. Dva podreddity Reddit
  2. Dva úseky Habr
  3. Dve skupiny Odnoklassniki

Podmienený prístup v teórii

Otvorte stránku a prečítajte si príklady, ak sú jasné, vyhraďte si niekoľko hodín na čítanie, niekoľko hodín na kód pomocou príkladov a ladenie. Pridajte niekoľko hodín na zber. Vhoďte niekoľko hodín do rezervy (vynásobte dvomi a pridajte N hodín).

Kľúčový bod: Časové odhady sú založené na predpokladoch a dohadoch o tom, ako dlho to bude trvať.

Časovú analýzu je potrebné začať odhadom nasledujúcich parametrov pre podmienený problém opísaný vyššie:

  • Какой размер данных и сколько его нужно физически собирать (*см ниже*).
  • Aký je čas zberu jedného záznamu a ako dlho musíte čakať, kým sa vám podarí vyzbierať druhý?
  • Zvážte napísanie kódu, ktorý uloží stav a spustí reštart, keď (nie ak) všetko zlyhá.
  • Zistite, či potrebujeme autorizáciu a nastavte čas na získanie prístupu cez API.
  • Nastavte počet chýb ako funkciu zložitosti údajov – vyhodnoťte pre konkrétnu úlohu: štruktúru, koľko transformácií, čo a ako extrahovať.
  • Opravte sieťové chyby a problémy s neštandardným správaním projektu.
  • Posúďte, či sú požadované funkcie v dokumentácii a ak nie, ako a koľko je potrebné na riešenie.

Najdôležitejšie je, že na odhadnutie času – vlastne musíte venovať čas a námahu „prehliadke v sile“ – len vtedy bude vaše plánovanie adekvátne. Preto bez ohľadu na to, ako veľmi ste nútení povedať „ako dlho trvá zber údajov“ – kúpte si nejaký čas na predbežnú analýzu a argumentujte, o koľko sa bude čas líšiť v závislosti od skutočných parametrov problému.

A teraz si ukážeme konkrétne príklady, kde sa takéto parametre zmenia.

Kľúčový bod: Odhad je založený na analýze kľúčových faktorov ovplyvňujúcich rozsah a zložitosť práce.

Odhad založený na odhade je dobrý prístup, keď sú funkčné prvky dostatočne malé a nie je veľa faktorov, ktoré môžu výrazne ovplyvniť návrh problému. Ale v prípade množstva problémov Data Science je takýchto faktorov extrémne veľa a takýto prístup sa stáva neadekvátnym.

Porovnanie Reddit komunít

Začnime s najjednoduchším prípadom (ako sa neskôr ukáže). Vo všeobecnosti, aby som bol úplne úprimný, máme takmer ideálny prípad, pozrime sa na náš kontrolný zoznam zložitosti:

  • Existuje prehľadné, jasné a zdokumentované API.
  • Je to veľmi jednoduché a čo je najdôležitejšie, token sa získava automaticky.
  • K dispozícii je pytónový obal - s množstvom príkladov.
  • Komunita, ktorá analyzuje a zhromažďuje údaje na reddite (dokonca aj videá na YouTube vysvetľujúce, ako používať python wrapper) napríklad.
  • Metódy, ktoré potrebujeme, s najväčšou pravdepodobnosťou existujú v API. Kód navyše vyzerá kompaktne a čisto, nižšie je príklad funkcie, ktorá zhromažďuje komentáre k príspevku.

def get_comments(submission_id):
    reddit = Reddit(check_for_updates=False, user_agent=AGENT)
    submission = reddit.submission(id=submission_id)
    more_comments = submission.comments.replace_more()
    if more_comments:
        skipped_comments = sum(x.count for x in more_comments)
        logger.debug('Skipped %d MoreComments (%d comments)',
                     len(more_comments), skipped_comments)
    return submission.comments.list()

Prevzaté z toto výber pohodlných nástrojov na balenie.

Napriek tomu, že ide o ten najlepší prípad, stále stojí za to vziať do úvahy niekoľko dôležitých faktorov z reálneho života:

  • Limity API – sme nútení brať dáta v dávkach (spánok medzi požiadavkami a pod.).
  • Čas zberu – pre kompletnú analýzu a porovnanie si budete musieť vyhradiť značný čas len na to, aby pavúk prešiel cez subreddit.
  • Robot musí bežať na serveri – nemôžete ho spustiť len na svojom notebooku, vložiť do batohu a venovať sa svojej práci. Všetko som teda spustil na VPS. Použitím propagačného kódu habrahabr10 môžete ušetriť ďalších 10% nákladov.
  • Fyzická nedostupnosť niektorých údajov (správcovia ich vidia alebo ich zbieranie je príliš náročné) – s tým treba počítať, v zásade nie všetky údaje je možné zhromaždiť v primeranom čase.
  • Chyby siete: Vytváranie sietí je problém.
  • Toto sú živé skutočné údaje – nikdy nie sú čisté.

Samozrejme, je potrebné zahrnúť tieto nuansy do vývoja. Konkrétne hodiny/dni závisia od skúseností s vývojom alebo skúseností s prácou na podobných úlohách, vidíme však, že tu je úloha čisto inžinierska a nevyžaduje si ďalšie pohyby tela na vyriešenie – všetko sa dá veľmi dobre posúdiť, naplánovať a urobiť.

Porovnanie sekcií Habr

Prejdime k zaujímavejšiemu a netriviálnemu prípadu porovnávania vlákien a/alebo sekcií Habr.

Pozrime sa na náš kontrolný zoznam zložitosti – tu, aby ste pochopili každý bod, budete musieť trochu preniknúť do samotnej úlohy a experimentovať.

  • Najprv si myslíte, že existuje API, ale nie je. Áno, áno, Habr má API, ale nie je prístupné používateľom (alebo možno vôbec nefunguje).
  • Potom už len začnete analyzovať html - „požiadavky na import“, čo by sa mohlo pokaziť?
  • Ako vôbec analyzovať? Najjednoduchším a najčastejšie používaným prístupom je iterácia cez ID, všimnite si, že to nie je najefektívnejšie a bude musieť zvládnuť rôzne prípady – tu je príklad hustoty skutočných ID medzi všetkými existujúcimi.

    Čo sa môže pokaziť na Data Science? Zber dát
    Prevzaté z toto článok.

  • Nespracované údaje zabalené do HTML na vrchu webu sú utrpením. Napríklad chcete zhromaždiť a uložiť hodnotenie článku: vytrhli ste skóre z html a rozhodli ste sa ho uložiť ako číslo na ďalšie spracovanie: 

    1) int(skóre) vyhodí chybu: keďže na Habré je mínus, ako napríklad v riadku „–5“ - toto je pomlčka, nie znamienko mínus (nečakane, však?), tak pri v určitom okamihu som musel oživiť analyzátor takouto hroznou opravou.

    try:
          score_txt = post.find(class_="score").text.replace(u"–","-").replace(u"+","+")
          score = int(score_txt)
          if check_date(date):
            post_score += score
    

    Nemusí tam byť vôbec žiadny dátum, plusy a mínusy (ako vidíme vyššie vo funkcii check_date, stalo sa to).

    2) Neuniknuté špeciálne postavy – prídu, treba byť pripravený.

    3) Štruktúra sa mení v závislosti od typu príspevku.

    4) Staré príspevky môžu mať **divnú štruktúru**.

  • V podstate sa bude musieť zvládnuť odstraňovanie chýb a to, čo sa môže alebo nemusí stať, a nemôžete s istotou predpovedať, čo sa pokazí a ako inak môže byť štruktúra a čo kde odpadne - budete musieť len vyskúšať a vziať do úvahy chyby, ktoré vyhodí syntaktický analyzátor.
  • Potom si uvedomíte, že potrebujete analyzovať vo viacerých vláknach, inak bude analýza v jednom trvať 30+ hodín (to je čisto čas vykonávania už fungujúceho jednovláknového analyzátora, ktorý spí a nespadá pod žiadne zákazy). IN toto článku to v určitom bode viedlo k podobnej schéme:

Čo sa môže pokaziť na Data Science? Zber dát

Celkový kontrolný zoznam podľa zložitosti:

  • Práca so sieťou a html parsovanie s iteráciou a vyhľadávaním podľa ID.
  • Dokumenty heterogénnej štruktúry.
  • Existuje veľa miest, kde môže kód ľahko spadnúť.
  • Je potrebné napísať || kód.
  • Chýba potrebná dokumentácia, príklady kódu a/alebo komunita.

Odhadovaný čas na túto úlohu bude 3-5 krát dlhší ako pri zbere údajov z Redditu.

Porovnanie skupín Odnoklassniki

Prejdime k technicky najzaujímavejšiemu opísanému prípadu. Pre mňa to bolo zaujímavé práve preto, že na prvý pohľad to vyzerá celkom triviálne, no vôbec to tak nevyzerá – akonáhle do toho strčíte palicu.

Začnime s naším kontrolným zoznamom obtiažnosti a všimnite si, že mnohé z nich budú oveľa zložitejšie, ako sa na prvý pohľad zdá:

  • Existuje API, ale takmer úplne mu chýbajú potrebné funkcie.
  • K niektorým funkciám je potrebné požiadať o prístup poštou, to znamená, že udelenie prístupu nie je okamžité.
  • Je to strasne zdokumentovane (na zaciatok sa vsade plietli ruske a anglicke pojmy a uplne nejednotne - niekedy treba len hadat, co od teba niekde chcu) a navyse dizajn nie je vhodny na ziskanie dat napr. , funkciu, ktorú potrebujeme.
  • Vyžaduje reláciu v dokumentácii, ale v skutočnosti ju nepoužíva - a neexistuje spôsob, ako pochopiť všetky zložitosti režimov API, ako len hrabať sa a dúfať, že niečo bude fungovať.
  • Neexistujú žiadne príklady a žiadna komunita, jediný bod podpory pri zbere informácií je malý obálka v Pythone (bez mnohých príkladov použitia).
  • Selén sa javí ako najfunkčnejšia možnosť, keďže mnohé potrebné údaje sú zablokované.
    1) To znamená, že autorizácia prebieha prostredníctvom fiktívneho používateľa (a registrácia ručne).

    2) So Selenium však neexistujú žiadne záruky na správnu a opakovateľnú prácu (aspoň v prípade ok.ru určite).

    3) Webová stránka Ok.ru obsahuje chyby JavaScriptu a niekedy sa správa zvláštne a nekonzistentne.

    4) Musíte urobiť stránkovanie, načítanie prvkov atď.

    5) Chyby API, ktoré dáva obal, sa budú musieť riešiť nešikovne, napríklad takto (kúsok experimentálneho kódu):

    def get_comments(args, context, discussions):
        pause = 1
        if args.extract_comments:
            all_comments = set()
    #makes sense to keep track of already processed discussions
            for discussion in tqdm(discussions): 
                try:
                    comments = get_comments_from_discussion_via_api(context, discussion)
                except odnoklassniki.api.OdnoklassnikiError as e:
                    if "NOT_FOUND" in str(e):
                        comments = set()
                    else:
                        print(e)
                        bp()
                        pass
                all_comments |= comments
                time.sleep(pause)
            return all_comments
    

    Moja obľúbená chyba bola:

    OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: …)”)

    6) Nakoniec, Selenium + API vyzerá ako najracionálnejšia možnosť.

  • Je potrebné uložiť stav a reštartovať systém, zvládnuť množstvo chýb, vrátane nekonzistentného správania stránky – a tieto chyby je dosť ťažké si predstaviť (pokiaľ samozrejme nepíšete parsery profesionálne).

Podmienený časový odhad pre túto úlohu bude 3-5 krát vyšší ako pri zbere údajov od Habr. Napriek tomu, že v prípade Habr používame frontálny prístup s HTML parsovaním a v prípade OK vieme pracovať s API na kritických miestach.

Závery

Bez ohľadu na to, koľko musíte odhadnúť termíny „na mieste“ (dnes plánujeme!) objemného potrubného modulu na spracovanie dát, čas realizácie nie je takmer nikdy možné odhadnúť ani kvalitatívne bez analýzy parametrov úlohy.

Trochu filozofickejšie povedané, agilné odhadovacie stratégie fungujú dobre pre inžinierske úlohy, ale problémy, ktoré sú viac experimentálne a v istom zmysle „kreatívne“ a prieskumné, t. j. menej predvídateľné, majú ťažkosti, ako v príkladoch podobných tém. o ktorých sme tu diskutovali.

Samozrejme, zber údajov je len ukážkovým príkladom – zvyčajne ide o neuveriteľne jednoduchú a technicky nekomplikovanú úlohu a diabol sa často skrýva v detailoch. A práve na tejto úlohe môžeme ukázať celú škálu možných možností, čo sa môže pokaziť a ako presne môže práca trvať.

Ak sa pozriete na charakteristiky úlohy bez ďalších experimentov, Reddit a OK vyzerajú podobne: existuje API, python wrapper, ale v podstate je rozdiel obrovský. Súdiac podľa týchto parametrov, Habrove pary vyzerajú komplikovanejšie ako OK - ale v praxi je to úplne naopak a presne to sa dá zistiť jednoduchými experimentmi na analýzu parametrov problému.

Podľa mojich skúseností je najefektívnejší prístup približne odhadnúť čas, ktorý budete potrebovať na samotnú predbežnú analýzu a jednoduché prvé experimenty, čítanie dokumentácie – tie vám umožnia poskytnúť presný odhad celej práce. V rámci obľúbenej agilnej metodiky Vás žiadam o vytvorenie lístka na „odhad parametrov úlohy“, na základe ktorého viem posúdiť, čo sa dá v rámci „šprintu“ dosiahnuť a dať presnejší odhad pre každý úloha.

Najúčinnejším argumentom sa preto javí argument, ktorý by „netechnickému“ špecialistovi ukázal, koľko času a zdrojov sa bude líšiť v závislosti od parametrov, ktoré ešte treba posúdiť.

Čo sa môže pokaziť na Data Science? Zber dát

Zdroj: hab.com

Pridať komentár