Apa yang salah dengan Ilmu Data? Pengumpulan data



Saat ini ada 100.500 kursus dalam Ilmu Data dan telah lama diketahui bahwa sebagian besar uang dalam Ilmu Data dapat diperoleh dengan tepat melalui kursus dalam Ilmu Data (mengapa menggali jika Anda dapat menjual sekop?). Kerugian utama dari kursus ini adalah bahwa mereka tidak ada hubungannya dengan pekerjaan nyata: tidak ada yang akan memberi Anda data yang bersih dan telah diproses dalam format yang diperlukan. Dan ketika Anda meninggalkan kursus dan mulai menyelesaikan masalah yang sebenarnya, banyak nuansa muncul.



Oleh karena itu, kami memulai serangkaian catatan "Apa yang salah dengan Ilmu Data", berdasarkan peristiwa nyata yang terjadi pada saya, rekan, dan kolega saya. Kami akan menganalisis tugas-tugas tipikal dalam Ilmu Data menggunakan contoh nyata: bagaimana hal itu sebenarnya terjadi. Mari kita mulai hari ini dengan tugas mengumpulkan data.



Dan hal pertama yang membuat orang tersandung ketika mereka mulai bekerja dengan data sebenarnya adalah mengumpulkan data yang paling relevan ini bagi kami. Pesan utama artikel ini:



Kami secara sistematis meremehkan waktu, sumber daya, dan upaya yang terlibat dalam pengumpulan, pembersihan, dan persiapan data.


Dan yang terpenting, kami akan membahas apa yang harus dilakukan untuk mencegahnya.



Berdasarkan berbagai perkiraan, pembersihan, transformasi, pemrosesan data, rekayasa fitur, dll. Menghabiskan 80-90% waktu, dan analisis 10-20%, sementara hampir semua materi pelatihan berfokus secara eksklusif pada analisis.



Mari kita ambil sebagai contoh tipikal masalah analitis sederhana dalam tiga varian dan lihat apa jenis "keadaan yang memberatkan" itu.



Sebagai contoh, sekali lagi, kami akan mempertimbangkan variasi serupa dari tugas mengumpulkan data dan membandingkan komunitas untuk:



  1. Dua subreddit Reddit
  2. Dua bagian Habr
  3. Dua kelompok Odnoklassniki


Pendekatan bersyarat dalam teori



Buka situs dan baca contoh, jika jelas, luangkan beberapa jam untuk membaca, beberapa jam untuk kode menggunakan contoh dan debugging. Tambahkan beberapa jam untuk mengumpulkan. Lemparkan dalam beberapa jam sebagai cadangan (kalikan dengan dua dan tambahkan N jam).



Poin utama: Perkiraan waktu didasarkan pada asumsi dan perkiraan tentang berapa lama waktu yang dibutuhkan.



Analisis waktu perlu dimulai dengan mengevaluasi parameter berikut untuk masalah bersyarat yang dijelaskan di atas:



  • Berapa ukuran data dan berapa banyak yang perlu dikumpulkan secara fisik (* lihat di bawah *).
  • Berapa lama untuk mengumpulkan satu catatan dan berapa lama untuk mengumpulkan yang kedua.
  • Untuk meletakkan penulisan kode yang menyimpan negara dan memulai restart ketika (dan bukan jika) semuanya jatuh.
  • , API.
  • , — : , , .
  • .
  • , , a workaround.


Yang terpenting, untuk memperkirakan waktu - Anda benar-benar perlu menginvestasikan waktu dan upaya dalam "pengintaian yang berlaku" - hanya dengan demikian perencanaan Anda akan memadai. Oleh karena itu, tidak peduli bagaimana Anda didorong untuk mengatakan "berapa lama waktu yang dibutuhkan untuk mengumpulkan data," luangkan waktu untuk analisis awal dan berdebat berapa banyak waktu akan bervariasi tergantung pada parameter sebenarnya dari masalah tersebut.



Dan sekarang kami akan menunjukkan contoh spesifik di mana parameter tersebut akan berubah.



Poin utama: Penilaian didasarkan pada analisis faktor-faktor utama yang mempengaruhi volume dan kompleksitas pekerjaan.



Estimasi tebakan adalah pendekatan yang baik jika elemen fungsionalnya cukup kecil dan tidak banyak faktor yang dapat mempengaruhi struktur masalah secara signifikan. Tetapi dalam kasus sejumlah tugas Ilmu Data, faktor-faktor tersebut menjadi sangat banyak dan pendekatan semacam itu menjadi tidak memadai.



Perbandingan Komunitas Reddit



Mari kita mulai dengan kasus paling sederhana (yang ternyata nanti). Secara umum, sejujurnya, ini adalah kasus yang hampir ideal, mari kita periksa daftar kesulitan kami:



  • Ada API yang rapi, lugas dan terdokumentasi.
  • Sangat sederhana dan penting bahwa token diperoleh secara otomatis.
  • Ada pembungkus python - dengan banyak contoh.
  • Sebuah komunitas yang menganalisis dan mengumpulkan data di reddit (hingga video youtube yang menjelaskan cara menggunakan pembungkus python) , misalnya .
  • Metode yang kami butuhkan kemungkinan besar ada di API. Selain itu, kodenya terlihat kompak dan bersih, di bawah ini adalah contoh fungsi yang mengumpulkan komentar pada sebuah posting.


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()
Diambil dari ini koleksi utilitas wrapper berguna.



Terlepas dari kenyataan bahwa kami memiliki kasus terbaik di sini, masih ada baiknya mempertimbangkan sejumlah faktor penting dari kehidupan nyata:



  • Batasan API - kami dipaksa untuk mengambil data dalam batch (tidur di antara permintaan, dll.).
  • Waktu pengumpulan - untuk analisis dan perbandingan yang lengkap, Anda harus menyisihkan banyak waktu hanya agar laba-laba melewati subreddit.
  • Bot harus berjalan di server - Anda tidak bisa hanya menjalankannya di laptop Anda, memasukkannya ke dalam ransel Anda dan menjalankan bisnis. Jadi saya menjalankan semuanya di VPS. Dengan kode promo habrahabr10, Anda bisa menghemat 10% biaya lagi.
  • Beberapa data tidak dapat diakses secara fisik (dapat dilihat oleh admin atau terlalu sulit dikumpulkan) - ini harus diperhitungkan, tidak semua data, pada prinsipnya, dapat dikumpulkan dalam waktu yang memadai.
  • Kesalahan Jaringan: Membangun jaringan itu menyebalkan.
  • Ini adalah data nyata yang hidup - tidak pernah bersih.


Tentunya perlu untuk memasukkan nuansa tersebut dalam pembangunan. Jam / hari tertentu bergantung pada pengalaman atau pengalaman pengembangan dalam mengerjakan tugas serupa, namun demikian, kami melihat bahwa di sini tugas tersebut secara eksklusif rekayasa dan tidak memerlukan gerakan tambahan untuk menyelesaikannya - semuanya dapat dievaluasi, dicat, dan diselesaikan dengan sangat baik.



Perbandingan bagian Habr



Mari beralih ke kasus yang lebih menarik dan tidak sepele untuk membandingkan aliran dan / atau bagian Habr.



Mari kita periksa daftar kesulitan kita - di sini, untuk memahami setiap poin, Anda sudah harus melihat-lihat sedikit ke dalam masalah itu sendiri dan bereksperimen.



  • Awalnya Anda mengira ada API, tapi ternyata tidak. Ya, ya, Habr memiliki API, tetapi hanya itu tidak tersedia untuk pengguna (atau mungkin tidak berfungsi sama sekali).
  • Kemudian Anda baru mulai mengurai html - "permintaan impor", apa yang salah?
  • Bagaimana Anda mengurai? Pendekatan yang paling sederhana dan paling sering digunakan adalah melakukan iterasi melalui ID, perhatikan bahwa ini bukan yang paling efisien dan harus menangani kasus yang berbeda - misalnya, kepadatan ID sebenarnya di antara semua ID yang ada.





    Diambil dari artikel ini .
  • , 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) ** **.
  • Faktanya, penanganan kesalahan dan apa yang mungkin atau mungkin tidak terjadi harus ditangani dan tidak mungkin untuk memprediksi dengan pasti apa yang akan salah dan bagaimana lagi strukturnya dan apa yang akan jatuh di mana - Anda hanya perlu mencoba dan memperhitungkan kesalahan yang dilemparkan parser.
  • Kemudian Anda memahami bahwa Anda perlu mengurai menjadi beberapa utas, jika tidak, penguraian menjadi satu akan memakan waktu 30+ jam (ini murni waktu eksekusi parser utas tunggal yang sudah berfungsi yang tidur dan tidak termasuk dalam larangan apa pun). Dalam artikel ini , hal ini mengarah pada pola yang serupa:






Daftar periksa kesulitan total:



  • Bekerja dengan web dan penguraian html dengan iterasi dan pencarian berdasarkan ID.
  • Dokumen dengan struktur heterogen.
  • Ada banyak tempat di mana kode dapat jatuh dengan mudah.
  • Itu perlu untuk ditulis || Kode.
  • Dokumentasi, contoh kode, dan / atau komunitas hilang.


Perkiraan waktu bersyarat untuk tugas ini akan 3-5 kali lebih tinggi daripada untuk mengumpulkan data dari Reddit.



Perbandingan kelompok Odnoklassniki



Mari beralih ke kasus yang paling menarik secara teknis yang dijelaskan. Bagi saya, menarik justru karena sekilas terlihat sepele, tapi ternyata tidak begitu - begitu Anda menusuknya dengan tongkat.



Mari kita mulai dengan daftar periksa kesulitan kita dan perhatikan bahwa banyak di antaranya yang ternyata jauh lebih sulit daripada yang terlihat pada awalnya:



  • Ada API, tetapi hampir sepenuhnya tidak memiliki fungsi yang diperlukan.
  • Anda perlu meminta akses ke fungsi tertentu melalui surat, artinya, penerbitan akses tidak seketika.
  • ( , , — , - ) , , , , .
  • , — 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 .
  • Anda perlu menyimpan status dan memulai ulang sistem, menangani banyak kesalahan, termasuk perilaku situs yang tidak konsisten - dan kesalahan ini, yang cukup sulit untuk dibayangkan (tentu saja jika Anda tidak menulis parser secara profesional).


Perkiraan waktu bersyarat untuk tugas ini akan 3-5 kali lebih tinggi daripada untuk mengumpulkan data dari Habr. Terlepas dari kenyataan bahwa dalam kasus Habr, kami menggunakan pendekatan frontal dengan parsing HTML, dan dalam kasus OK, kami dapat bekerja dengan API di tempat-tempat kritis.



kesimpulan



Tidak peduli berapa banyak Anda diminta untuk memperkirakan tenggat waktu "di tempat" (kami memiliki perencanaan hari ini!) Dari modul pipa pemrosesan data yang besar, waktu pelaksanaan hampir tidak pernah mungkin untuk memperkirakan bahkan secara kualitatif tanpa menganalisis parameter tugas.



Lebih filosofis berbicara, strategi penilaian tangkas baik untuk tugas teknik, tetapi dengan tugas yang lebih eksperimental dan, dalam arti, "kreatif" dan penelitian, yaitu, kurang dapat diprediksi, kesulitan muncul, seperti dalam contoh topik serupa yang sudah kita bahas disini.



Tentu saja, mengumpulkan data hanyalah contoh utama - biasanya tugasnya tampak sangat sederhana dan tidak rumit secara teknis, dan dalam detail itulah iblis paling sering bersembunyi. Dan pada tugas inilah ternyata untuk menunjukkan seluruh jajaran kemungkinan opsi untuk apa yang bisa salah dan berapa lama pekerjaan bisa berlangsung.



Jika Anda membaca sekilas tentang karakteristik masalah tanpa eksperimen tambahan, maka Reddit dan OK terlihat serupa: ada API, pembungkus python, tetapi pada kenyataannya, perbedaannya sangat besar. Dilihat dari parameter ini, penguraian Habr terlihat lebih rumit daripada OK - tetapi dalam praktiknya justru sebaliknya, dan inilah yang dapat ditemukan dengan melakukan eksperimen sederhana pada analisis parameter masalah.



Menurut pengalaman saya, pendekatan yang paling efektif adalah perkiraan waktu yang Anda perlukan untuk analisis pendahuluan itu sendiri dan percobaan pertama yang sederhana, membaca dokumentasi - mereka akan memungkinkan Anda memberikan perkiraan yang akurat untuk keseluruhan pekerjaan. Dalam hal metodologi agile yang populer, saya meminta Anda untuk membuatkan tiket untuk saya di bawah "perkiraan parameter masalah", yang menjadi dasarnya saya dapat memberikan perkiraan tentang apa yang mungkin dicapai dalam "sprint" dan memberikan perkiraan yang lebih akurat untuk setiap masalah.



Oleh karena itu, argumen yang paling efektif tampaknya adalah argumen yang akan menunjukkan kepada spesialis "non-teknis" berapa banyak waktu dan sumber daya yang akan bervariasi tergantung pada parameter yang belum diperkirakan.






All Articles