ما الخطأ الذي يمكن أن يحدث في علوم البيانات؟ جمع البيانات



يوجد اليوم 100500 دورة تدريبية في علوم البيانات ، ومن المعروف منذ فترة طويلة أن معظم الأموال في علوم البيانات يمكن كسبها بدقة من خلال الدورات التدريبية في علوم البيانات (لماذا الحفر عندما يمكنك بيع المجارف؟). العيب الرئيسي لهذه الدورات هو أنها لا علاقة لها بالعمل الحقيقي: لن يمنحك أحد بيانات نظيفة ومعالجة بالتنسيق المطلوب. وعندما تترك الدورات وتبدأ في حل المشكلة الحقيقية ، تظهر العديد من الفروق الدقيقة.



لذلك ، بدأنا سلسلة من الملاحظات "ما الخطأ الذي يمكن أن يحدث في علم البيانات" ، استنادًا إلى الأحداث الحقيقية التي حدثت لي ولرفاقي وزملائي. سنقوم بتحليل المهام النموذجية في علوم البيانات باستخدام أمثلة حقيقية: كيف يحدث ذلك بالفعل. لنبدأ اليوم بمهمة جمع البيانات.



وأول شيء يتعثر حوله الناس عندما يبدأون العمل ببيانات حقيقية هو في الواقع جمع هذه البيانات الأكثر صلة بنا. الرسالة الرئيسية لهذه المقالة:



نحن نستهين بشكل منهجي بالوقت والموارد والجهد المبذول في جمع البيانات وتنظيفها وإعدادها.


والأهم من ذلك ، سنناقش ما يجب القيام به لمنع ذلك.



وفقًا لتقديرات مختلفة ، يستغرق التنظيف ، والتحويل ، ومعالجة البيانات ، وهندسة الميزات ، وما إلى ذلك 80-90 ٪ من الوقت ، والتحليل 10-20 ٪ ، بينما تركز جميع المواد التعليمية تقريبًا على التحليل.



لنأخذ كمثال نموذجي مشكلة تحليلية بسيطة في ثلاث نسخ ونرى ما هي "الظروف المشددة".



مرة أخرى ، كمثال ، سننظر في الاختلافات المماثلة لمهمة جمع البيانات ومقارنة المجتمعات من أجل:



  1. اثنين من subreddits Reddit
  2. قسمان هبر
  3. مجموعتان من Odnoklassniki


النهج الشرطي من الناحية النظرية



افتح الموقع واقرأ الأمثلة ، إذا كان الأمر واضحًا ، ضع بضع ساعات للقراءة ، وبضع ساعات للكود عن طريق الأمثلة وتصحيح الأخطاء. أضف بضع ساعات للجمع. رمي في بضع ساعات في الاحتياطي (اضرب في اثنين وأضف N ساعة).



النقطة الأساسية: يعتمد تقدير الوقت على الافتراضات والتخمينات حول المدة التي سيستغرقها.



من الضروري البدء في تحليل الوقت من خلال تقييم المعلمات التالية للمشكلة الشرطية الموضحة أعلاه:



  • ما هو حجم البيانات وكم يجب جمعها فعليًا (* انظر أدناه *).
  • كم من الوقت يستغرق تجميع سجل واحد والوقت الذي يستغرقه جمع السجل الثاني.
  • لوضع كتابة الكود الذي يحفظ الحالة ويبدأ إعادة التشغيل عندما (وليس إذا) يسقط كل شيء.
  • , API.
  • , — : , , .
  • .
  • , , a workaround.


الأهم من ذلك ، لتقدير الوقت - تحتاج بالفعل إلى استثمار الوقت والجهد في "الاستطلاع الساري" - عندها فقط سيكون تخطيطك مناسبًا. لذلك ، بغض النظر عن كيفية دفعك لقول "كم من الوقت يستغرق جمع البيانات" ، خذ بعض الوقت لإجراء تحليل أولي وناقش مدى اختلاف الوقت اعتمادًا على المعلمات الحقيقية للمشكلة.



والآن سنعرض أمثلة محددة حيث ستتغير هذه المعلمات.



النقطة الأساسية: يعتمد التقييم على تحليل العوامل الرئيسية التي تؤثر على حجم العمل وتعقيده.



تقدير التخمين هو نهج جيد عندما تكون العناصر الوظيفية صغيرة بما يكفي ولا توجد العديد من العوامل التي يمكن أن تؤثر بشكل كبير على بنية المشكلة. ولكن في حالة عدد من مهام علوم البيانات ، هناك الكثير من هذه العوامل ويصبح مثل هذا النهج غير مناسب.



مقارنة مجتمعات Reddit



لنبدأ بأبسط حالة (كما سيتضح لاحقًا). بشكل عام ، لكي نكون صادقين تمامًا ، لدينا حالة شبه مثالية ، دعنا نتحقق من قائمة التحقق الخاصة بالصعوبة:



  • هناك واجهة برمجة تطبيقات أنيقة ومباشرة وموثقة.
  • من السهل جدًا والمهم الحصول على رمز مميز تلقائيًا.
  • يوجد غلاف بيثون - مع مجموعة من الأمثلة.
  • مجتمع يقوم بتحليل وجمع البيانات على reddit (حتى مقاطع فيديو youtube تشرح كيفية استخدام غلاف python) ، على سبيل المثال .
  • الأساليب التي نحتاجها على الأرجح موجودة في API. علاوة على ذلك ، يبدو الرمز مضغوطًا ونظيفًا ، فيما يلي مثال على وظيفة تجمع التعليقات على المنشور.


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()
مأخوذة من هذه المجموعة من أدوات التغليف اليدوية.



على الرغم من حقيقة أن لدينا أفضل حالة هنا ، إلا أنه لا يزال من المفيد التفكير في عدد من العوامل المهمة من الحياة الواقعية:



  • حدود API - نحن مجبرون على أخذ البيانات على دفعات (السكون بين الطلبات ، وما إلى ذلك).
  • وقت التجميع - لإجراء تحليل ومقارنة كاملين ، سيتعين عليك تخصيص قدر كبير من الوقت لمجرد أن يمر العنكبوت عبر subreddit.
  • يجب أن يعمل الروبوت على الخادم - لا يمكنك تشغيله فقط على الكمبيوتر المحمول الخاص بك ، ووضعه في حقيبة الظهر الخاصة بك والبدء في العمل. لذلك قمت بتشغيل كل شيء على VPS. مع الرمز الترويجي habrahabr10 ، يمكنك توفير 10٪ أخرى من التكلفة.
  • عدم إمكانية الوصول المادي إلى بعض البيانات (تكون مرئية للمسؤولين أو يصعب جمعها) - يجب أن يؤخذ ذلك في الاعتبار ، ولا يمكن جمع جميع البيانات ، من حيث المبدأ ، في وقت مناسب.
  • أخطاء الشبكات: الشبكات هي ألم.
  • هذه بيانات حقيقية حية - فهي ليست نظيفة أبدًا.


بالطبع ، من الضروري تضمين الفروق الدقيقة المحددة في التطوير. تعتمد ساعات / أيام محددة على خبرة التطوير أو الخبرة في العمل على مهام مماثلة ، ومع ذلك ، نرى أن المهمة هنا هي هندسة حصرية ولا تتطلب إيماءات إضافية لحلها - يمكن تقييم كل شيء ووصفه وإنجازه جيدًا.



مقارنة أقسام هبر



دعنا ننتقل إلى حالة أكثر إثارة للاهتمام وغير تافهة لمقارنة التدفقات و / أو أقسام Habr.



دعنا نتحقق من قائمة الصعوبة الخاصة بنا - هنا ، لفهم كل نقطة ، عليك بالفعل أن تدرس قليلاً في المشكلة نفسها وتجربها.



  • في البداية تعتقد أن هناك API ، لكن ليس هناك. نعم ، نعم ، يمتلك Habr واجهة برمجة تطبيقات ، لكنها فقط غير متاحة للمستخدمين (أو ربما لا تعمل على الإطلاق).
  • ثم تبدأ في تحليل html - "طلبات الاستيراد" ، ما الخطأ الذي يمكن أن يحدث؟
  • كيف تحلل بشكل عام؟ الطريقة الأبسط والأكثر استخدامًا هي تكرار المعرفات ، لاحظ أنه ليس الأكثر كفاءة وسيتعين عليه التعامل مع الحالات المختلفة - على سبيل المثال ، كثافة المعرفات الحقيقية بين جميع المعرفات الموجودة.





    مأخوذة من هذه المقالة.
  • , 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) ** **.
  • في الواقع ، يجب التعامل مع معالجة الأخطاء وما قد يحدث أو لا يحدث ، ومن المستحيل التنبؤ على وجه اليقين بما سيحدث بشكل خاطئ وكيف يمكن أن يكون الهيكل وما الذي سينخفض ​​في مكانه - سيكون عليك فقط محاولة ومراعاة الأخطاء التي يلقيها المحلل.
  • ثم تدرك أنك بحاجة إلى التحليل إلى عدة سلاسل ، وإلا فإن التحليل في واحد سيستغرق 30 + ساعة (هذا هو وقت تنفيذ المحلل اللغوي أحادي الخيط العامل بالفعل والذي ينام ولا يقع تحت أي حظر). في هذه المقالة ، أدى هذا في وقت ما إلى نمط مماثل:






قائمة مراجعة إجمالي التعقيد:



  • العمل مع تحليل الويب و html مع التكرار والبحث عن طريق المعرف.
  • وثائق ذات بنية غير متجانسة.
  • هناك العديد من الأماكن التي يمكن أن تقع فيها التعليمات البرمجية بسهولة.
  • من الضروري أن تكتب || الرمز.
  • الوثائق وعينات التعليمات البرمجية و / أو المجتمع مفقود.


سيكون تقدير الوقت المشروط لهذه المهمة أكبر من 3-5 مرات من جمع البيانات من Reddit.



مقارنة مجموعات Odnoklassniki



دعنا ننتقل إلى الحالة الأكثر إثارة للاهتمام من الناحية الفنية الموصوفة. بالنسبة لي ، كان الأمر ممتعًا على وجه التحديد لأنه للوهلة الأولى ، يبدو تافهًا تمامًا ، لكن لا يتضح أنه كذلك - بمجرد أن تخزه بعصا.



لنبدأ بقائمة التحقق الخاصة بالصعوبة الخاصة بنا ونلاحظ أن العديد منها سيكون أكثر صعوبة مما يبدو عليه في البداية:



  • هناك واجهة برمجة تطبيقات ، لكنها تقريبًا تفتقر تمامًا إلى الوظائف الضرورية.
  • تحتاج إلى طلب الوصول إلى وظائف معينة عن طريق البريد ، أي أن إصدار الوصول ليس فوريًا.
  • ( , , — , - ) , , , , .
  • , — 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 .
  • من الضروري حفظ الحالة وإعادة تشغيل النظام ، ومعالجة العديد من الأخطاء ، بما في ذلك السلوك غير المتسق للموقع - وهذه الأخطاء التي يصعب تخيلها (إذا لم تكن محلل كتابة محترفًا ، بالطبع).


سيكون تقدير الوقت المشروط لهذه المهمة 3-5 مرات أعلى من جمع البيانات من Habr. على الرغم من حقيقة أننا في حالة Habr نستخدم نهجًا مباشرًا مع تحليل HTML ، وفي حالة OK ، يمكننا العمل مع API في الأماكن الحرجة.



الاستنتاجات



بغض النظر عن مدى مطالبتك بتقدير المواعيد النهائية "على الفور" (لدينا التخطيط اليوم!) من وحدة خط أنابيب معالجة البيانات الحجمية ، يكاد يكون وقت التنفيذ غير ممكن تقريبًا حتى نوعيًا دون تحليل معلمات المهمة.



من الناحية الفلسفية ، تعد استراتيجيات التقييم السريع جيدة للمهام الهندسية ، ولكن مع المهام التي تكون أكثر تجريبية ، وبمعنى آخر ، "إبداعية" وبحثية ، أي صعوبات أقل قابلية للتنبؤ بها ، كما هو الحال في أمثلة الموضوعات المماثلة حللناها هنا.



بالطبع ، جمع البيانات هو مجرد مثال رئيسي - عادة ما يبدو بسيطًا للغاية وغير معقد تقنيًا ، وفي التفاصيل يكمن الشيطان في أغلب الأحيان. ومن خلال هذه المهمة ، اتضح أنه يظهر النطاق الكامل للخيارات الممكنة لما يمكن أن يحدث بشكل خاطئ والمدة التي يمكن أن يستغرقها العمل.



إذا قمت بتخطي زاوية عينك فوق خصائص المشكلة دون إجراء تجارب إضافية ، فإن Reddit و OK تبدو متشابهة: هناك API ، غلاف بيثون ، ولكن في الواقع ، الفرق كبير. إذا حكمنا من خلال هذه المعلمات ، فإن تحليل Habr يبدو أكثر تعقيدًا من OK - ولكن من الناحية العملية هو عكس ذلك تمامًا ، وهذا ما يمكن اكتشافه من خلال إجراء تجارب بسيطة على تحليل معاملات المشكلة.



من واقع خبرتي ، فإن النهج الأكثر فاعلية هو تقدير تقريبي للوقت الذي ستحتاجه للتحليل الأولي نفسه والتجارب الأولى البسيطة ، وقراءة الوثائق - ستسمح لك بإعطاء تقدير دقيق للعمل بأكمله. فيما يتعلق بمنهجية أجايل الشائعة ، أطلب منك إنشاء تذكرة لي تحت عنوان "تقدير معلمات المشكلة" ، والتي على أساسها يمكنني تقديم تقدير لما يمكن تحقيقه ضمن "العدو" وتقديم تقدير أكثر دقة لكل مشكلة.



لذلك ، يبدو أن الحجة الأكثر فاعلية هي تلك التي من شأنها أن تُظهر للمتخصص "غير التقني" مقدار الوقت والموارد التي ستختلف وفقًا للمعايير التي لم يتم تقديرها بعد.






All Articles