Was kann im Bereich Data Science schiefgehen? Datensammlung.

Was kann im Bereich Data Science schiefgehen? Datensammlung.
Heute gibt es 100500 Data Science-Kurse, und es ist schon lange bekannt, dass man mit Data Science-Kursen am meisten Geld verdienen kann (warum graben, wenn man Schaufeln verkaufen kann?). Der Hauptnachteil dieser Kurse ist, dass sie nichts mit der tatsĂ€chlichen Arbeit zu tun haben: Niemand wird Ihnen saubere, bearbeitete Daten im benötigten Format zur VerfĂŒgung stellen. Und wenn Sie von den Kursen kommen und beginnen, ein echtes Problem zu lösen, tauchen viele Nuancen auf.

Deshalb beginnen wir eine Reihe von Notizen mit dem Titel „Was kann im Data Science schiefgehen“, die auf realen Ereignissen basieren, die mir, meinen Kollegen und Freunden passiert sind. Wir werden typische Data Science-Aufgaben an realen Beispielen untersuchen: wie das tatsĂ€chlich ablĂ€uft. Heute beginnen wir mit der Aufgabe der Datensammlung.

Und das Erste, worĂŒber Menschen stolpern, wenn sie beginnen, mit echten Daten zu arbeiten, ist die Sammlung genau der relevanten Daten. Die zentrale Botschaft dieses Artikels:

Wir unterschĂ€tzen systematisch die Zeit, Ressourcen und den Aufwand fĂŒr die Sammlung, Reinigung und Vorbereitung von Daten.

Und vor allem werden wir besprechen, was zu tun ist, um dies zu vermeiden.

Nach verschiedenen SchĂ€tzungen nehmen Reinigung, Transformation, Datenverarbeitung, Feature Engineering usw. 80-90 % der Zeit in Anspruch, wĂ€hrend die Analyse nur 10-20 % benötigt, wobei praktisch das gesamte Lehrmaterial sich ausschließlich auf die Analyse konzentriert.

Lassen Sie uns anhand eines einfachen analytischen Beispiels in drei Varianten untersuchen, welche „erschwerenden UmstĂ€nde“ es geben kann.

Und als Beispiel wiederum betrachten wir Ă€hnliche Variationen der Aufgabe zur Datensammlung und des Vergleichs von Gemeinschaften fĂŒr:

  1. Zwei Subreddits von Reddit
  2. Zwei Abteilungen von Habr
  3. Zwei Gruppen von Odnoklassniki

Ein bedingter Ansatz in der Theorie

Die Website zu öffnen und die Beispiele durchzulesen, wenn es klar ist, einige Stunden fĂŒr das Lesen einzuplanen, einige Stunden fĂŒr den Code nach den Beispielen und die Fehlersuche. FĂŒgen Sie einige Stunden fĂŒr die Sammlung hinzu. Legen Sie einige Stunden als Puffer drauf (mal zwei multiplizieren und N Stunden hinzuzufĂŒgen).

Der SchlĂŒsselpunkt: Die ZeitabschĂ€tzung basiert auf Annahmen und Vermutungen darĂŒber, wie lange es dauern wird.

Die Analyse der Zeit muss mit der Bewertung der folgenden Parameter fĂŒr die oben beschriebene bedingte Aufgabe beginnen:

  • Wie groß sind die Daten und wie viel muss physisch gesammelt werden (*siehe unten*).
  • Wie viel Zeit benötigt die Sammlung eines Datensatzes und wie lange muss man warten, bevor man den zweiten sammeln kann.
  • Das Schreiben von Code einplanen, der den Zustand speichert und einen Neustart beginnt, wenn (und nicht wenn) alles abstĂŒrzt.
  • ÜberprĂŒfen, ob wir eine Authentifizierung benötigen, und die Zeit fĂŒr den Zugriff ĂŒber die API einplanen.
  • Die Anzahl der Fehler als Funktion der KomplexitĂ€t der Daten einplanen — anhand der konkreten Aufgabe bewerten: Struktur, wie viele Transformationen, was und wie wir extrahieren.
  • Netzwerkfehler und Probleme mit dem nicht standardmĂ€ĂŸigen Verhalten des Projekts einplanen.
  • Bewerten, ob die benötigten Funktionen in der Dokumentation vorhanden sind, und falls nicht, wie viele Resourcen fĂŒr einen Workaround benötigt werden.

Das Wichtigste fĂŒr die Zeitbewertung ist, dass Sie tatsĂ€chlich Zeit und MĂŒhe fĂŒr eine "Erkundung" aufwenden mĂŒssen — nur dann wird Ihre Planung angemessen sein. Also, egal wie sehr man Sie drĂ€ngt, zu sagen: "Wie viel Zeit brauchen wir, um Daten zu sammeln" — nehmen Sie sich die Zeit fĂŒr eine vorlĂ€ufige Analyse und argumentieren Sie, dass die Zeit je nach den realen Parametern der Aufgabe stark variieren wird.

Und jetzt zeigen wir konkrete Beispiele, bei denen solche Parameter tatsÀchlich variieren werden.

Der SchlĂŒsselpunkt: Die SchĂ€tzung basiert auf der Analyse der wichtigsten Faktoren, die das Volumen und die KomplexitĂ€t der Arbeit beeinflussen.

Eine schÀtzungsbasierte AnnÀherung ist ein guter Ansatz, wenn die funktionalen Elemente relativ klein sind und es nicht allzu viele Faktoren gibt, die die Struktur der Aufgabe erheblich beeinflussen können. Aber in vielen Data-Science-Aufgaben werden solche Faktoren extrem zahlreich, und dieser Ansatz wird unangemessen.

Vergleich von Reddit-Communities

Beginnen wir mit dem einfachsten Fall (wie sich spĂ€ter herausstellen wird). Ganz ehrlich, wir haben es hier mit einem nahezu idealen Fall zu tun, lassen Sie uns unsere KomplexitĂ€ts-Checkliste ĂŒberprĂŒfen:

  • Es gibt eine klare, verstĂ€ndliche und dokumentierte API.
  • Es ist extrem einfach, und vor allem wird das Token automatisch generiert.
  • Ja python wrapper — mit vielen Beispielen.
  • Eine Community, die Datenanalyse und -sammlung auf Reddit betreibt (bis hin zu YouTube-Videos, die erklĂ€ren, wie man den python wrapper verwendet), hier zum Beispiel.
  • Die benötigten Methoden existieren wahrscheinlich in der API. DarĂŒber hinaus sieht der Code kompakt und sauber aus; hier ist ein Beispiel fĂŒr eine Funktion, die Kommentare zu einem Beitrag sammelt.

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()

Entnommen aus dieser Sammlungen nĂŒtzlicher Tools zur Verpackung.

Auch wenn wir hier den besten Fall haben, sollten wir dennoch eine Reihe wichtiger Faktoren aus der RealitĂ€t berĂŒcksichtigen:

  • API-Limits – wir sind gezwungen, Daten in Batches abzurufen (wir mĂŒssen zwischen den Anfragen warten usw.).
  • Zeitaufwand fĂŒr die Erfassung – fĂŒr eine vollstĂ€ndige Analyse und den Vergleich mĂŒssen wir erheblich Zeit einplanen, damit der Spider durch das Subreddit lĂ€uft.
  • Der Bot muss auf einem Server laufen – Sie können ihn nicht einfach auf Ihrem Laptop starten, in Ihren Rucksack packen und mitnehmen. Daher habe ich alles auf einem VPS gestartet. Mit dem Promo-Code habrahabr10 kann man weitere 10% sparen.
  • Physische UnzugĂ€nglichkeit bestimmter Daten (die fĂŒr Administratoren sichtbar sind oder zu kompliziert gesammelt werden) – das muss berĂŒcksichtigt werden, nicht alle Daten können innerhalb eines angemessenen Zeitrahmens gesammelt werden.
  • Netzwerkfehler: Die Arbeit mit dem Netzwerk ist schmerzhaft.
  • Das sind echte, lebendige Daten – sie sind nie sauber.

NatĂŒrlich mĂŒssen die genannten Nuancen in die Entwicklung eingeplant werden. Die konkreten Stunden/Tage hĂ€ngen von der Erfahrung in der Entwicklung oder der Arbeit an Ă€hnlichen Aufgaben ab, dennoch sehen wir, dass es sich hier um eine rein ingenieurtechnische Aufgabe handelt, die keine zusĂ€tzlichen Bewegungen zur Lösung erfordert – man kann alles sehr gut einschĂ€tzen, planen und umsetzen.

Vergleich der Hub-Sektionen

Kommen wir zu einem interessanteren und nicht-triviale Fall, dem Vergleich von Streams und/oder Sektionen des Hubs.

ÜberprĂŒfen wir unsere Checkliste zur KomplexitĂ€t – hier muss man, um jeden Punkt zu verstehen, schon ein wenig mit der Aufgabe interagieren und experimentieren.

  • Zuerst denkt man, dass es eine API gibt, aber es gibt sie nicht. Ja, ja, Habr hat eine API, aber sie ist nur fĂŒr Benutzer nicht zugĂ€nglich (oder funktioniert vielleicht ĂŒberhaupt nicht).
  • Danach fĂ€ngt man einfach an, HTML zu parsen – „import requests“, was könnte schon schiefgehen?
  • Und wie parst man ĂŒberhaupt? Der einfachste und hĂ€ufig verwendete Ansatz ist, ĂŒber die ID zu iterieren, wobei zu beachten ist, dass es nicht der effizienteste Weg ist und verschiedene FĂ€lle behandelt werden mĂŒssen – hier zum Beispiel die Dichte der echten IDs unter allen existierenden.

    Was kann im Bereich Data Science schiefgehen? Datensammlung.
    Entnommen aus dieser Artikel.

  • Rohdaten, die in HTML ĂŒber das Netzwerk gewickelt sind, sind lĂ€stig. Zum Beispiel möchten Sie die Bewertung eines Artikels sammeln und speichern: Sie extrahieren den Score aus dem HTML und entscheiden sich, ihn als Zahl fĂŒr die weitere Verarbeitung zu speichern. 

    1) int(score) wirft einen Fehler: da auf Habr ein Minuszeichen, wie zum Beispiel in "–5", ein kurzes Gedankenstrich ist und kein Minuszeichen (ĂŒberraschend, oder?), musste der Parser irgendwann mit einem so schrecklichen Fix wiederbelebt werden.

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

    Es kann sein, dass es keine Daten, Plus- oder Minuszeichen gibt (wie wir oben in der Funktion check_date sehen können, kam das vor).

    2) Unescaped Sonderzeichen — sie werden kommen, man muss vorbereitet sein.

    3) Die Struktur Àndert sich je nach Art des Beitrags.

    4) Ältere BeitrĂ€ge können eine **seltsame Struktur** haben.

  • Im Grunde genommen mĂŒssen Fehlerbehandlungen und das, was passieren kann oder nicht, behandelt werden. Man kann nicht sicher vorhersagen, was schiefgehen wird und wie die Struktur anders sein könnte und wo etwas ausfĂ€llt — man muss es einfach ausprobieren und die Fehler berĂŒcksichtigen, die der Parser auswirft.
  • Dann verstehen Sie, dass Sie in mehreren Threads parsen mĂŒssen, sonst dauert das Parsen in einem einzigen Thread ĂŒber 30 Stunden (das ist die reine AusfĂŒhrungszeit eines bereits funktionierenden einheitlichen Parsers, der schlĂ€ft und nicht unter irgendwelche Sperren fĂ€llt). In dieser dem Artikel fĂŒhrte dies irgendwann zu einem solchen Schema:

Was kann im Bereich Data Science schiefgehen? Datensammlung.

Zusammengefasst die Checkliste nach Schwierigkeit:

  • Arbeiten mit dem Netzwerk und Parsen von HTML mit Iteration und Durchlauf nach ID.
  • Dokumente mit unterschiedlicher Struktur.
  • Es gibt viele Stellen, an denen der Code leicht fehlschlagen kann.
  • Es ist notwendig, || Code zu schreiben.
  • Die benötigte Dokumentation, Codebeispiele und/oder eine Community fehlen.

Die SchĂ€tzung der Zeit fĂŒr diese Aufgabe wird 3-5 mal höher sein als fĂŒr das Sammeln von Daten von Reddit.

Vergleich von Gruppen in Odnoklassniki.

Kommen wir zum technisch interessantesten Fall aus den beschriebenen. FĂŒr mich war er genau deshalb interessant, weil er auf den ersten Blick ziemlich trivial aussieht, aber das ganz und gar nicht ist — sobald man mit einem Stock darauf zeigt.

Es beginnt mit unserer Schwierigkeit-Checkliste und wir werden feststellen, dass viele von ihnen viel komplizierter sind, als sie zunÀchst erscheinen:

  • Das API existiert, aber es fehlen fast vollstĂ€ndig die benötigten Funktionen.
  • FĂŒr bestimmte Funktionen muss man per E-Mail um Zugang bitten, also ist die GewĂ€hrung des Zugangs nicht sofort.
  • Die Dokumentation ist schrecklich (beginnend damit, dass ĂŒberall russische und englische Begriffe inkonsistent vermischt werden — manchmal muss man einfach raten, was von einem erwartet wird) und mehr noch, sie ist designtechnisch ungeeignet, um Daten zu sammeln, zum Beispiel die gewĂŒnschte Funktion.
  • Erfordert eine Session in der Dokumentation, benutzt sie jedoch in der Praxis nicht — es gibt keine Möglichkeit, alle Feinheiten der API-Modi zu verstehen, außer durch Herumprobieren und Hoffen, dass irgendetwas funktioniert.
  • Es fehlen Beispiele und eine Community, der einzige Anhaltspunkt zur Informationssammlung ist ein kleiner Wrapper in Python (ohne viele Anwendungsbeispiele).
  • Die sinnvollste Option scheint Selenium zu sein, da viele benötigte Daten gesperrt sind.
    1) Das heißt, es erfolgt eine Authentifizierung ĂŒber einen fiktiven Benutzer (und manuelle Registrierung).

    2) Allerdings gibt es mit Selenium keine Garantien fĂŒr korrekte und wiederholbare FunktionalitĂ€t (zumindest im Fall von ok.ru genau).

    3) Die Seite ok.ru enthÀlt JavaScript-Fehler und verhÀlt sich manchmal seltsam und inkonsistent.

    4) Man muss sich mit Pagination, dem Nachladen von Elementen usw. beschÀftigen


    5) API-Fehler, die der Wrapper zurĂŒckgibt, mĂŒssen umstĂ€ndlich bearbeitet werden, zum Beispiel so (ein StĂŒck experimentellen Codes):

    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
    

    Mein Lieblingsfehler war:

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

    6) Letztendlich scheint die Kombination aus Selenium + API die rationalste Lösung zu sein.

  • Es ist notwendig, den Zustand zu erhalten und das System neu zu starten, viele Fehler zu verarbeiten, einschließlich inkonsistentem Verhalten der Website — dabei handelt es sich um Fehler, die sich nur schwer vorstellen lassen (es sei denn, man programmiert professionell Parser).

Die geschĂ€tzte Zeit fĂŒr diese Aufgabe wird 3-5 mal höher sein als fĂŒr das Sammeln von Daten von Habr. Obwohl wir beim Habr einen direkten Ansatz mit HTML-Parsen anwenden, können wir bei ok.ru an kritischen Stellen mit der API arbeiten.

Das DBMS Tarantool ist ein attraktives, zukunftstrÀchtiges Produkt zur Erstellung von hochbelasteten Anwendungen.

Egal, wie sehr Sie von Ihnen eine EinschĂ€tzung der Fristen „vor Ort“ verlangen (wir haben schließlich heute Planung!), ist es praktisch nie möglich, die AusfĂŒhrungszeit auch nur ansatzweise ohne Analyse der Aufgabendetails qualitativ zu bewerten.

Wenn wir etwas philosophischer sprechen, dann passen Bewertungsstrategien im Agile-Bereich gut zu ingenieurtechnischen Aufgaben, aber bei experimentelleren und in gewissem Sinne „kreativen“ und forschenden Aufgaben, also solchen, die weniger vorhersehbar sind, treten Schwierigkeiten auf, wie in den Beispielen, die wir hier behandelt haben.

NatĂŒrlich ist das Sammeln von Daten ein anschauliches Beispiel – normalerweise scheint diese Aufgabe unglaublich einfach und technisch unkompliziert zu sein, und genau in den Details versteckt sich hier oft der Teufel. An dieser Aufgabe lĂ€sst sich das gesamte Spektrum möglicher Varianten aufzeigen, was schiefgehen könnte und wie sehr die Arbeit sich verzögern kann.

Wenn man die Anforderungen an die Aufgabe oberflĂ€chlich betrachtet, ohne zusĂ€tzliche Experimente, scheinen Reddit und OK Ă€hnlich zu sein: Es gibt eine API, einen Python-Wrapper, aber im Grunde genommen ist der Unterschied riesig. Nach diesen Kriterien sieht das Parsen von Habr komplizierter aus als OK – in der Praxis ist es jedoch genau umgekehrt, und genau das kann durch einfache Experimente zur Analyse der Aufgabenparameter herausgefunden werden.

Nach meiner Erfahrung ist der effektivste Ansatz eine grobe SchĂ€tzung der Zeit, die Sie fĂŒr die eigentliche Voranalyse, einfache erste Experimente und das Lesen der Dokumentation benötigen – diese ermöglichen es Ihnen, eine genaue SchĂ€tzung fĂŒr die gesamte Arbeit abzugeben. In den Begriffen der beliebten Agile-Methodologie bitte ich darum, ein Ticket fĂŒr „Bewertung der Aufgabenparameter“ zu erstellen, auf dessen Grundlage ich eine SchĂ€tzung abgeben kann, was im Rahmen des „Sprints“ machbar ist, sowie eine genauere SchĂ€tzung fĂŒr jede Aufgabe.

Daher scheint der effektivste Ansatz ein Argument zu sein, das einem „nicht-technischen“ Spezialisten zeigt, wie stark die Zeit und die Ressourcen je nach den Parametern variieren werden, die noch bewertet werden mĂŒssen.

Was kann im Bereich Data Science schiefgehen? Datensammlung.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster