Topik temu duga representatif

Temuduga Kejuruteraan Data: Bagaimana Anda Mereka Bentuk Point-in-Time Feature Joins?

DataSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Reka bentuk feature store untuk latihan luar talian dan terangkan bagaimana setiap contoh latihan hanya menggunakan ciri yang tersedia pada masa tersebut.

Gesaan dan konteks

Anda bertanggungjawab ke atas platform ciri untuk ramalan klik iklan. Setiap baris latihan mengandungi entity_id, label_ts, dan label; nilai ciri berubah apabila peristiwa tiba, manakala permintaan dalam talian memerlukan bacaan kependaman rendah bagi nilai semasa. Terangkan join point-in-time luar talian, dan cara anda mengendalikan backfill, peristiwa lewat, dan penayangan (serving) dalam talian. Andaikan sesuatu entiti mempunyai pelbagai versi ciri, setiap rekod mempunyai masa pengiraan, dan masa label ialah masa peristiwa perniagaan.

Perkara yang dinilai oleh penemuduga

Isyarat utama adalah sama ada anda mentakrifkan "tersedia pada masa itu" sebelum menamakan storan. Jawapan yang lemah menyatakan gudang data ditambah Redis. Jawapan yang kukuh menyatakan invarian feature_ts <= label_ts, memilih versi layak terkini bagi setiap entiti, mengembalikan null apabila tiada sejarah wujud, dan memisahkan paparan latihan sejarah daripada nilai terkini dalam talian. Ia juga menerangkan peristiwa lewat mana yang menyebabkan pengiraan semula dan cara mengesan pencongan latihan-penayangan (training-serving skew).

Soalan penjelasan

  • Adakah masa label merupakan masa peristiwa perniagaan atau masa label ditulis? Sempadan ini mengubah operasi join.
  • Berapa lama selepas peristiwa sesuatu ciri boleh tiba dan masih boleh digunakan? Semantik masa nyata yang ketat memerlukan cap masa ketersediaan.
  • Adakah latihan mesti menghasilkan semula setiap versi sejarah, atau hanya tetingkap terkini? Yang pertama memerlukan sejarah penuh; yang kedua boleh menggunakan had imbas kembali (lookback limit).
  • Adakah serving dalam talian memerlukan nilai terkini sekarang atau nilai pada masa sesuatu peristiwa? Yang kedua memerlukan API bercap masa, bukan nilai cache tunggal.

Jawapan 30 saat

"Saya menyimpan kunci entiti, versi ciri, dan masa ketersediaan untuk setiap rekod ciri. Semasa membina data latihan, saya melakukan as-of join bagi setiap entiti dan mengekalkan rekod terkini dengan feature_ts <= label_ts; jika tiada yang layak, nilainya kekal null. Storan luar talian menyimpan sejarah, manakala storan dalam talian menyajikan nilai semasa, kedua-duanya dihasilkan daripada definisi ciri dan aliran pematerialan yang sama. Peristiwa lewat memasuki barisan pengiraan semula, tetingkap yang terjejas dibina semula menjadi snapshot berversi, dan saya memantau kadar null bagi join, kesegaran, taburan dalam talian/luar talian, dan kesan model."

Penyelesaian langkah demi langkah

1. Nyatakan invarian masa

Untuk sampel s=(e, t_label) dan sejarah ciri H_e, pilih C={h∈H_e | h.feature_ts ≤ t_label} dan kembalikan arg max feature_ts(C). Ini menghalang nilai masa hadapan daripada memasuki latihan. Jika makna perniagaan adalah "data telah tersedia," gunakan available_ts sebagai kekangan tambahan; masa peristiwa sahaja mungkin terlalu optimistik.

2. Modelkan sejarah dan operasi join

Simpan kunci entiti, nama atau versi ciri, nilai, feature_ts, available_ts, kelompok sumber, dan status kualiti. Baris latihan membawa label_ts. Bahagikan mengikut entiti dan susun mengikut masa untuk as-of join; gunakan jujukan sumber atau kelompok penulisan sebagai pemecah seri yang deterministik bagi cap masa yang sama. Join masa tepat (exact-time join) menggugurkan kebanyakan baris, manakala memilih baris terkini membocorkan maklumat masa hadapan.

3. Asingkan laluan luar talian dan dalam talian

Storan luar talian menyimpan sejarah penuh untuk latihan kelompok; storan nilai-kunci dalam talian menyajikan nilai semasa dengan pantas. Definisi yang dikongsi menghasilkan kedua-dua laluan dan merekodkan versinya, snapshot input, dan tera air (watermark) pematerialan. Jika keusangan terhad (bounded staleness) dibenarkan, respons dalam talian mungkin menyertakan nilai terkini dan feature_ts miliknya supaya pemanggil boleh memutuskan sama ada untuk merosotkan prestasi; ia tidak boleh berpura-pura bahawa ini adalah nilai masa latihan.

4. Kendalikan peristiwa lewat, backfill, dan versi

Tulis peristiwa lewat ke lapisan mentah (raw layer) yang tidak boleh diubah (immutable), kemudian masukkan pengiraan semula ke dalam barisan untuk entiti dan tetingkap masa yang terjejas. Bina semula snapshot latihan baharu dan bukannya menulis ganti snapshot yang digunakan oleh model yang telah dikeluarkan. Jadikan backfill idempoten dengan kelompok input ditambah versi definisi sebagai kunci tugasan. Apabila logik ciri berubah, terbitkan versi baharu dan kekalkan versi lama supaya eksperimen sejarah kekal boleh dihasilkan semula.

5. Sahkan dan pantau

Sampel baris luar talian untuk menegaskan feature_ts <= label_ts, dan jejak kadar null untuk entiti tanpa sejarah yang layak. Pantau kependaman dalam talian, usia ciri, kelewatan pematerialan, dan ralat. Bandingkan taburan latihan dan penayangan untuk mengesan pengendalian null atau sempadan tetingkap yang berbeza. Simpan snapshot sampel, versi definisi, dan tera air input dalam metadata model supaya latihan boleh dihasilkan semula.

6. Ketahui bila tidak perlu membina feature store yang lengkap

Untuk projek kecil khusus kelompok, pertanyaan gudang data dengan susunan tetingkap dan as-of join adalah lebih mudah. Tambahkan lapisan sejarah luar talian, lapisan nilai-kunci dalam talian, pendaftaran, dan pematerial apabila penayangan milisaat, penggunaan semula ciri, dan backfill berterusan mewajarkannya. Mengira setiap ciri dalam masa nyata meningkatkan keadaan (state), kos, dan risiko ketidakkonsistenan; mengekalkan nilai terkini sahaja menghalang pembinaan semula latihan sejarah.

Contoh jawapan berkualiti tinggi

Saya menganggap "kelihatan pada masa itu" sebagai kekangan yang tegar. Sejarah ciri setiap entiti membawa feature_ts; apabila ketibaan boleh ketinggalan daripada peristiwa, saya juga menyimpan available_ts. Untuk (entity_id, label_ts), as-of join memilih versi terkini yang cap masanya tidak lewat daripada label_ts; apabila semantik produk memerlukan ketersediaan sebenar, saya juga memerlukan available_ts <= label_ts. Menggabungkan baris terkini secara terus adalah tidak selamat kerana ia membocorkan kemas kini masa hadapan ke dalam contoh sejarah.

Lapisan luar talian menyimpan sejarah penuh untuk latihan dan lapisan dalam talian menyimpan nilai semasa untuk inferens kependaman rendah, kedua-duanya didorong oleh definisi berversi yang sama. Peristiwa lewat mendarat di lapisan mentah dan mencetuskan pengiraan semula yang idempoten bagi tetingkap yang terjejas; snapshot model yang telah dikeluarkan kekal tidak boleh diubah dan hasilnya menjadi versi baharu. Saya mengesahkan invarian masa, kadar null, kesegaran, taburan dalam talian/luar talian, dan kesan model. Jika tiada keperluan penayangan kependaman rendah, saya akan meninggalkan lapisan dalam talian dan mengekalkan reka bentuk kelompok.

Kesilapan biasa

  • Kesilapan: menggabungkan baris ciri terkini → kemas kini masa hadapan memasuki contoh sejarah dan melambungkan metrik luar talian → gunakan as-of join mengikut entiti dan masa label.
  • Kesilapan: menyimpan masa peristiwa tetapi tidak menyimpan masa ketersediaan → sesuatu peristiwa boleh berlaku awal tetapi masih belum kelihatan semasa label berlaku → rekodkan available_ts apabila kependaman atau pengelompokan penting.
  • Kesilapan: menulis ganti sejarah ciri semasa backfill → model yang telah dikeluarkan menjadi mustahil untuk dihasilkan semula → cipta snapshot tidak boleh diubah yang berkuncikan kelompok input dan versi definisi.
  • Kesilapan: mengekalkan transformasi dalam talian dan luar talian yang berasingan → pengendalian null atau sempadan tetingkap menyimpang dan mewujudkan pencongan latihan-penayangan (training-serving skew) → kongsi definisi atau uji kedua-dua laluan dengan contoh emas (golden examples).

Susulan dan respons

Peristiwa ciri tiba selepas label, tetapi masa peristiwanya adalah lebih awal. Bolehkah latihan menggunakannya?

Bukan berdasarkan masa peristiwa sahaja. Jika penayangan dalam talian tidak dapat melihatnya pada masa label, syaratkan available_ts <= label_ts; jika tidak, latihan mensimulasikan maklumat yang tidak pernah dimiliki oleh laluan penayangan. Simpan kedua-dua cap masa dan pilih peraturan ketat atau longgar daripada kontrak produk.

Laluan dalam talian memerlukan ciri pada masa peristiwa yang lebih awal. Adakah cache nilai semasa mencukupi?

Tidak. Cache nilai semasa menjawab "terkini sekarang", bukan cap masa sejarah. Dedahkan sejarah bercap masa atau materialkan versi yang diperlukan sebelum permintaan; gunakan lapisan luar talian apabila bajet kependaman tidak dapat menyokong bacaan sejarah dalam talian.

Peristiwa lewat terus tiba. Bagaimana anda memastikan pengiraan semula kekal terbatas?

Gabungkan (coalesce) permintaan mengikut entiti, tetingkap masa, dan versi ciri, kemudian tetapkan imbas kembali maksimum dan keutamaan. Halakan peristiwa di luar tetingkap tersebut ke proses kelompok atau manual dan rekodkan versi model mana yang tidak dibina semula. Pantau baris yang terjejas, masa pengiraan semula, dan usia barisan dan bukannya mengejar semua sejarah selama-lamanya.

Sumber awam

Soalan berkaitan