Qu'est-ce qui peut mal tourner avec la science des données? Collecte de données



Aujourd'hui, il existe 100 500 cours en science des donnĂ©es et on sait depuis longtemps que le plus d'argent en science des donnĂ©es peut ĂȘtre gagnĂ© prĂ©cisĂ©ment par des cours en science des donnĂ©es (pourquoi creuser quand on peut vendre des pelles?). Le principal inconvĂ©nient de ces cours est qu'ils n'ont rien Ă  voir avec un vrai travail: personne ne vous donnera des donnĂ©es propres et traitĂ©es dans le format requis. Et lorsque vous quittez les cours et commencez Ă  rĂ©soudre le vrai problĂšme, de nombreuses nuances se dĂ©gagent.



Par conséquent, nous commençons une série de notes "Qu'est-ce qui peut mal tourner avec la science des données", basée sur des événements réels qui m'est arrivé, mes camarades et collÚgues. Nous analyserons les tùches typiques de la science des données à l'aide d'exemples réels: comment cela se passe réellement. Commençons aujourd'hui par la tùche de collecte de données.



Et la premiÚre chose sur laquelle les gens trébuchent lorsqu'ils commencent à travailler avec des données réelles est en fait de collecter les données les plus pertinentes pour nous. Le message clé de cet article:



Nous sous-estimons systématiquement le temps, les ressources et les efforts nécessaires pour collecter, nettoyer et préparer les données.


Et surtout, nous discuterons de ce qu'il faut faire pour Ă©viter cela.



Selon diverses estimations, le nettoyage, la transformation, le traitement des données, l'ingénierie des fonctionnalités, etc. prennent 80 à 90% du temps et l'analyse 10 à 20%, alors que presque tout le matériel pédagogique se concentre exclusivement sur l'analyse.



Prenons comme exemple typique un problÚme analytique simple en trois variantes et voyons ce que sont les «circonstances aggravantes».



Encore une fois, à titre d'exemple, nous considérerons des variantes similaires de la tùche de collecte de données et de comparaison des communautés pour:



  1. Deux subreddits Reddit
  2. Deux sections Habr
  3. Deux groupes d'Odnoklassniki


Approche conditionnelle en théorie



Ouvrez le site et lisez des exemples, si c'est clair, mettez quelques heures pour la lecture, quelques heures pour le code à l'aide d'exemples et de débogage. Ajoutez quelques heures à collecter. Jetez quelques heures en réserve (multipliez par deux et ajoutez N heures).



Point clé: L'estimation du temps est basée sur des hypothÚses et des estimations sur le temps que cela prendra.



Il est nécessaire de démarrer l'analyse du temps en évaluant les paramÚtres suivants pour le problÚme conditionnel décrit ci-dessus:



  • Quelle est la taille des donnĂ©es et combien elles doivent ĂȘtre physiquement collectĂ©es (* voir ci-dessous *).
  • Combien de temps faut-il pour collecter un enregistrement et combien de temps faut-il pour collecter le second.
  • Pour Ă©tablir l'Ă©criture de code qui sauvegarde l'Ă©tat et dĂ©marre un redĂ©marrage quand (et pas si) tout tombe en panne.
  • , API.
  • , — : , , .
  • .
  • , , a workaround.


Plus important encore, pour estimer le temps - vous devez en fait investir le temps et les efforts dans la «reconnaissance en force» - alors seulement votre planification sera adĂ©quate. Par consĂ©quent, peu importe comment vous ĂȘtes poussĂ© Ă  dire «combien de temps faut-il pour collecter des donnĂ©es», prenez du temps pour une analyse prĂ©liminaire et expliquez combien le temps variera en fonction des paramĂštres rĂ©els du problĂšme.



Et maintenant, nous allons montrer des exemples spĂ©cifiques oĂč ces paramĂštres changeront.



Point clé: L'évaluation est basée sur une analyse des facteurs clés qui influencent le volume et la complexité du travail.



L'estimation par estimation est une bonne approche lorsque les Ă©lĂ©ments fonctionnels sont suffisamment petits et qu'il n'y a pas beaucoup de facteurs qui peuvent affecter de maniĂšre significative la structure du problĂšme. Mais dans le cas d'un certain nombre de tĂąches de Data Science, ces facteurs deviennent extrĂȘmement nombreux et une telle approche devient inadĂ©quate.



Comparaison des communautés Reddit



Commençons par le cas le plus simple (comme il s'avĂšre plus tard). En gĂ©nĂ©ral, pour ĂȘtre tout Ă  fait honnĂȘte, c'est un cas presque idĂ©al, vĂ©rifions notre liste de contrĂŽle des difficultĂ©s:



  • Il existe une API soignĂ©e, simple et documentĂ©e.
  • Il est extrĂȘmement simple et important qu'un jeton soit automatiquement obtenu.
  • Il existe un wrapper python - avec un tas d'exemples.
  • Une communautĂ© qui analyse et collecte des donnĂ©es sur le reddit (jusqu'Ă  des vidĂ©os youtube expliquant comment utiliser le wrapper python) , par exemple .
  • Les mĂ©thodes dont nous avons le plus besoin existent probablement dans l'API. De plus, le code a l'air compact et propre, voici un exemple de fonction qui recueille des commentaires sur une publication.


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()
Tiré de cette collection d'utilitaires d'emballage pratiques.



Malgré le fait que nous ayons le meilleur cas ici, il vaut toujours la peine de considérer un certain nombre de facteurs importants de la vie réelle:



  • Limites de l'API - nous sommes obligĂ©s de prendre des donnĂ©es par lots (veille entre les demandes, etc.).
  • Temps de collecte - pour une analyse et une comparaison complĂštes, vous devrez consacrer beaucoup de temps Ă  l'araignĂ©e pour parcourir le sous-rĂ©pertoire.
  • Le bot doit fonctionner sur le serveur - vous ne pouvez pas simplement l'exĂ©cuter sur votre ordinateur portable, le mettre dans votre sac Ă  dos et partir en affaires. J'ai donc tout couru sur un VPS. Avec le code promotionnel habrahabr10, vous pouvez Ă©conomiser encore 10% du coĂ»t.
  • L'inaccessibilitĂ© physique de certaines donnĂ©es (elles sont visibles pour les administrateurs ou sont trop difficiles Ă  collecter) - cela doit ĂȘtre pris en compte, toutes les donnĂ©es, en principe, ne peuvent pas ĂȘtre collectĂ©es dans un dĂ©lai adĂ©quat.
  • Erreurs de rĂ©seau: la mise en rĂ©seau est une douleur.
  • Ce sont de vraies donnĂ©es vivantes - elles ne sont jamais propres.


Bien sĂ»r, il est nĂ©cessaire d'inclure les nuances spĂ©cifiĂ©es dans le dĂ©veloppement. Des heures / jours spĂ©cifiques dĂ©pendent de l'expĂ©rience de dĂ©veloppement ou de l'expĂ©rience de travail sur des tĂąches similaires, nĂ©anmoins, nous voyons qu'ici la tĂąche est exclusivement d'ingĂ©nierie et ne nĂ©cessite pas de gestes supplĂ©mentaires pour ĂȘtre rĂ©solue - tout peut ĂȘtre trĂšs bien Ă©valuĂ©, peint et rĂ©alisĂ©.



Comparaison des sections Habr



Passons à un cas plus intéressant et non trivial de comparaison de flux et / ou de sections Habr.



VĂ©rifions notre liste de contrĂŽle de la difficultĂ© - ici, pour comprendre chaque point, vous devez dĂ©jĂ  fouiller un peu dans le problĂšme lui-mĂȘme et expĂ©rimenter.



  • Au dĂ©but, vous pensez qu'il existe une API, mais ce n'est pas le cas. Oui, oui, Habr a une API, mais seulement elle n'est pas disponible pour les utilisateurs (ou peut-ĂȘtre que cela ne fonctionne pas du tout).
  • Ensuite, vous commencez simplement Ă  analyser le html - "demandes d'importation", qu'est-ce qui pourrait mal tourner?
  • Comment analyser en gĂ©nĂ©ral? L'approche la plus simple et la plus frĂ©quemment utilisĂ©e est d'itĂ©rer sur les ID, notez que ce n'est pas la plus efficace et devra gĂ©rer diffĂ©rents cas - par exemple, la densitĂ© des ID rĂ©els parmi tous les ID existants.





    Tiré de cet article.
  • , HTML — . , : score html : 



    1) int(score) : , , "–5" — , (, ?), - .



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


    , ( check_date ).



    2) — , .



    3) .



    4) ** **.
  • En fait, la gestion des erreurs et ce qui peut ou non se produire devront ĂȘtre traitĂ©s et vous ne pouvez pas prĂ©dire avec certitude ce qui va mal et comment la structure peut ĂȘtre et ce qui tombera oĂč - vous devrez juste essayer de prendre en compte les erreurs que l'analyseur gĂ©nĂšre.
  • Ensuite, vous comprenez que vous devez analyser en plusieurs threads, sinon l'analyse en un prendra alors plus de 30 heures (c'est purement le temps d'exĂ©cution d'un analyseur monothread dĂ©jĂ  opĂ©rationnel qui dort et ne tombe sous aucune interdiction). Dans cet article, cela a conduit Ă  un moment donnĂ© Ă  un modĂšle similaire:






Liste de contrÎle de la complexité totale:



  • Utilisation de l'analyse Web et HTML avec itĂ©ration et itĂ©ration par ID.
  • Documents de structure hĂ©tĂ©rogĂšne.
  • Il existe de nombreux endroits oĂč le code peut tomber facilement.
  • Il faut Ă©crire || le code.
  • Documentation, exemples de code et / ou communautĂ© manquants.


L'estimation du temps conditionnel pour cette tùche sera 3 à 5 fois plus élevée que pour la collecte de données à partir de Reddit.



Comparaison des groupes Odnoklassniki



Passons au cas le plus techniquement intĂ©ressant dĂ©crit. Pour moi, c'Ă©tait intĂ©ressant prĂ©cisĂ©ment parce qu'Ă  premiĂšre vue, cela semble assez trivial, mais cela ne s'avĂšre pas ĂȘtre le cas - dĂšs que vous le piquez avec un bĂąton.



Commençons par notre liste de contrÎle des difficultés et notons que beaucoup d'entre eux s'avéreront beaucoup plus difficiles qu'ils ne le paraissent au premier abord:



  • Il existe une API, mais il lui manque presque complĂštement les fonctions nĂ©cessaires.
  • Vous devez demander l'accĂšs Ă  certaines fonctions par courrier, c'est-Ă -dire que la dĂ©livrance de l'accĂšs n'est pas instantanĂ©e.
  • ( , , — , - ) , , , , .
  • , — API, , - .
  • , — wrapper ( ).
  • Selenium, .

    1) ( ).



    2) c Selenium ( ok.ru ).



    3) . JavaScript .



    4) , 




    5) API, wrapper , , ( ):



    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
    


    :



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



    6) Selenium + API .
  • Il est nĂ©cessaire de sauvegarder l'Ă©tat et de redĂ©marrer le systĂšme, de gĂ©rer de nombreuses erreurs, notamment des comportements incohĂ©rents du site - et ces erreurs plutĂŽt difficiles Ă  imaginer (si vous n'ĂȘtes pas un analyseur d'Ă©criture professionnel, bien sĂ»r).


L'estimation du temps conditionnel pour cette tùche sera 3 à 5 fois plus élevée que pour la collecte de données auprÚs de Habr. Malgré le fait que dans le cas de Habr, nous utilisons une approche frontale avec l'analyse HTML, et dans le cas de OK, nous pouvons travailler avec l'API dans des endroits critiques.



conclusions



Peu importe combien il vous est demandĂ© d'estimer les dĂ©lais «sur place» (nous avons la planification aujourd'hui!) D'un grand module de pipeline de traitement de donnĂ©es, le temps d'exĂ©cution n'est presque jamais possible Ă  estimer mĂȘme qualitativement sans analyser les paramĂštres de la tĂąche.



Plus philosophiquement parlant, les stratégies d'évaluation agiles sont bonnes pour les tùches d'ingénierie, mais avec des tùches plus expérimentales et, dans un sens, «créatives» et de recherche, c'est-à-dire moins prévisibles, des difficultés surviennent, comme dans des exemples de sujets similaires dont nous avons discuté ici.



Bien sûr, la collecte de données n'est qu'un excellent exemple - généralement, la tùche semble incroyablement simple et techniquement simple, et c'est dans les détails que le diable se cache le plus souvent. Et c'est sur cette tùche qu'il s'avÚre de montrer toute la gamme d'options possibles pour ce qui peut mal tourner et combien de temps le travail peut prendre.



Si vous parcourez le coin de l'Ɠil sur les caractĂ©ristiques du problĂšme sans expĂ©rimentation supplĂ©mentaire, Reddit et OK se ressemblent: il y a une API, un wrapper python, mais en fait, la diffĂ©rence est Ă©norme. À en juger par ces paramĂštres, l'analyse de Habr semble plus compliquĂ©e que OK - mais en pratique, c'est tout le contraire, et c'est ce que l'on peut dĂ©couvrir en menant des expĂ©riences simples sur l'analyse des paramĂštres du problĂšme.



D'aprĂšs mon expĂ©rience, l'approche la plus efficace est une estimation approximative du temps dont vous aurez besoin pour l'analyse prĂ©liminaire elle-mĂȘme et les premiĂšres expĂ©riences simples, en lisant la documentation - elles vous permettront de donner une estimation prĂ©cise pour l'ensemble du travail. Pour ce qui est de la mĂ©thodologie agile populaire, je vous demande de crĂ©er un ticket pour moi sous "l'estimation des paramĂštres du problĂšme", sur la base duquel je peux donner une estimation de ce qu'il est possible d'accomplir dans le "sprint" et donner une estimation plus prĂ©cise pour chaque problĂšme.



Par consĂ©quent, l'argument le plus efficace semble ĂȘtre celui qui montrerait au spĂ©cialiste «non technique» combien de temps et de ressources varieront en fonction de paramĂštres qui n'ont pas encore Ă©tĂ© estimĂ©s.






All Articles