HeadlinesBriefing HeadlinesBriefing 9 languages

How to Catch Data Drift When Every Feature Looks Normal

Towards Data Science ·

🇬🇧 English

A specific kind of quiet follows a good validation run. Numbers on the screen, AUC at 0.91, and everyone nodding along in the morning meeting because, for once, nobody had a reason to ask a follow-up question. Trust me, it's a good feeling.

But It's also one I've learned not to hold on to or trust so much. The model finally went live that Friday. Nothing dramatic about it, no war room, no late night.

Just a deploy that looked exactly like the dozen before it. By Tuesday, something had gone wrong in a way that took a while to even notice. Precision on flagged cases had quietly gotten worse, and nothing about that showed up as an error.

No crash, no alert, no red line on any dashboard anyone was actually watching. It just sat there getting worse, until a downstream team got tired of a review queue full of garbage flags and asked why. That's how it got found.

Not a system catching itself. A person, annoyed enough to go looking. And here's the part that still bugs me a little: nothing in the code had changed.

The model and the pipeline were exactly what they'd been the day before. What changed was the world underneath them. A new pricing tier had launched a few days earlier, and customers on it were transacting more often, at lower amounts each time.

I checked one feature at a time, and none of it looked wrong: transaction value sat in a normal range, and so did transaction frequency. It was only when I looked at the two together that the data clearly became something else, and there was no check anywhere in the pipeline built to catch that. I had already set up drift monitoring before this and I genuinely thought I was covered.

Well, it turned out I wasn't. The check I had was doing exactly what I'd asked it to do, watching every feature individually, just as I'd built it to, and it would have sat there reporting green through the entire thing. Which is a strange thing to sit with, honestly.

The monitoring wasn't broken. And it wasn't lazy or half-built either. It was just answering a narrower question than the one that actually mattered.

The part that goes wrong quietly That narrower question is the one most drift monitoring asks, mine included at the time. Has any single feature's distribution shifted? Take this week's values and training-time values, line them up as histograms, and get a number out. On paper, that's not a bad idea.

It's just an incomplete one. It works right up until the failure isn't in any single feature, but in how two features move together, and that's a much easier way for real data to break than most write-ups admit. The pricing tier thing is a clean example because nothing about it looks wrong in isolation.

Run PSI on avg_transaction_value alone, fine. Run it on num_transactions_30d alone, also fine. The relationship between the two flipped, and PSI, by design, never looks at two columns at once.

It can't. That's not a flaw in the metric so much as a boundary it was never built to cross. So the question becomes: how do you check a relationship instead of a distribution? Turns out the answer isn't some exotic statistics you have to go learn.

It's just asking a model to do the noticing for you. Let a classifier do the noticing The trick has a name, adversarial validation, and it makes it sound fancier than it is. Label your training rows 0, label a fresh batch of production rows 1, and train a classifier to tell them apart.

If the two batches are really drawn from the same distribution, it can't do better than guessing, AUC near 0.5. If it can separate them, something moved, and because the classifier gets every feature at once, it picks up exactly the kind of joi.

View original article →


🇸🇦 العربية

اكتشاف تحرك البيانات المخفي باستخدام التحقق العدوي

يحدث نوع معين من الهدوء بعد تشغيل تحقق جيد. الأرقام على الشاشة، AUC عند 0.91، وجميعهم يهتزون في الاجتماع الصباحي لأن، لمرة واحدة، لم يكن لدى أحد سبب لطرح سؤال متابعة. احترافي، إنه شعور جيد. لكنه أيضًا شيء تعلمت ألا أتمسك به أو أثق فيه كثيرًا. أخيرًا، تم نشر النموذج في ذلك الجمعة. لا شيء مثير للاهتمام في ذلك، لا غرفة حرب، لا ليالٍ لاحقة. فقط نشر بدا يبدو تمامًا مثل العشرة قبله. بحلول الثلاثاء، حدث شيء خطأ بطريقة استغرت وقتًا للانتباه إليه. دقة الحالات المعلمة انخفضت بشكل كبير، ولم يظهر أي شيء من ذلك كخطأ. لا انهيار، لا تنبيه، لا خط أحمر على أي لوحة قيامت يراقبها أحد. ببساطة كان هناك، يزداد سوءًا، حتى تعبت فريقًا لاحقًا من قائمة مراجعة مليئة بعلامات غير مفيدة وسأل لماذا. هكذا وُجد. ليس نظامًا يكتشف نفسه. شخص، منزعج بما يكفي للبحث. وهنا الجزء الذي لا يزال يزعجني قليلاً: لم يتغير أي شيء في الكود. النموذج والخط الفاصل كانا تمامًا مثل اليوم السابق. ما تغير هو العالم تحتهم. تم إطلاق مستوى تسعير جديد قبل بضعة أيام، وكان العملاء فيه يقومون بعمليات أكثر، بمبالغ أقل في كل مرة. فحصت ميزة واحدة في كل مرة، ولم يبدُ أي شيء خطأ: قيمة المعاملة كانت في نطاق طبيعي، وكذلك تكرار المعاملات. كان ذلك فقط عندما نظرت إلى الاثنين معًا أن البيانات بشكل واضح أصبحت شيئًا آخر، ولم يكن هناك أي فحص في الخط الفاصل لبناء للكتشاف عن ذلك. كنت قد أنشأت مراقبة انحراف مسبقًا وكنت بالفعل أعتقد أنني مغطى. حسنًا، أظهر ذلك أنني لم أكن. الفحص الذي كان لدي كان يفعل تمامًا ما طلبت منه أن يفعله، مراقبة كل ميزة بشكل منفرد، تمامًا كما بنيت له، وكان سيجلس هناك يبلغ عن الأخضر طوال العملية. وهذا أمر غريب للواقع. المراقبة لم تكن معطلة. ولم تكن كسلانة أو نصف منشأة أيضًا. كانت ببساطة تجيب على سؤال أضيق من السؤال الذي كان يهم حقًا. الجزء الذي يخطئ بصمت هذا السؤال الأضيق هو السؤال الذي يطرحه معظم مراقبة الانحراف، بما في ذلك مراقبتي في ذلك الوقت. هل تغير توزيع أي ميزة واحدة؟ خذ قيم هذا الأسبوع وقيم التدريب، ضعها في شكل مقارن، واحصل على رقم. على الورق، هذه ليست فكرة سيئة. إنها مجرد غير مكتملة. تعمل جيدًا حتى يصبح الفشل غير في أي ميزة واحدة، بل في كيفية تحرك ميزتين معًا، وهذا طريقة أسهل بكثير للبيانات الحقيقية للانكسار مما تعترف به معظم التقارير. مثال مستوى التسعير هو مثال نظيف لأنه لا شيء في ذلك يبدو خطأ في العزل. شغل PSI على avg_transaction_value وحده، جيد. شغل PSI على num_transactions_30d وحده، أيضًا جيد. العلاقة بينهما انقلبت، وPSI، بتصميمها، لا تنظر عمودين في وقت واحد. لا يمكنها. هذا ليس عيبًا في المقياس مقدقدًا بقدر ما هو حد لم يتم بناؤه لعبوره. إذن الأسئلة تصبح: كيف تتحقق من علاقة بدلاً من توزيع؟ يبدو أن الإجابة ليست إحصاءات غريبة تحتاج إلى تعلمها. إنها مجرد طلب من نموذج أن يلاحظ ذلك نيابةً عنك. دع مصنفًا يلاحظ. الخدعة لها اسم، التحقق العدوي، وهو يجعلك تبدو أكثر ذكاءً مما هو. ضع صفوف التدريب على 0، وضع دفعة طازجة من صفوف الإنتاج على 1، وتدرب مصنفًا للتمييز بينهما. إذا كانت المجموعتان حقًا مستخلصة من نفس التوزيع، لا يمكنه أن يفعل أفضل من التخمين، AUC قريب من 0.5. إذا كان بإمكانه فصلهما، فهذا يعني أن شيئًا تحرك، وبما أن المصنف يحصل على جميع الميزات في وقت واحد، فهو يلتقط تمامًا نوع التغيير المشترك.

ما هو التحقق العدوي؟

التحقق العدوي هو تقنية حيث تضع صفوف التدريب على 0 ودفعة طازجة من صفوف الإنتاج على 1، ثم تدرب مصنفًا للتمييز بينهما. إذا كان AUC قريبًا من 0.5، فهذا يعني أن التوزيعات متماثلة. إذا كان بإمكان المصنف فصهما، فهذا يعني أن شيئًا تحرك في البيانات.

العربية version →


🇧🇩 বাংলা

এডভার্সারিয়াল ভ্যালিডেশন দিয়ে লুকানো ডেটা ড্রিফ্ট শনাক্ত করুন

একটি নির্দিষ্ট ধরনের নিঃশব্দ একটি ভাল ভ্যালিডেশন রানের পরে আসে। স্ক্রিনে নম্বর, AUC 0.91, এবং সকালের বৈঠকে সবাই মতপ্রকাশ দেয় কারণ, একবারের জন্য, কাউকে একটি অনুসরণীয় প্রশ্ন জিজ্ঞাসা করার মতো কোনও কারণ ছিল না। আমাকে বিশ্বাস করুন, এটি একটি ভালো অনুভূতি। কিন্তু এটিও এমন একটি জিনিস যা আমি শিখেছি যে আমি এটি ধরে রাখতে বা খুব বেশি বিশ্বাস করতে পারি না। মডেলটি অবশেষে সেই শুক্রবারে লাইভ হয়ে গিয়েছিল। তার কোনো উত্তেজনা ছিল না, কোনো যুদ্ধ কক্ষ ছিল না, কোনো দেরি রাত ছিল না। শুধুমাত্র একটি ডিপ্লয় যা ঠিক পূর্বের দশটির মতো দেখাচ্ছিল। মঙ্গলবার পর্যন্ত, কিছু ভুল হয়ে গিয়েছিল একটি এমন পদ্ধতিতে যা দ্রষ্টব্য করতে বেশি সময় নিয়েছিল। চিহ্নিত কেসেগুলিতে সঠিকতা চুপিচাপ খারাপ হয়ে গিয়েছিল, এবং তার কোনো প্রকাশ একটি ত্রুটি হিসাবে। কোনও ক্র্যাশ ছিল না, কোনও সতর্কতা ছিল না, কোনও লাল রেখা কোনও ড্যাশবোর্ডে যে কেউ সত্যিই দেখছিল না। এটি শুধু খারাপ হতে থাকা, যতক্ষণ পর্যন্ত একটি ডাউনস্ট্রিম টিম একটি পর্যালনা তালিকায় অপ্রয়োজনীয় ফ্ল্যাগগুলির পূর্ণ তালিকায় ক্লান্ত হয় এবং কেন জিজ্ঞাসা করে। এটিই হল এটি কীভাবে পাওয়া গেছে। একটি সিস্টেম নিজেকে ধরে না। একজন ব্যক্তি, যে যথেষ্ট বিরক্ত যে খুঁজতে যায়। আর এখানে আছে যে অংশ যা আজও আমাকে কিছুটা বিরক্ত করে: কোডে কোনও পরিবর্তন হয়নি। মডেল এবং পাইপলাইন ঠিক পূর্বের দিনের মতো ছিল। যা পরিবর্তিত হয়েছিল তা ছিল তাদের নিচের পৃথিবী। একটি নতুন মূল্য নির্ধারণ শ্রেণী কয়েক দিন আগে চালু করা হয়েছিল, এবং এটিতে গ্রাহকরা বেশিরভাগে লেনদেন করছিল, প্রতি বার কম পরিমাণে। আমি একটি ফিচার একটি বার পরীক্ষা করেছি, এবং কোনও জিনিসটি ভুল মনে হয়নি: লেনদেনের মূল্য স্বাভাবিক পরিসীমায় ছিল, এবং লেনদেনের ফ্রিকোয়েন্সির মতোই ছিল। এটিই ছিল যখন আমি দুটিকে একসাথে দেখলাম যে ডেটাটি স্পষ্টভাবে আর একটি জিনিস হয়ে উঠলো, এবং পাইপলাইনে কোনও যাচাইকরণ ছিল না যা এটি ধরতে নির্মিত হয়েছিল। আমি আগের চেয়ে ড্রিফ্ট মনিটরিং সেট করে দিয়েছিলাম এবং আমি সত্যিই মনে করতাম যে আমি কভার্ড আছি। ভালো, ফলে মনে হয়েছিল যে আমি ছিলাম না। যে যাচাইকরণ আমি করেছিলাম ঠিক সেই কাজটিকরছিল যা আমি এটি করতে বলেছিলাম, প্রতিটি ফিচার আলাদাভাবে পর্যবেক্ষণ করা, ঠিক সেভাবে যেমন আমি এটি নির্মাণ করেছিলাম, এবং এটি সম্পূর্ণ প্রক্রিয়াজনক সবুজ রিপোর্ট করতে বসে থাকবে। যা সত্যিই একটি আশ্চর্যজনক ব্যাপার। মনিটরিংটি ভাঙা ছিল না। আর এটি আলস্য বা অর্ধেক নির্মিতও ছিল না। এটি শুধু মাত্র একটি সাধারণ প্রশ্নের জবাব দিচ্ছিল যা সত্যিই গুরুত্বপূর্ণ ছিল। যে অংশটি চুপিচাপ ভুল যায় সে অংশটি যে সাধারণ প্রশ্নটি যা অধিকাংশ ড্রিফ্ট মনিটরিং জিজ্ঞাসা করে, যার মধ্যে আমারও সময় ছিল। কি একটি একক ফিচারের বিতরণ সরিয়ে গেছে? এই সপ্তাহের মান এবং প্রশিক্ষণ সময়ের মান নিন, তাদের হিস্টোগ্রাম হিসাবে সাজিয়ে এবং একটি নম্বর পান। কাগজে, এটি একটি খারাপ ধারণা নয়। এটি শুধু অধুরা। এটি কাজ করে যতক্ষণ পর্যন্ত ব্যর্থতা কোনও একক ফিচারে নয়, বরং দুটি ফিচার কীভাবে একসাথে চলে তাতে, এবং এটি বাস্তব ডেটার জন্য ভাঙতে একটি অনেক আরামদায়ক পদ্ধতি যা অধিকাংশ রিপোর্ট আত্মস্বীকৃতি করে। মূল্য নির্ধারণ শ্রেণীর ব্যাপারটি একটি পরিষ্কার উদাহরণ কারণ এটি আলাদাভাবে ভুল মনে হয় না। avg_transaction_value-এ PSI চালান, ভালো। num_transactions_30d-এ PSI চালান, সেটাও ভালো। দুটির মধ্যে সম্পর্কটি উল্টো হয়ে গিয়েছিল, এবং PSI, ডিজাইনের মাধ্যমে, কখনো দুটি কলাম একসাথে দেখে না। এটি করতে পারে না। এটি মেট্রিকের একটি ত্রুটি নয় এতটাই যে এটি কখনো পার হওয়ার জন্য নির্মিত হয়নি। তাই প্রশ্নটি হয়ে ওঠে: আপনি কিভাবে একটি সম্পর্ক যাচাই করবেন একটি বিতরণ নয়? ফলে মনে হয় যে উত্তরটি কোনও বিদ্যমান পরিসংখ্যান নয় যা আপনাকে শিখতে হবে। এটি শুধু মাত্র একটি মডেলকে আপনার পরিবর্তে লক্ষ্য করতে বলা। একটি ক্লাসিফায়ারকে লক্ষ্য করতে দিন। এই ট্রিকটির একটি নাম আছে, এডভার্সারিয়াল ভ্যালিডেশন, এবং এটি আপনাকে আরও উন্নত মনে করে। আপনার প্রশিক্ষণ পাতিরোকম লাইনগুলিকে 0 লেবেল করুন, একটি তাজা উৎপাদন লাইনগুলিকে 1 লেবেল করুন, এবং একটি ক্লাসিফায়ারকে তাদের থেকে আলাদা করতে প্রশিক্ষণ দিন। যদি দুটি ব্যাচ সত্যিই একই বিতরণ থেকে আসে, তবে এটি ভালো অনুমান করতে পারে না, AUC 0.5 কাছাকাছি। যদি এটি তাদের আলাদা করতে পারে, তবে কিছু সরিয়ে গেছে, এবং কারণ ক্লাসিফায়ার সব ফিচার একসাথে পায়, তাই এটি ঠিক সেই ধরনের সম্পর্কিত পরিবর্তনটি ধরে।

এডভার্সারিয়াল ভ্যালিডেশন কী?

এডভার্সারিয়াল ভ্যালিডেশন একটি কৌশল যেখানে আপনি প্রশিক্ষণ পাতিরোকম লাইনগুলিকে 0 লেবেল করুন এবং একটি তাজা উৎপাদন পাতিরোকম লাইনগুলিকে 1 লেবেল করুন, তারপর একটি ক্লাসিফায়ারকে তাদের থেকে আলাদা করতে প্রশিক্ষণ দিন। যদি AUC 0.5 কাছাকাছি হয়, তবে বিতরণগুলি সমান। যদি ক্লাসিফায়ার তাদের আলাদা করতে পারে, তবে ডেটায় কিছু সরিয়ে গেছে।

বাংলা version →


🇪🇸 Español

Detecta Desviaciones Ocultas en los Datos con Validación Adversarial

Una especie de silencio tranquilo sigue a una buena corrida de validación. Los números en la pantalla, AUC en 0.91, y todos asintiendo en la reunión matinal porque, por fin, nadie tenía razón para preguntar algo más. Créeme, es una buena sensación.

Pero también es algo que he aprendido no aferrarme tanto ni confiar demasiado. El modelo finalmente fue puesto en vivo ese viernes. Nada dramático al respecto, sin sala de guerra, sin noches en vela.

Solo un despliegue que se veía exactamente igual que la docena anterior. Para el martes, algo había salido mal de una manera que tomó un tiempo en ser notada. La precisión en los casos marcados había empeorado silenciosamente, y nada de eso apareció como un error.

Sin caídas, sin alertas, sin una línea roja en ningún panel que alguien estuviera realmente observando. Solo estaba ahí empeorando, hasta que un equipo downstream se cansó de una cola de revisiones llena de marcas inútiles y preguntó por qué. Así es como se descubrió.

No un sistema que se detecta a sí mismo. Una persona, lo suficientemente molesta como para ir a buscarlo. Y aquí está la parte que aún me molesta un poco: nada en el código había cambiado.

El modelo y el pipeline eran exactamente los mismos que el día anterior. Lo que cambió fue el mundo debajo de ellos. Un nuevo nivel de precios se había lanzado unos días antes, y los clientes en él estaban transfiriendo más a menudo, con montos menores cada vez.

Revisé una característica a la vez, y nada parecía mal: el valor de la transacción estaba en un rango normal, y también lo estaba la frecuencia de transacciones. Solo cuando las miré juntas es que los datos claramente se convirtieron en algo diferente, y no había ninguna verificación en el pipeline construida para detectar eso. Ya había configurado monitoreo de deriva antes de esto y realmente creía que estaba cubierto.

Bueno, resultó que no lo estaba. La verificación que tenía hacía exactamente lo que le había pedido, observando cada característica individualmente, tal como la había construido, y habría estado allí reportando verde durante toda la situación. Lo cual es una cosa extraña de asimilar, honestamente.

El monitoreo no estaba roto. Ni siquiera era perezoso ni parcialmente construido. Solo estaba respondiendo una pregunta más estrecha que la que realmente importaba.

La parte que falla silenciosamente esa pregunta más estrecha es la que la mayoría de los monitoreos de deriva preguntan, incluyendo el mío en ese momento. ¿Alguna característica individual ha cambiado su distribución? Toma los valores de esta semana y los valores de entrenamiento, alinearlos como histogramas, y saca un número. En teoría, no es una mala idea. Solo es incompleta.

Funciona hasta que el fallo no está en ninguna característica individual, sino en cómo dos características se mueven juntas, y es una forma mucho más fácil de romperse para los datos reales de lo que la mayoría de los informes admiten. La cosa del nivel de precios es un ejemplo limpio porque nada de eso se ve mal en aislamiento. Ejecuta PSI sobre avg_transaction_value solo, bien.

Ejecuta PSI sobre num_transactions_30d solo, también bien. La relación entre las dos se invirtió, y PSI, por diseño, nunca mira dos columnas a la vez. No puede.

Eso no es un defecto en la métrica tanto como un límite que nunca fue construido para cruzar. Entonces la pregunta se convierte en: ¿cómo verificas una relación en lugar de una distribución? Resulta que la respuesta no es alguna estadística exótica que tengas que ir a aprender. Es simplemente pedirle a un modelo que te avise.

Deja que un clasificador haga el aviso. El truco tiene un nombre, validación adversarial, y suena más sofisticado de lo que es. Etiqueta las filas de entrenamiento como 0, etiqueta un lote fresco de filas de producción como 1, y entrena un clasificador para distinguirlas.

Si los dos lotes realmente provienen de la misma distribución, no puede hacerlo mejor que adivinando, AUC cerca de 0.5. Si puede separarlos, algo se movió, y porque el clasificador recibe todas las características a la vez, detecta exactamente el tipo de cambio conjunto.

¿Qué es la validación adversarial?

La validación adversarial es una técnica donde etiquetas las filas de entrenamiento como 0 y un lote fresco de filas de producción como 1, luego entrenas un clasificador para distinguirlas. Si el AUC está cerca de 0.5, las distribuciones son similares. Si el clasificador puede separarlas, algo se movió en los datos.

Español version →


🇫🇷 Français

Détecter les dérives de données cachées avec la validation adversarial

Un certain type de calme suit une bonne exécution de validation. Les chiffres à l'écran, AUC à 0.91, et tout le monde hoche la tête lors de la réunion matinale parce que, pour une fois, personne n'avait de raison de poser une question de suivi. Faites-moi confiance, c'est une bonne sensation.

Mais c'est aussi quelque chose que j'ai appris à ne pas saisir ou faire trop confiance. Le modèle est enfin mis en ligne ce vendredi. Rien de dramatique à ce sujet, pas de salle de guerre, pas de nuits blanches.

Juste un déploiement qui ressemait exactement à la dizaine précédente. D'ici mardi, quelque chose s'était mal passé d'une manière qui a mis du temps à être remarquée. La précision sur les cas signalés s'était discrètement aggravée, et rien de cela n'est apparu comme une erreur.

Pas de plantage, pas d'alerte, pas de ligne rouge sur aucun tableau de bord que quelqu'un regardait vraiment. Il était simplement là, devenant pire, jusqu'à ce qu'une équipe en aval se fatigue avec une file d'attente de révision remplie de drapeaux inutiles et demande pourquoi. C'est ainsi qu'il a été trouvé.

Pas un système qui se détecte lui-même. Une personne, assez irritée pour aller chercher. Et voici la partie qui me dérange encore un peu : rien dans le code n'avait changé.

Le modèle et le pipeline étaient exactement les mêmes qu'la veille. Ce qui avait changé, c'était le monde en dessous. Un nouveau niveau de tarification avait été lancé quelques jours plus tôt, et les clients sur celui-ci effectuaient des transactions plus souvent, avec des montants plus faibles à chaque fois.

J'ai vérifié une fonction à la fois, et rien ne semblait faux : la valeur de la transaction était dans une plage normale, et il en allait de même pour la fréquence des transactions. Ce n'est qu'au moment où je les ai regardées ensemble que les données sont clairement devenues quelque chose d'autre, et il n'y avait aucun contrôle dans le pipeline conçu pour attraper cela. J'avais déjà mis en place une surveillance de dérive avant cela et je pensais vraiment être couvert.

Eh bien, il s'est avéré que je ne l'étais pas. Le contrôle que j'avais faisait exactement ce que je lui avais demandé de faire, en surveillant chaque fonction individuellement, exactement comme je l'avais construit, et il aurait été là, signalant vert pendant toute la durée. Ce qui est assez étrange, honnêtement.

La surveillance n'était pas cassée. Et elle n'était pas paresseuse ou mal construite non plus. Elle répondait simplement à une question plus étroite que celle qui importait vraiment.

La partie qui se passe mal en silence. Cette question plus étroite est celle que la plupart des surveillances de dérive posent, y compris la mienne à l'époque. La distribution d'une seule fonction s'est-elle déplacée ? Prenez les valeurs de cette semaine et les valeurs de l'entraînement, alignez-les sous forme d'histogrammes, et obtenez un nombre.

Sur papier, ce n'est pas une mauvaise idée. C'est juste incomplet. Il fonctionne jusqu'au moment où l'échec n'est pas dans une seule fonction, mais dans la manière dont deux fonctions se déplacent ensemble, et c'est une manière beaucoup plus facile pour les données réelles de se casser que la plupart des rapports admettent.

L'affaire du niveau de tarification est un exemple propre parce que rien de cela ne semble faux isolément. Exécutez PSI sur avg_transaction_value seul, correct. Exécutez-le sur num_transactions_30d seul, également correct.

La relation entre les deux s'est inversée, et PSI, par conception, ne regarde jamais deux colonnes à la fois. Il ne peut pas. Ce n'est pas un défaut de la mesure autant que c'est une limite qu'elle n'a jamais été conçue pour franchir.

Alors la question devient : comment vérifier une relation au lieu d'une distribution ? Il s'avère que la réponse n'est pas une statistique exotique que vous devez apprendre. C'est simplement demander à un modèle de le remarquer pour vous. Laissez un classifieur faire le remarquer.

L'astuce a un nom, validation adversarial, et ça sonne plus sophistiqué qu'il n'en est. Étiquetez vos lignes d'entraînement 0, étiquetez un lot frais de lignes de production 1, et entraînez un classifieur pour les distinguer. Si les deux lots proviennent vraiment de la même distribution, il ne peut pas faire mieux que de deviner, AUC près de 0.5. S'il peut les séparer, quelque chose s'est déplacé, et parce que le classifieur reçoit toutes les fonctions à la fois, il détecte exactement le type de changement conjoint.

Qu'est-ce que la validation adversarial ?

La validation adversarial est une technique où vous étiquetez les lignes d'entraînement 0 et un lot frais de lignes de production 1, puis entraînez un classifieur pour les distinguer. Si l'AUC est proche de 0.5, les distributions sont similaires. Si le classifieur peut les séparer, quelque chose s'est déplacé dans les données.

Français version →


🇮🇳 हिन्दी

एडवर्सरियल वैधीकरण के साथ छिपे डेटा ड्रिफ्ट का पता लगाएं

एक विशिष्ट प्रकार की शांति एक अच्छे वैधीकरण रन के बाद आती है। स्क्रीन पर नंबर, AUC 0.91 पर, और सभी सुबह की मीटिंग में सहमति दर्शाते हैं क्योंकि, एक बार के लिए, किसी के पास एक follow-up सवाल पूछने का कोई कारण नहीं था। मुझे भरोसा रखें, यह एक अच्छा महसूस होता है। लेकिन इसे भी एक ऐसा चीज़ है जिसे मैंने सीख लिया है कि उसे पकड़ना या इतना भरोसा न करना चाहिए। मॉडल अंततः उस शुक्रवार को लाइव हो गया। इसके बारे में कुछ भी नहीं था, कोई युद्ध कक्ष नहीं, कोई देर रात नहीं। बस एक डिप्लॉई जो पिछले दो दर्जन में से एक की तरह दिख रहा था। मंगलवार तक, कुछ गलत हो गया था एक ऐसे तरीके से जिसे पहचानने में कई दिन लग गए। फ्लैग्ड केसेज़ पर सटीकता धीरे धीरे बुरी हो गई थी, और इसके बारे में कोई चीज़ एरर के रूप में नहीं दिखी। कोई क्रैश नहीं, कोई अलर्ट नहीं, कोई भी नियंत्रक पर रेड लाइन नहीं जो कोई व्यक्ति वाकई देख रहा था। यह बस वहीं खड़ा रहा और बुरा होता गया, जब तक कि एक downstream टीम एक समीक्षा कतार में गैरेज़ फ़्लैग्स की एक भरपूर मात्रा में थक गई और पूछने लगी कि क्यों। यही है कि इसे कैसे पाया गया। एक सिस्टम ने खुद को नहीं पकड़ा। एक व्यक्ति, इतनी नाराज़ हो गई कि वह खुद ढूंढने लगी। और यहाँ वही हिस्सा है जो अभी भी मुझे थोड़ा परेशान करता है: कोड में कुछ भी नहीं बदला था। मॉडल और पाइपलाइन वही थे जो वह दिन पहले थे। जो बदला वह उनके नीचे वाला दुनिया था। एक नई मूल्य निर्धारण श्रेणी कुछ दिन पहले लॉन्च हुई थी, और उस पर ग्राहक अधिक बार अपने साथ ले जा रहे थे, हर बार कम मात्रा में। मैंने एक फीचर के बारे में जाँचा, और कोई चीज़ गलत नहीं दिखी: लेन-देन का मूल्य सामान्य सीमा में था, और उसी तरह से लेन-देन की आवृत्ति थी। यहीं तक सब ठीक था, जब मैंने दोनों को एक साथ देखा तो डेटा स्पष्ट रूप से कुछ अलग बन गया था, और पाइपलाइन में कोई जाँच नहीं थी जो इसे पकड़ सके। मैंने पहले ही ड्रिफ्ट मॉनिटरिंग सेट कर दी थी और मैं वाकई ही लगा था कि मैं कवर्ड पर हूँ। ख़रा मिला, मैं नहीं था। जो जाँच मैंने की थी वह बिल्कुल वही कर रही थी जो मैंने उसे कहा था, हर फीचर की जाँच करना, बिल्कुल वही जैसा मैंने इसे बनाया था, और यह पूरे समय में हरे रंग की रिपोर्ट देती रहेगी। ईमानदारी से कहूँ तो, यह एक अजीब बात है कि इसे स्वीकार करना पड़ेगा। मॉनिटरिंग खराब नहीं था। और यह न तो आलसी था और न ही आधा बना था। यह बस एक ऐसे सवाल का जवाब दे रहा था जो वह वाकई माँगता था उससे ज्यादा संकीर्ण था। वही हिस्सा जो चुपके से गलत हो जाता है वही है जो अधिकांश ड्रिफ्ट मॉनिटरिंग पूछता है, इसमें मेरा भी समय शामिल है। क्या किसी एकल फीचर का वितरण बदल गया है? इस सप्ताह के मान और प्रशिक्षण समय के मान ले, उन्हें हिस्टोग्राम के रूप में संरेखित करें, और एक नंबर निकालें। कागज़ पर, यह एक बुरा विचार नहीं है। यह सिर्फ अधूरा है। यह तब तक काम करता है जब तक कि विफलता किसी एकल फीचर में नहीं होती, बल्कि दो फीचर के साथ मिलकर कैसे चलते हैं, और यह एक ऐसा तरीका है जिससे वास्तविक डेटा आम तौर पर लिखित रिपोर्टों की तुलना में आसानी से बिगड़ता है। मूल्य निर्धारण श्रेणी की बात एक साफ़ उदाहरण है क्योंकि इसके बारे में कुछ भी गलत नहीं दिखता। avg_transaction_value के साथ PSI चलाएं, ठीक है। num_transactions_30d के साथ PSI चलाएं, भी ठीक है। दोनों के बीच का संबंध उल्टा हो गया, और PSI, डिज़ाइन के अनुसार, कभी दो कॉलम एक साथ नहीं देखता। यह नहीं कर सकता। यह मेट्रिक की एक कमी नहीं है, बल्कि एक सीमा है जिसे कभी पार नहीं किया गया था। इसलिए प्रश्न यह हो जाता है: आप एक वितरण की जाँच कैसे करेंगे एक संबंध की नहीं? पता चलता है कि जवाब कोई अजीब सांखड़िकी नहीं है जिसे आपको सीखना पड़े। यह बस यह है कि आप एक मॉडल को आपके लिए ध्यान देने के लिए कहें। एक क्लासिफ़ायर को ध्यान देने दें। इस तकनीक का एक नाम है, एडवर्सरियल वैधीकरण, और यह इसे जितना बड़ा दिखाता है उससे ज्यादा नहीं है। अपनी प्रशिक्षण पंक्तियों को 0 लेबल करें, एक ताज़ा उत्पादन पंक्तियों को 1 लेबल करें, और एक क्लासिफ़ायर को अलग करने के लिए प्रशिक्षित करें। अगर दोनों बैच वाकई से एक ही वितरण से निकले हैं, तो वह बेहतर नहीं कर सकता जो भी अनुमान लगा सकता है, AUC 0.5 के करीब। अगर वह उन्हें अलग कर सकता है, तो कुछ हिल गया है, और क्योंकि क्लासिफ़ायर को एक साथ सभी फीचर मिल जाते हैं, इसलिए वह ठीक उसी प्रकार के संयुक्त परिवर्तन को पकड़ लेता है।

एडवर्सरियल वैधीकरण क्या है?

एडवर्सरियल वैधीकरण एक ऐसा तकनीक है जिसमें आप प्रशिक्षण पंक्तियों को 0 लेबल करते हैं और एक ताज़ा उत्पादन पंक्तियों को 1 लेबल करते हैं, फिर एक क्लासिफ़ायर को अलग करने के लिए प्रशिक्षित करते हैं। अगर AUC 0.5 के करीब है, तो वितरण समान हैं। अगर क्लासिफ़ायर उन्हें अलग कर सकता है, तो डेटा में कुछ बदल गया है।

हिन्दी version →


🇧🇷 Português

Detectar Deriva de Dados Oculta com Validação Adversarial

Um tipo específico de silêncio segue uma boa execução de validação. Números na tela, AUC em 0.91, e todos assentindo na reunião matinal porque, por uma vez, ninguém tinha razão para perguntar algo a mais. Acredite em mim, é uma boa sensação.

Mas também é algo que aprendi a não agarrar ou confiar muito. O modelo finalmente foi colocado no ar naquela sexta-feira. Nada dramático sobre isso, sem sala de guerra, sem noites de madrugada.

Apenas um deploy que parecia exatamente igual à dúzia anterior. Na terça-feira, algo havia dado errado de uma forma que levou um tempo para perceber. A precisão nos casos marcados havia piorado silenciosamente, e nada disso apareceu como um erro.

Sem travamento, sem alerta, sem uma linha vermelha em qualquer painel que alguém estivesse realmente observando. Ele apenas ficou lá ficando pior, até que uma equipe downstream se cansou de uma fila de revisão cheia de marcas inúteis e perguntou por quê. É assim que foi encontrado. Não um sistema que se detecta.

Uma pessoa, irritada o suficiente para procurar. E aqui está a parte que ainda me incomoda um pouco: nada no código havia mudado. O modelo e o pipeline eram exatamente os mesmos do dia anterior.

O que mudou foi o mundo debaixo deles. Um novo nível de preços havia sido lançado alguns dias antes, e os clientes nele estavam transacionando mais frequentemente, com valores menores a cada vez. Verifiquei uma característica de cada vez, e nada parecia errado: o valor da transação estava em uma faixa normal, e também a frequência de transações.

Foi apenas quando olhei para os dois juntos que os dados claramente se tornaram algo diferente, e não havia nenhuma verificação no pipeline construída para detectar isso. Já havia configurado monitoramento de deriva antes disso e eu realmente acreditava que estava coberto. Bem, resultou que eu não estava.

A verificação que eu tinha fazia exatamente o que eu pedi para ela fazer, observando cada característica individualmente, exatamente como eu a construí, e ela teria ficado lá relatando verde durante todo o processo. O que é uma coisa estranha de assumir, honestamente. O monitoramento não estava quebrado.

E não era preguiçoso ou mal construído também. Estava apenas respondendo uma pergunta mais estreita do que a que realmente importava. A parte que dá errado silenciosamente.

Essa pergunta mais estreita é a que a maioria dos monitoramentos de deriva pergunta, incluindo o meu na época. A distribuição de alguma característica individual mudou? Pegue os valores desta semana e os valores de treinamento, alinhe-os como histogramas, e tire um número. No papel, isso não é uma má ideia. É apenas uma incompleta.

Funciona até que a falha não esteja em nenhuma característica individual, mas em como duas características se movem juntas, e essa é uma forma muito mais fácil de quebrar dados reais do que a maioria dos relatórios admite. A coisa do nível de preços é um exemplo limpo porque nada disso parece errado isoladamente. Execute PSI sobre avg_transaction_value sozinho, tudo bem.

Execute sobre num_transactions_30d sozinho, também tudo bem. A relação entre os dois se inverteu, e PSI, por design, nunca olha duas colunas de uma só vez. Não pode.

Isso não é um defeito na métrica tanto quanto um limite que nunca foi construído para ultrapassar. Então a pergunta se torna: como você verifica uma relação em vez de uma distribuição? Acontece que a resposta não é alguma estatística exótica que você precisa aprender. É apenas pedir a um modelo para notar por você. Deixe um classificador notar.

O truque tem um nome, validação adversarial, e soa mais sofisticado do que é. Rotule suas linhas de treinamento como 0, rotule um lote fresco de linhas de produção como 1, e treine um classificador para distingui-los. Se os dois lotes realmente vierem da mesma distribuição, ele não pode fazer melhor do que adivinhar, AUC próximo de 0.5.

Se ele pode separá-los, algo se moveu, e porque o classificador recebe todas as características de uma só vez, ele pega exatamente o tipo de mudança conjunta.

O que é validação adversarial?

A validação adversarial é uma técnica onde você rotula as linhas de treinamento como 0 e um lote fresco de linhas de produção como 1, então treina um classificador para distingui-los. Se o AUC está próximo de 0.5, as distribuições são similares. Se o classificador pode separá-los, algo se moveu nos dados.

Português version →


🇷🇺 Русский

Обнаружение скрытого дрейфа данных с помощью адверсариальной валидации

Определенный тип тишины следует за хорошим запуском проверки. Числа на экране, AUC на 0.91, и все кивают в утреннем совещании, потому что, наконец, никто не имел причин задавать вопросы. Доверьте мне, это хорошее чувство. Но это также то, чему я научился не цепиться и не доверять слишком сильно. Модель наконец-то вышла в продакшен в пятницу. Ничего драматичного в этом нет, нет комнаты для боя, нет ночей в обед. Просто развертывание, которое выглядело точно так же, как и двенадцать предыдущих. К вторнику что-то пошло не так, и это заметили не сразу. Точность по помеченным случаям тихо ухудшилась, и ничего из этого не отобразилось как ошибка. Никакого краха, никаких оповещений, никакой красной линии на любой доске, которую кто-либо действительно смотрел. Оно просто сидело там и ухудшалось, пока команда downstream не

Русский version →


🇨🇳 简体中文

通过对抗验证检测隐藏的数据漂移

一段良好的验证运行后总会伴随着一种静谧的氛围。屏幕上显示的数字,AUC达到0.91,在早上的会议上所有人都点头称是,因为这一次,没人有理由提出后续问题。相信我,这是一种很好的感觉。但我也学会了不要太过依赖或信任它。模型终于在那个星期五上线了。没什么戏剧性,不需要战情室,也不用熬夜。就像之前的十几个部署一样,看起来毫无不同。到了星期二,事情出错了,但这种错误隐藏得很深,甚至很难被察觉。被标记案例的精确度悄悄下降了,但这并没有显示为任何错误。没有崩溃,没有警报,没有任何人真正关注的仪表盘上的红线。它就那样静静地变得更糟,直到有一个下游团队因为审查队列中充满了无用的标记而烦躁不安,终于问了起来。这就是它被发现的方式。不是系统自我检测,而是一个足够 annoyed 的人主动去寻找。而这部分仍然让我感到困扰:代码中什么都没改变。模型和管道与前天完全一样。改变的是它们下面的世界。几天前刚刚推出了一个新的定价层,处于该层的客户交易更频繁,每次交易金额较低。我逐一检查了一个个特征,都没看出什么问题:交易金额处于正常范围,交易频率也一样。只有当我把这两个放在一起看时,数据才清晰地变成了另外一种形式,而管道中并没有任何检查能够捕捉到这种情况。我之前已经设置了漂移监控,并且我真的以为我已经做到了万无漏洞。可事实证明,我并没有。我所设置的检查正好按照我要求它的那样工作,逐一监控每个特征,就像我设计的那样,它会在整个过程中报告绿色。说实话,这是一件令人难以接受的事情。监控并没有坏。也不是懒惰或不完整的。它只是回答了一个比实际重要的问题还要狭窄的问题。悄悄出错的那部分就是这个 narrower 问题,包括我当时在内的大多数漂移监控都在问的那个问题。某个单一特征的分布是否发生了偏移?把本周的值和训练时的值放在一起,画成直方图,然后得出一个数字。在纸上看,这并不是一个坏主意。只是不完整。它在一定程度上是有效的,直到失败不在于任何单一特征,而在于两个特征如何一起变化,这是一种比大多数报告所承认的更容易出现的数据破坏方式。定价层的例子非常典型,因为它在孤立状态下看起来一点也不错。单独对 avg_transaction_value 运行 PSI,没问题。单独对 num_transactions_30d 运行 PSI,也没问题。这两个之间的关系发生了反转,而 PSI 本质上从来不会同时查看两列。它不能。这不是指标本身的缺陷,而是它从未被设计用来跨越的边界。因此问题就变成了:如何检查一个关系而不是一个分布?答案并不是什么稀奇古怪的统计方法,你还需要去学习。它只是让一个模型帮你注意到这一点。让一个分类器去注意到的技巧有一个名字,叫做对抗验证,它听起来比实际更高级。将训练行标记为 0,将一批新的生产行标记为 1,然后训练一个分类器来区分它们。如果这两批数据确实来自相同的分布,那么它无法做得比猜测更好,AUC接近0.5。如果它能将它们分开,说明某些东西发生了变化,因为分类器同时获得了所有特征,因此它能够捕捉到恰好是这种类型的联合变化。

什么是对抗验证?

对抗验证是一种技术,你将训练行标记为0,一批新的生产行标记为1,然后训练一个分类器来区分它们。如果AUC接近0.5,分布是相似的。如果分类器能够将它们分开,说明数据中发生了变化。

简体中文 version →