"لقد تأهلت أنا وأصدقائي مؤخرًا للنهائي من لعبة Data Science لعام 2017. الجزء الأول من المسابقة كان Kaggle مع مجموعة بيانات من Deezer (1). تتمثل المشكلة في حل مشكلة التصنيف الثنائي: كان من الضروري التنبؤ بما إذا كان المستخدم سينتقل إلى الاستماع إلى التركيبة المعروضة له.
مثل الفرق الأخرى ، قمنا باستخراج الميزات ذات الصلة وقمنا بتدريب مصنف XGBoost (2). ومع ذلك ، فقد فعلنا شيئًا مميزًا ، وهو عينة فرعية من مجموعة بيانات التدريب ، بحيث أصبحت (مجموعة بيانات التدريب) أكثر تمثيلاً لمجموعة الاختبار ".
أحد المتطلبات الأساسية لعملية التعلم للتشغيل الناجح لنموذج الآلة هو نفس طبيعة التوزيعات في مجموعات بيانات التدريب والاختبار. كمثال تقريبي: يتم تدريب النموذج على المستخدمين الذين تبلغ أعمارهم 20 عامًا ، وفي عينة الاختبار ، يبلغ عمر المستخدمين أكثر من 60 عامًا.
من الطبيعي حدسيًا هنا أنه مع العمر الذي لم يتم فيه تدريب النموذج ، لن يتأقلم. بالطبع ، مثل هذا المثال اصطناعي بحت ، ولكن في الواقع ، بالنسبة للاختلافات الكبيرة ، يكفي تدريب النموذج لـ 20+ ومحاولة جعله يعمل لمدة 30+. ستكون النتيجة متشابهة.
هذا لأن النماذج تتعلم التوزيعات (3) للبيانات. إذا كانت توزيعات الميزة في مجموعات التدريب والاختبار متطابقة ، فسيشكرك النموذج.
إدراج المترجم: عندما جلست للترجمة ، كان لدي سؤال: لماذا يجب تعديل التدريب على الاختبار ، لأنه ، في الواقع ، يعكس الاختبار بيانات غير مرئية ستدخل النموذج عند مدخل الإنتاج. ثم استغرقت في النوم ، وأعدت القراءة ، وذهب كل شيء. الحيلة هي أنه ، تحت تأثير العوامل ، قد يصبح الأثر الرجعي غير ذي صلة في الوقت الحاضر. المزيد عن هذا لاحقًا (تمت إعادة تكييف المثال قليلاً).
يمكن أن يحدث التحيز في التوزيعات لميزة واحدة لأسباب مختلفة. يمكن استعارة المثال الأكثر بديهية من Facebook.
لنفترض أن الشركة قد تم تدريبها على نموذج يعتمد على ميزة (الميزة هي نفسها الميزة) مثل التسلية في دقائق. دعه يتنبأ بشكل صناعي بمستوى ولاء المستخدم على مقياس من عشر نقاط.
عندما تم تقسيم تطبيق Facebook العام إلى الشبكة الاجتماعية الرئيسية (الخلاصة وما إلى ذلك) وحدث نظام المراسلة ، انخفض الوقت في التطبيق الرئيسي ، أي تغيرت مجموعات البيانات الواردة ولم تعد تتوافق مع الماضي بأثر رجعي.
رياضيا ، مع الأخذ في الاعتبار ميزة الوقت ، سيتنبأ النموذج بمستوى أقل من الولاء ، على الرغم من أن هذا ليس هو الحال في الواقع - يتم تقسيم نقل الوقت ببساطة إلى تطبيقين. يخرج بحزن.
وبالتالي ، يحدث تحول التوزيع عندما يصبح توزيع البيانات التاريخية غير ذي صلة للتنبؤ بالبيانات الجديدة.
في مجموعة بيانات Deezer ، كان عدم تطابق التوزيع في الميزة التي تقيس عدد الأغاني التي تم الاستماع إليها قبل حل مشكلة التنبؤ. كان لهذه الميزة توزيع أسي (4) في كل من مجموعات البيانات العامة واختبار. ومع ذلك ، في مجموعة بيانات الاختبار ، كان أكثر وضوحًا ، لذا كان المتوسط في مجموعة التدريب أقل منه في مجموعة الاختبار. بعد إعادة تشكيل توزيع التدريب ، تمكنا من زيادة مقياس ROC-AUC (5) وتسلق التصنيف بحوالي 20 نقطة.
فيما يلي مثال على اختلاف التوزيع:
import numpy as np
import plotly.figure_factory as ff
train = np.random.exponential(2, size=100000)
test = np.random.exponential(1, size=10000)
distplot = ff.create_distplot([train, test], ['Train', 'Test'], bin_size=0.5)
distplot.update_layout(title_text=' Test, Train')
"
"
إن فكرة التسوية التحول التوزيع هو إعادة تشكيل نموذج التدريب لتعكس توزيع الاختبار.
لنتخيل أننا نريد إنشاء عينة فرعية من 50000 ملاحظة من مجموعة التدريب الخاصة بنا لتناسب توزيع مجموعة الاختبار. ماذا تريد أن تفعل بشكل حدسي؟
اجعلها تجعل الأشياء الأكثر شيوعًا في مجموعة بيانات الاختبار شائعة أيضًا في التدريب! ولكن كيف يمكنك تحديد الأشياء التي نحتاجها أكثر وأيها أقل تكرارًا؟
الميزان!
ستكون الخطوات مثل هذا:
- قسّم خط التوزيع العددي المستقيم إلى فترات متساوية (أو سلال (سلال)
- احسب عدد الأشياء في كل سلة (حجم السلة)
- لكل ملاحظة في السلة ، احسب وزنها يساوي 1 / (حجم الصندوق)
- إنشاء عينة فرعية من k بتوزيع مرجح (ستظهر الكائنات ذات الوزن الأعلى في العينة الفرعية في كثير من الأحيان)
عند التحويل إلى الكود ، نقوم بالإجراءات التالية:
SAMPLE_SIZE = 50000
N_BINS = 300
# , .
#
step = 100 / N_BINS
test_percentiles = [
np.percentile(test, q, axis=0)
for q in np.arange(start=step, stop=100, step=step)
]
# .
# ,
train_bins = np.digitize(train, test_percentiles)
# i ,
# 0 , 1 1 i
train_bin_counts = np.bincount(train_bins)
# ,
weights = 1 / np.array([train_bin_counts[x] for x in train_bins])
# ,
weights_norm = weights / np.sum(weights)
np.random.seed(0)
sample = np.random.choice(train, size=SAMPLE_SIZE, p=weights_norm, replace=False)
distplot_with_sample = ff.create_distplot([train, test, sample], ['Train', 'Test', 'New train'], bin_size=0.5)
distplot_with_sample.update_layout(title_text=' Test, Train, New train')
"
" أصبح
التوزيع الجديد (باللون الأخضر) يتطابق بشكل أفضل مع توزيع عينة الاختبار (باللون البرتقالي). استخدمنا إجراءات مماثلة في المسابقة - احتوت مجموعة البيانات الأصلية على 3 ملايين صف ، أنشأنا حجم العينة الجديدة من 1.3 مليون عنصر. أصبحت البيانات أصغر ، لكن تمثيل التوزيع أدى إلى تحسين جودة التدريب.
بعض الملاحظات من التجربة الشخصية للمؤلف:
- لا يلعب عدد السلال دورًا كبيرًا ، ولكن كلما قل عدد السلال ، زادت سرعة تعلم الخوارزمية (حاول تغيير عدد السلال (N_BINS) إلى 3 ، 30 في المثال وسترى أن الفرق صغير حقًا)
- , , , “” , , .
( , “” , “” . . , )
توجد خوارزمية إعادة التشكيل على جيثب المؤلف (مجلد xam ). في المستقبل ، يخطط المؤلف لتحليل مواضيع جديدة ومشاركتها في المدونة.
آمل أن تكون الترجمة والملاحظات مفيدة وواضحة. إنني أتطلع إلى ملاحظاتك بشكل بناء. شكرا لوقتك.
الحواشي:
1. Deezer هي خدمة بث موسيقى فرنسية عبر الإنترنت. اكتب Spotify و Ya.Muzyki وستحصل على
2. XGBoost- خوارزمية تعزيز التدرج الشديد. أحببت بالتأكيد تسميته "التدرج المعزز للستيرويدات". فكرة التعزيز هي تدريب العديد من الطلاب الضعفاء المتجانسين ، كل منهم يشكل درجات بناءً على تجربة التعلم بأثر رجعي للتجربة السابقة ، مع الانتباه إلى تلك الفئات التي تعثرت فيها الخوارزمية السابقة أكثر من غيرها. الفكرة من وراء التدرج اللوني هي ، بعبارات بسيطة ، لتقليل أخطاء التعلم. XGBoost ، كخوارزمية ، هو تكوين أكثر فائدة من الناحية الحسابية لتعزيز التدرج
3. التوزيع هنا يعني بالضبط الشيء الذي يصف القانون الذي بموجبه تنتشر الأرقام في متغير.
4. في رأيي الشخصي ، الحافز الأكثر مفهومًا لتصور الأسيالتوزيع في الرأس هو تعريفه كتوزيع بكثافة ثابتة.
5. ROC-AUC (المنطقة الواقعة تحت منحنى خاصية تشغيل المستقبل) - المنطقة الواقعة تحت منحنى "خصائص معالجة المستقبِل" - اسم حرفي ، لأن المقياس جاء من نظرية معالجة الإشارة. منحنى ROC شديد الانحدار - فهو يوضح نسبة الموجبة الحقيقية والإيجابية الكاذبة لاستجابات النموذج حيث تتغير عتبة احتمالية التخصيص لفئة ما ، وتشكل "قوسًا". نظرًا لحقيقة أنه يمكن رؤية نسبة TP و FP ، فمن الممكن تحديد الحد الأمثل للاحتمالات اعتمادًا على أخطاء من النوع الأول والثاني.
في حالة النظر في دقة النموذج ، وعدم الالتفات إلى حد احتمالية الاستجابات ، يتم استخدام مقياس ROC-AUC ، والذي يأخذ قيمًا في النطاق [0،1]. بالنسبة إلى نموذج ثابت مع توازن الفئات ، ستكون ROC-AUC مساوية تقريبًا 0.5 ، لذلك ، لا تجتاز الطرز أدناه اختبار الصحة (تحقق من سلامة العقل). كلما كانت المنطقة الواقعة أسفل منحنى ROC أقرب إلى واحد ، كان ذلك أفضل ، ولكن لفهرسة فائدة النتائج بشكل عام ، من المناسب مقارنة AUC-ROC للنموذج المدرّب مع AUC-ROC للنموذج الثابت.