Veri Biliminde ne yanlış gidebilir? Veri toplama

Veri Biliminde ne yanlış gidebilir? Veri toplama
Bugün 100500 Veri Bilimi kursu var ve Veri Biliminde en fazla paranın Veri Bilimi kurslarından kazanılabileceği uzun zamandır biliniyor (kürek satabilecekken neden kazmayasınız ki?). Bu kursların ana dezavantajı, gerçek çalışmayla hiçbir ilgilerinin olmamasıdır: hiç kimse size temiz, işlenmiş verileri gerekli formatta vermeyecektir. Ve kursu bırakıp gerçek bir problemi çözmeye başladığınızda birçok nüans ortaya çıkıyor.

Bu nedenle benim, yoldaşlarımın ve meslektaşlarımın başına gelen gerçek olaylardan yola çıkarak “Veri Biliminde Neler Yanlış Gidebilir?” başlıklı bir notlar dizisine başlıyoruz. Gerçek örnekleri kullanarak tipik Veri Bilimi görevlerini analiz edeceğiz: bunun gerçekte nasıl gerçekleştiği. Bugün veri toplama göreviyle başlayalım.

İnsanların gerçek verilerle çalışmaya başladıklarında ilk karşılaştıkları şey aslında bizimle en alakalı olan bu verileri toplamaktır. Bu makalenin ana mesajı:

Verileri toplamak, temizlemek ve hazırlamak için gereken zamanı, kaynakları ve çabayı sistematik olarak hafife alıyoruz.

Ve en önemlisi bunu önlemek için ne yapmamız gerektiğini tartışacağız.

Çeşitli tahminlere göre temizleme, dönüştürme, veri işleme, özellik mühendisliği vb. zamanın %80-90'ını, analiz ise %10-20'sini alırken, neredeyse tüm eğitim materyalleri yalnızca analize odaklanmaktadır.

Tipik bir örnek olarak basit bir analitik problemin üç versiyonuna bakalım ve “ağırlaştırıcı koşulların” neler olduğunu görelim.

Örnek olarak yine veri toplama ve toplulukları karşılaştırma görevinin benzer varyasyonlarını ele alacağız:

  1. İki Reddit alt dizini
  2. Habr'ın iki bölümü
  3. İki grup Odnoklassniki

Teoride koşullu yaklaşım

Siteyi açın ve örnekleri okuyun, eğer anlaşılırsa, birkaç saatinizi okumaya, birkaç saatinizi de örnekleri kullanma ve hata ayıklamaya ayırın. Koleksiyon için birkaç saat ekleyin. Yedekte birkaç saat ayırın (ikiyle çarpın ve N saat ekleyin).

Anahtar Nokta: Zaman tahminleri, ne kadar süreceği konusundaki varsayımlara ve tahminlere dayanmaktadır.

Yukarıda açıklanan koşullu problem için aşağıdaki parametreleri tahmin ederek zaman analizine başlamak gerekir:

  • Verinin boyutu nedir ve fiziksel olarak ne kadarının toplanması gerekir (*aşağıya bakınız*).
  • Bir plağın toplama süresi nedir ve ikincisini toplamak için ne kadar beklemeniz gerekir?
  • Durumu kaydeden ve her şey başarısız olduğunda (olmasa da) yeniden başlatmayı başlatan kod yazmayı düşünün.
  • Yetkiye ihtiyacımız olup olmadığını anlayın ve API aracılığıyla erişim elde etme zamanını ayarlayın.
  • Hata sayısını veri karmaşıklığının bir fonksiyonu olarak ayarlayın - belirli bir görevi değerlendirin: yapı, kaç dönüşüm, neyin ve nasıl çıkarılacağı.
  • Ağ hatalarını ve standart dışı proje davranışıyla ilgili sorunları düzeltin.
  • Gerekli işlevlerin belgelerde olup olmadığını, değilse geçici çözüm için nasıl ve ne kadar gerekli olduğunu değerlendirin.

En önemli şey, zamanı tahmin etmek için - aslında "yürürlükteki keşif" için zaman ve çaba harcamanız gerekir - ancak o zaman planlamanız yeterli olacaktır. Bu nedenle, “veri toplamak ne kadar sürer” demeye ne kadar zorlansanız da, ön analiz için kendinize biraz zaman ayırın ve sorunun gerçek parametrelerine bağlı olarak sürenin ne kadar değişeceğini tartışın.

Şimdi bu tür parametrelerin değişeceği spesifik örnekleri göstereceğiz.

Anahtar Nokta: Tahmin, işin kapsamını ve karmaşıklığını etkileyen temel faktörlerin analizine dayanmaktadır.

Tahmine dayalı tahmin, fonksiyonel unsurların yeterince küçük olduğu ve problemin tasarımını önemli ölçüde etkileyebilecek çok fazla faktörün bulunmadığı durumlarda iyi bir yaklaşımdır. Ancak bir takım Veri Bilimi sorunları söz konusu olduğunda bu tür faktörler aşırı derecede çoğalır ve böyle bir yaklaşım yetersiz kalır.

Reddit topluluklarının karşılaştırılması

En basit durumla başlayalım (daha sonra ortaya çıkacağı gibi). Genel olarak, tamamen dürüst olmak gerekirse, neredeyse ideal bir durumumuz var; karmaşıklık kontrol listemize bir göz atalım:

  • Düzgün, açık ve belgelenmiş bir API var.
  • Son derece basittir ve en önemlisi jetonun otomatik olarak elde edilmesidir.
  • Var piton sarmalayıcı - birçok örnekle.
  • Reddit'teki verileri analiz eden ve toplayan bir topluluk (hatta python sarmalayıcının nasıl kullanılacağını açıklayan YouTube videolarına kadar) işte bir örnek.
  • İhtiyacımız olan yöntemler büyük olasılıkla API'de mevcuttur. Üstelik kod kompakt ve temiz görünüyor; aşağıda bir gönderiye yapılan yorumları toplayan bir fonksiyon örneği bulunmaktadır.

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

-Den alınan bu Paketleme için uygun yardımcı programlardan oluşan bir seçki.

Bunun en iyi durum olmasına rağmen, gerçek hayattan bir takım önemli faktörleri hesaba katmaya değer:

  • API sınırları - verileri toplu olarak almak zorunda kalıyoruz (istekler arasında uyku vb.).
  • Toplama süresi - tam bir analiz ve karşılaştırma için, örümceğin alt dizin boyunca yürümesi için önemli bir zaman ayırmanız gerekecektir.
  • Botun bir sunucu üzerinde çalışması gerekir; onu sadece dizüstü bilgisayarınızda çalıştırıp, sırt çantanıza koyup işinize devam edemezsiniz. Bu yüzden her şeyi bir VPS'de çalıştırdım. Habrahabr10 promosyon kodunu kullanarak maliyetin %10'undan daha tasarruf edebilirsiniz.
  • Bazı verilere fiziksel olarak erişilememesi (yöneticiler tarafından görülebilir veya toplanması çok zordur) - bu dikkate alınmalıdır; prensip olarak tüm veriler yeterli sürede toplanamaz.
  • Ağ hataları: Ağ kurmak bir acıdır.
  • Bu canlı gerçek verilerdir; asla saf değildir.

Elbette bu nüansları da geliştirmeye dahil etmek gerekiyor. Belirli saatler/günler, geliştirme deneyimine veya benzer görevlerde çalışma deneyimine bağlıdır, ancak burada görevin tamamen mühendislik olduğunu ve çözmek için ek vücut hareketleri gerektirmediğini görüyoruz - her şey çok iyi değerlendirilebilir, planlanabilir ve yapılabilir.

Habr kesitlerinin karşılaştırılması

Habr'ın konularını ve/veya bölümlerini karşılaştırmanın daha ilginç ve önemsiz olmayan bir durumuna geçelim.

Karmaşıklık kontrol listemize bir göz atalım - burada, her noktayı anlamak için, görevin kendisine biraz dalmanız ve denemeler yapmanız gerekecek.

  • İlk başta bir API olduğunu düşünüyorsunuz ama yok. Evet, evet, Habr'ın bir API'si var ancak kullanıcılar bu API'ye erişemiyor (ya da belki de hiç çalışmıyor).
  • Daha sonra html'yi ayrıştırmaya başlıyorsunuz - "içe aktarma istekleri", ne yanlış gidebilir?
  • Yine de nasıl ayrıştırılır? En basit ve en sık kullanılan yaklaşım, kimlikler üzerinde yineleme yapmaktır; bunun en verimli olmadığını ve farklı durumları ele alması gerekeceğini unutmayın; burada, mevcut tüm kimlikler arasında gerçek kimliklerin yoğunluğunun bir örneğini bulabilirsiniz.

    Veri Biliminde ne yanlış gidebilir? Veri toplama
    -Den alınan bu makale.

  • Web'in üstünde HTML'ye sarılmış ham veriler bir acıdır. Örneğin, bir makalenin derecelendirmesini toplamak ve kaydetmek istiyorsunuz: HTML'den puanı aldınız ve daha sonraki işlemler için bunu bir sayı olarak kaydetmeye karar verdiniz: 

    1) int(score) bir hata veriyor: Habré'de örneğin “–5” satırında olduğu gibi bir eksi olduğundan - bu bir kısa çizgi, eksi işareti değil (beklenmedik bir şekilde, değil mi?), yani Bir noktada ayrıştırıcıyı böylesine korkunç bir düzeltmeyle hayata geçirmek zorunda kaldım.

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

    Hiçbir tarih, artılar ve eksiler olmayabilir (yukarıdaki check_date işlevinde gördüğümüz gibi bu gerçekleşti).

    2) Kaçamayan özel karakterler - gelecekler, hazırlıklı olmanız gerekiyor.

    3) Gönderinin türüne göre yapı değişir.

    4) Eski gönderilerin **tuhaf bir yapısı** olabilir.

  • Temel olarak, hata yönetimi ve ne olup ne olamayacağının ele alınması gerekecek ve neyin yanlış gideceğini, yapının başka nasıl olabileceğini ve neyin nerede düşeceğini kesin olarak tahmin edemezsiniz - sadece denemek ve hesaba katmak zorunda kalacaksınız ayrıştırıcının attığı hatalar.
  • Daha sonra birkaç iş parçacığını ayrıştırmanız gerektiğini fark edersiniz, aksi takdirde bir iş parçacığını ayrıştırmak 30+ saat sürecektir (bu yalnızca halihazırda çalışan, uyuyan ve herhangi bir yasak kapsamına girmeyen tek iş parçacıklı bir ayrıştırıcının yürütme süresidir). İÇİNDE bu makale, bu bir noktada benzer bir şemaya yol açtı:

Veri Biliminde ne yanlış gidebilir? Veri toplama

Karmaşıklığa göre toplam kontrol listesi:

  • Yineleme ve kimliğe göre arama ile ağ ve html ayrıştırma ile çalışma.
  • Heterojen yapıya sahip belgeler.
  • Kodun kolayca düşebileceği birçok yer var.
  • || yazmak zorunludur. kod.
  • Gerekli belgeler, kod örnekleri ve/veya topluluk eksik.

Bu görev için tahmini süre, Reddit'ten veri toplamaya göre 3-5 kat daha fazla olacaktır.

Odnoklassniki gruplarının karşılaştırılması

Açıklanan teknik açıdan en ilginç duruma geçelim. Benim için bu kesinlikle ilginçti çünkü ilk bakışta oldukça önemsiz görünüyor, ancak ona bir sopa soktuğunuz anda hiç de öyle görünmüyor.

Zorluk kontrol listemizle başlayalım ve birçoğunun ilk bakışta göründüğünden çok daha zor olacağını unutmayın:

  • Bir API var, ancak neredeyse tamamen gerekli işlevlerden yoksun.
  • Belirli işlevlere posta yoluyla erişim talebinde bulunmanız gerekir; yani erişim izni anında verilmez.
  • Korkunç bir şekilde belgelenmiştir (başlangıçta, Rusça ve İngilizce terimler her yerde karıştırılmıştır ve tamamen tutarsızdır - bazen sadece bir yerde sizden ne istediklerini tahmin etmeniz gerekir) ve ayrıca tasarım, örneğin veri elde etmek için uygun değildir. , ihtiyacımız olan fonksiyon.
  • Belgelerde bir oturum gerektirir, ancak aslında bunu kullanmaz - ve API modlarının tüm inceliklerini anlamanın, etrafa göz atıp bir şeyin işe yarayacağını ummaktan başka yolu yoktur.
  • Örnek yok ve topluluk yok; bilgi toplamada tek destek noktası küçük bir topluluktur. sarıcı Python'da (çok fazla kullanım örneği olmadan).
  • Gerekli verilerin çoğu kilitli olduğundan Selenyum en uygulanabilir seçenek gibi görünüyor.
    1) Yani yetkilendirme, hayali bir kullanıcı (ve elle kayıt) aracılığıyla gerçekleştirilir.

    2) Ancak Selenium'da doğru ve tekrarlanabilir çalışma garantisi yoktur (en azından ok.ru durumunda kesinlikle).

    3) Ok.ru web sitesi JavaScript hataları içeriyor ve bazen garip ve tutarsız davranıyor.

    4) Sayfalandırma, yükleme öğeleri vb. yapmanız gerekir.

    5) Paketleyicinin verdiği API hatalarının, örneğin şu şekilde (bir deneysel kod parçası) beceriksizce ele alınması gerekecektir:

    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
    

    En sevdiğim hata şuydu:

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

    6) Sonuçta Selenium + API en akılcı seçenek gibi görünüyor.

  • Durumu kaydetmek ve sistemi yeniden başlatmak, sitenin tutarsız davranışı da dahil olmak üzere birçok hatayı ele almak gerekir - ve bu hataların hayal edilmesi oldukça zordur (elbette ayrıştırıcıları profesyonelce yazmadığınız sürece).

Bu görev için koşullu zaman tahmini, Habr'dan veri toplamaya göre 3-5 kat daha yüksek olacaktır. Habr örneğinde HTML ayrıştırmada önden bir yaklaşım kullanmamıza rağmen, OK durumunda API ile kritik yerlerde çalışabiliriz.

Bulgular

Hacimli bir veri işleme hattı modülünün son tarihlerini "yerinde" (bugün planlıyoruz!) tahmin etmeniz ne kadar gerekse de, görev parametrelerini analiz etmeden yürütme süresini niteliksel olarak bile tahmin etmek neredeyse hiçbir zaman mümkün değildir.

Biraz daha felsefi bir notta, çevik tahmin stratejileri mühendislik görevleri için iyi çalışır, ancak daha deneysel ve bir anlamda "yaratıcı" ve keşfedici, yani daha az tahmin edilebilir olan problemler, benzer konuların örneklerinde olduğu gibi zorluklara sahiptir. bunu burada tartıştık.

Elbette veri toplama sadece en önemli örnektir; genellikle inanılmaz derecede basit ve teknik açıdan karmaşık olmayan bir iştir ve şeytan çoğu zaman ayrıntıda gizlidir. Ve tam olarak bu görevde neyin yanlış gidebileceğine ve işin tam olarak ne kadar sürebileceğine dair tüm olası seçenekleri gösterebiliriz.

Ek deneyler olmadan görevin özelliklerine bakarsanız, Reddit ve OK benzer görünür: bir API, bir python sarmalayıcı var, ancak özünde fark çok büyük. Bu parametrelere bakılırsa, Habr'ın pars'ı OK'den daha karmaşık görünüyor; ancak pratikte durum tam tersidir ve sorunun parametrelerini analiz etmek için basit deneyler yaparak tam olarak öğrenilebilecek şey budur.

Deneyimlerime göre, en etkili yaklaşım, ön analizin kendisi ve basit ilk deneyler için ihtiyaç duyacağınız süreyi kabaca tahmin etmek, belgeleri okumaktır - bunlar, tüm çalışma için doğru bir tahmin vermenizi sağlayacaktır. Popüler çevik metodoloji açısından, sizden "görev parametrelerini tahmin etmek" için bir bilet oluşturmanızı rica ediyorum; buna dayanarak "sprint" içinde nelerin başarılabileceğine dair bir değerlendirme verebilir ve her biri için daha doğru bir tahmin verebilirim. görev.

Bu nedenle, en etkili argüman, “teknik olmayan” bir uzmana, henüz değerlendirilmemiş parametrelere bağlı olarak zaman ve kaynakların ne kadar değişeceğini gösterecek olan argüman gibi görünmektedir.

Veri Biliminde ne yanlış gidebilir? Veri toplama

Kaynak: habr.com

Yorum ekle