هاكاثون سنا 2019

في الفترة من فبراير إلى مارس 2019، أقيمت مسابقة لتصنيف خلاصة الشبكة الاجتماعية هاكاثون سنا 2019حيث حصل فريقنا على المركز الأول. سأتحدث في المقال عن تنظيم المسابقة، والطرق التي جربناها، وإعدادات catboost للتدريب على البيانات الضخمة.

هاكاثون سنا 2019

هاكاثون SNA

وهذه هي المرة الثالثة التي يقام فيها هاكاثون تحت هذا الاسم. يتم تنظيمه بواسطة شبكة التواصل الاجتماعي ok.ru، على التوالي، وترتبط المهمة والبيانات مباشرة بهذه الشبكة الاجتماعية.
يُفهم SNA (تحليل الشبكة الاجتماعية) في هذه الحالة بشكل صحيح ليس كتحليل للرسم البياني الاجتماعي، بل كتحليل لشبكة اجتماعية.

  • في عام 2014، كانت المهمة هي التنبؤ بعدد الإعجابات التي سيحصل عليها المنشور.
  • في عام 2016 - مهمة VVZ (ربما تكون على دراية)، أقرب إلى تحليل الرسم البياني الاجتماعي.
  • في عام 2019، تم ترتيب خلاصة المستخدم بناءً على احتمالية إعجاب المستخدم بالمنشور.

لا أستطيع أن أقول عن عام 2014، ولكن في عامي 2016 و 2019، بالإضافة إلى قدرات تحليل البيانات، كانت هناك حاجة أيضًا إلى مهارات العمل مع البيانات الضخمة. أعتقد أن الجمع بين التعلم الآلي ومشكلات معالجة البيانات الضخمة هو ما جذبني إلى هذه المسابقات، وساعدتني تجربتي في هذه المجالات على الفوز.

com.mlbootcamp

وفي عام 2019، تم تنظيم المسابقة على المنصة https://mlbootcamp.ru.

بدأت المسابقة إلكترونيًا في 7 فبراير وكانت مكونة من 3 مهام. يمكن لأي شخص التسجيل في الموقع، تحميل خط الأساس وتحميل سيارتك لبضع ساعات. في نهاية المرحلة عبر الإنترنت في 15 مارس، تمت دعوة أفضل 15 من كل حدث لقفز الحواجز إلى مكتب Mail.ru للمرحلة غير المتصلة بالإنترنت، والتي أقيمت في الفترة من 30 مارس إلى 1 أبريل.

مهمة

توفر البيانات المصدر معرفات المستخدم (معرف المستخدم) ومعرفات النشر (معرف الكائن). إذا تم عرض منشور للمستخدم، فإن البيانات تحتوي على سطر يحتوي على معرف المستخدم ومعرف الكائن وردود أفعال المستخدم على هذا المنشور (التعليقات) ومجموعة من الميزات المتنوعة أو الروابط للصور والنصوص.

معرف المستخدم معرف الكائن بطاقة هوية المالك ردود الفعل صور
3555 22 5677 [أعجبني، تم النقر] [التجزئة1]
12842 55 32144 [لم يعجبني] [التجزئة 2، التجزئة 3]
13145 35 5677 [تم النقر والمشاركة] [التجزئة2]

تحتوي مجموعة بيانات الاختبار على بنية مشابهة، ولكن حقل الملاحظات مفقود. وتتمثل المهمة في التنبؤ بوجود رد الفعل "المفضل" في حقل التعليقات.
يحتوي ملف التقديم على البنية التالية:

معرف المستخدم القائمة المصنفة[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

المقياس هو متوسط ​​ROC AUC للمستخدمين.

يمكن العثور على وصف أكثر تفصيلاً للبيانات على موقع المجلس. يمكنك أيضًا تنزيل البيانات هناك، بما في ذلك الاختبارات والصور.

مرحلة الانترنت

في المرحلة عبر الإنترنت، تم تقسيم المهمة إلى 3 أجزاء

مرحلة غير متصل

وفي مرحلة عدم الاتصال بالإنترنت، شملت البيانات جميع الميزات، بينما كانت النصوص والصور متفرقة. كان عدد الصفوف في مجموعة البيانات أكبر بمقدار 1,5 مرة، وكان هناك الكثير منها بالفعل.

حل المشكلة

وبما أنني أقوم بإعداد السيرة الذاتية في العمل، فقد بدأت رحلتي في هذه المسابقة بمهمة "الصور". البيانات التي تم تقديمها هي userId، وobjectId، وownerId (المجموعة التي تم نشر المنشور فيها)، والطوابع الزمنية لإنشاء المنشور وعرضه، وبالطبع صورة هذا المنشور.
بعد إنشاء العديد من الميزات بناءً على الطوابع الزمنية، كانت الفكرة التالية هي أخذ الطبقة قبل الأخيرة من الخلايا العصبية المدربة مسبقًا على imagenet وإرسال هذه التضمينات للتعزيز.

هاكاثون سنا 2019

ولم تكن النتائج مثيرة للإعجاب. اعتقدت أن التضمينات من خلية imagenet العصبية ليست ذات صلة، فأنا بحاجة إلى إنشاء جهاز تشفير تلقائي خاص بي.

هاكاثون سنا 2019

استغرق الأمر الكثير من الوقت ولم تتحسن النتيجة.

توليد الميزة

يستغرق العمل مع الصور الكثير من الوقت، لذلك قررت أن أفعل شيئًا أبسط.
كما ترون على الفور، هناك العديد من الميزات الفئوية في مجموعة البيانات، ولكي لا أزعجك كثيرًا، قمت للتو باستخدام catboost. كان الحل ممتازًا، وبدون أي إعدادات وصلت على الفور إلى السطر الأول من لوحة المتصدرين.

هناك الكثير من البيانات وهي موضوعة بتنسيق الباركيه، لذلك دون التفكير مرتين، أخذت سكالا وبدأت في كتابة كل شيء بالشرارة.

أبسط الميزات التي أعطت نموًا أكبر من تضمينات الصور:

  • عدد مرات ظهور معرف الكائن ومعرف المستخدم ومعرف المالك في البيانات (يجب أن يرتبط بالشعبية)؛
  • عدد المشاركات التي شاهدها معرف المستخدم من معرف المالك (يجب أن ترتبط باهتمام المستخدم بالمجموعة)؛
  • عدد معرفات المستخدمين الفريدة التي شاهدت المشاركات من معرف المالك (يعكس حجم جمهور المجموعة).

من الطوابع الزمنية كان من الممكن الحصول على الوقت من اليوم الذي شاهد فيه المستخدم البث (الصباح/بعد الظهر/المساء/الليل). من خلال الجمع بين هذه الفئات، يمكنك الاستمرار في إنشاء الميزات:

  • كم مرة قام المستخدم بتسجيل الدخول في المساء؛
  • في أي وقت يتم عرض هذا المنشور غالبًا (objectId) وما إلى ذلك.

كل هذا أدى إلى تحسين المقاييس تدريجياً. لكن حجم مجموعة بيانات التدريب يبلغ حوالي 20 مليون سجل، لذا فإن إضافة الميزات أدت إلى إبطاء التدريب بشكل كبير.

لقد أعدت التفكير في نهجي في استخدام البيانات. على الرغم من أن البيانات تعتمد على الوقت، إلا أنني لم أر أي تسرب واضح للمعلومات "في المستقبل"، ومع ذلك، في حالة حدوث ذلك، قمت بتقسيمها على النحو التالي:

هاكاثون سنا 2019

تم تقسيم مجموعة التدريب المقدمة لنا (فبراير وأسبوعين من مارس) إلى جزأين.
تم تدريب النموذج على بيانات من آخر N أيام. تم بناء التجميعات الموصوفة أعلاه على جميع البيانات، بما في ذلك الاختبار. في الوقت نفسه، ظهرت البيانات التي يمكن بناء ترميزات مختلفة للمتغير الهدف. إن أبسط طريقة هي إعادة استخدام التعليمات البرمجية التي تقوم بالفعل بإنشاء ميزات جديدة، وإطعامها ببساطة بالبيانات التي لن يتم تدريبها عليها والهدف = 1.

وهكذا حصلنا على ميزات مماثلة:

  • كم عدد المرات التي شاهد فيها معرف المستخدم منشورًا في معرف مالك المجموعة؛
  • كم عدد مرات إعجاب المستخدم بالمنشور في معرف مالك المجموعة؛
  • النسبة المئوية للمشاركات التي أعجبها userId من OwnerId.

وهذا هو، اتضح يعني ترميز الهدف على جزء من مجموعة البيانات لمجموعات مختلفة من الميزات الفئوية. من حيث المبدأ، يبني catboost أيضًا ترميزًا مستهدفًا ومن وجهة النظر هذه ليس هناك فائدة، ولكن، على سبيل المثال، أصبح من الممكن حساب عدد المستخدمين الفريدين الذين أعجبوا بالمشاركات في هذه المجموعة. في الوقت نفسه، تم تحقيق الهدف الرئيسي - تم تقليل مجموعة البيانات الخاصة بي عدة مرات، وكان من الممكن الاستمرار في إنشاء الميزات.

على الرغم من أن catboost يمكنه إنشاء ترميز فقط بناءً على التفاعل الذي تم الإعجاب به، فإن التعليقات لها تفاعلات أخرى: إعادة المشاركة، وعدم الإعجاب، وعدم الإعجاب، والنقر عليها، والتجاهل، والتي يمكن إجراء ترميزاتها يدويًا. لقد قمت بإعادة حساب جميع أنواع المجاميع وأزلت الميزات ذات الأهمية المنخفضة حتى لا أقوم بتضخيم مجموعة البيانات.

بحلول ذلك الوقت كنت في المركز الأول بفارق كبير. الشيء الوحيد الذي كان مربكًا هو أن تضمينات الصور لم تظهر أي نمو تقريبًا. جاءت الفكرة لإعطاء كل شيء لـ catboost. نقوم بتجميع صور Kmeans ونحصل على الميزة الفئوية الجديدة imageCat.

فيما يلي بعض الفئات بعد التصفية اليدوية ودمج المجموعات التي تم الحصول عليها من KMeans.

هاكاثون سنا 2019

بناءً على imageCat نقوم بإنشاء:

  • الميزات الفئوية الجديدة:
    • ما هي imageCat التي تم عرضها في أغلب الأحيان بواسطة userId؛
    • ما هي imageCat التي تعرض معرف المالك غالبًا؟
    • أي imageCat كان محبوبًا في أغلب الأحيان بواسطة userId؛
  • عدادات مختلفة:
    • كم عدد imageCat الفريد الذي نظر إلى معرف المستخدم؛
    • حوالي 15 ميزة مشابهة بالإضافة إلى التشفير المستهدف كما هو موضح أعلاه.

النصوص

لقد تناسبتني النتائج في مسابقة الصور وقررت أن أجرب يدي في النصوص. لم أعمل كثيرًا مع النصوص من قبل، وبحماقة، قتلت اليوم على tf-idf وsvd. ثم رأيت خط الأساس مع doc2vec، والذي يفعل بالضبط ما أحتاج إليه. بعد تعديل معلمات doc2vec قليلاً، حصلت على تضمينات نصية.

ثم قمت ببساطة بإعادة استخدام الكود الخاص بالصور، حيث قمت باستبدال تضمينات الصورة بتضمينات النص. ونتيجة لذلك، حصلت على المركز الثاني في مسابقة النص.

النظام التعاوني

كانت هناك منافسة واحدة لم أقم "بطعنها" بالعصا بعد، واستنادًا إلى الجامعة الأمريكية بالقاهرة على لوحة المتصدرين، كان من المفترض أن يكون لنتائج هذه المنافسة بالذات أكبر الأثر على المرحلة غير المتصلة بالإنترنت.
لقد أخذت جميع الميزات الموجودة في البيانات المصدر، واخترت الميزات الفئوية وحسبت نفس المجاميع الخاصة بالصور، باستثناء الميزات المستندة إلى الصور نفسها. مجرد وضع هذا في catboost أوصلني إلى المركز الثاني.

الخطوات الأولى لتحسين catboost

أسعدني المركز الأول والثاني، ولكن كان هناك فهم أنني لم أفعل أي شيء خاص، مما يعني أنني يمكن أن أتوقع خسارة المواقف.

مهمة المسابقة هي ترتيب المشاركات داخل المستخدم، وطوال هذا الوقت كنت أقوم بحل مشكلة التصنيف، أي تحسين المقياس الخاطئ.

سأقدم مثالًا بسيطًا:

معرف المستخدم معرف الكائن تنبؤ الحقيقة الأرض
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 1
1 14 0.5 0
2 15 0.4 0
2 16 0.3 1

دعونا نجري إعادة ترتيب صغيرة

معرف المستخدم معرف الكائن تنبؤ الحقيقة الأرض
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 0
2 16 0.5 1
2 15 0.4 0
1 14 0.3 1

نحصل على النتائج التالية:

نموذج AUC المستخدم 1 الجامعة الأمريكية بالقاهرة المستخدم 2 الجامعة الأمريكية بالقاهرة يعني الجامعة الأمريكية بالقاهرة
الخيار 1 0,8 1,0 0,0 0,5
الخيار 2 0,7 0,75 1,0 0,875

كما ترون، فإن تحسين مقياس AUC الإجمالي لا يعني تحسين متوسط ​​مقياس AUC داخل المستخدم.

كاتبووست يعرف كيفية تحسين مقاييس التصنيف من الصندوق. قرأت عن مقاييس التصنيف، قصص نجاح عند استخدام catboost وضبط YetiRankPairwise للتدريب طوال الليل. ولم تكن النتيجة مثيرة للإعجاب. عندما قررت أنني كنت غير مدرب جيدًا، قمت بتغيير وظيفة الخطأ إلى QueryRMSE، والتي، وفقًا لوثائق catboost، تتقارب بشكل أسرع. في النهاية، حصلت على نفس النتائج التي حصلت عليها عند التدريب على التصنيف، لكن مجموعات هذين النموذجين أعطت زيادة جيدة، مما أوصلني إلى المركز الأول في جميع المسابقات الثلاث.

قبل 5 دقائق من اختتام المرحلة الإلكترونية لمسابقة "الأنظمة التعاونية"، نقلني سيرجي شالنوف إلى المركز الثاني. مشينا الطريق الآخر معًا.

التحضير للمرحلة دون اتصال

لقد تم ضمان النصر في المرحلة عبر الإنترنت باستخدام بطاقة فيديو RTX 2080 TI، لكن الجائزة الرئيسية البالغة 300 روبل، وعلى الأرجح، حتى المركز الأول الأخير أجبرتنا على العمل خلال هذين الأسبوعين.

كما اتضح فيما بعد، استخدم سيرجي أيضًا catboost. تبادلنا الأفكار والميزات، وتعرفت عليها تقرير آنا فيرونيكا دوروغوش والتي تضمنت إجابات للعديد من أسئلتي، وحتى تلك التي لم تكن لدي إجابات في ذلك الوقت.

قادني الاطلاع على التقرير إلى فكرة أننا بحاجة إلى إعادة كافة المعلمات إلى القيمة الافتراضية، والقيام بالإعدادات بعناية فائقة وفقط بعد تثبيت مجموعة من الميزات. الآن استغرق التدريب حوالي 15 ساعة، لكن نموذج واحد تمكن من الحصول على سرعة أفضل من تلك التي تم الحصول عليها في المجموعة مع التصنيف.

توليد الميزة

في مسابقة الأنظمة التعاونية، يتم تقييم عدد كبير من الميزات على أنها مهمة للنموذج. على سبيل المثال، Auditweights_spark_svd - العلامة الأهم ولكن لا توجد معلومات عن معناها. اعتقدت أنه سيكون من المفيد حساب المجاميع المختلفة بناءً على الميزات المهمة. على سبيل المثال، متوسط ​​Auditweights_spark_svd حسب المستخدم، حسب المجموعة، حسب الكائن. ويمكن حساب نفس الشيء باستخدام البيانات التي لم يتم إجراء أي تدريب عليها والهدف = 1، أي المتوسط Auditweights_spark_svd بواسطة المستخدم حسب الأشياء التي يحبها. علامات مهمة الى جانب ذلك Auditweights_spark_svd، كان هناك عدة. وهنا بعض منهم:

  • AuditweightsCtrGender
  • أوزان المراجعةCtrHigh
  • userOwnerCounterCreateLikes

على سبيل المثال، المتوسط AuditweightsCtrGender وفقًا لـ userId، فقد تبين أنها ميزة مهمة، تمامًا مثل القيمة المتوسطة userOwnerCounterCreateLikes بواسطة معرف المستخدم + معرف المالك. من المفترض أن يجعلك هذا تعتقد أنك بحاجة إلى فهم معنى الحقول.

وكانت الميزات الهامة أيضا AuditweightsLikesCount и AuditweightsShowsCount. وبتقسيم أحدهما على الآخر، تم الحصول على ميزة أكثر أهمية.

تسرب البيانات

إن نمذجة المنافسة والإنتاج مهمتان مختلفتان تمامًا. عند إعداد البيانات، من الصعب جدًا مراعاة كافة التفاصيل وعدم نقل بعض المعلومات غير التافهة حول المتغير المستهدف في الاختبار. إذا كنا نقوم بإنشاء حل إنتاج، فسنحاول تجنب استخدام تسرب البيانات عند تدريب النموذج. ولكن إذا أردنا الفوز بالمنافسة، فإن تسرب البيانات هو أفضل الميزات.

بعد دراسة البيانات، يمكنك أن ترى ذلك وفقًا لقيم معرف الكائن AuditweightsLikesCount и AuditweightsShowsCount التغيير، مما يعني أن نسبة القيم القصوى لهذه الميزات ستعكس التحويل اللاحق بشكل أفضل بكثير من النسبة وقت العرض.

التسرب الأول الذي وجدناه هو AuditweightsLikesCountMax/auditweightsShowsCountMax.
ولكن ماذا لو نظرنا إلى البيانات عن كثب؟ دعنا نفرز حسب تاريخ العرض ونحصل على:

معرف الكائن معرف المستخدم AuditweightsShowsCount AuditweightsLikesCount الهدف (محبوب)
1 1 12 3 على الاغلب لا
1 2 15 3 ربما نعم
1 3 16 4

لقد كان الأمر مفاجئًا عندما وجدت المثال الأول من نوعه، واتضح أن توقعي لم يتحقق. ولكن، مع الأخذ في الاعتبار حقيقة أن القيم القصوى لهذه الخصائص داخل الكائن أعطت زيادة، لم نكن كسالى وقررنا العثور على AuditweightsShowsCountNext и AuditweightsLikesCountNextأي القيم في اللحظة التالية من الزمن. من خلال إضافة ميزة
(أوزان التدقيقالعروضالعددالتالي-أوزان التدقيقالعروضالعدد)/(أوزان التدقيقالإعجاباتالعدد-أوزان التدقيقالإعجاباتالتالي) لقد قمنا بقفزة حادة بسرعة.
ويمكن استخدام تسريبات مماثلة من خلال إيجاد القيم التالية لـ userOwnerCounterCreateLikes ضمن معرف المستخدم + معرف المالك، وعلى سبيل المثال، AuditweightsCtrGender داخل objectId + userGender. لقد عثرنا على 6 حقول مشابهة بها تسريبات واستخرجنا منها أكبر قدر ممكن من المعلومات.

وبحلول ذلك الوقت، كنا قد استخرجنا أكبر قدر ممكن من المعلومات من الميزات التعاونية، لكننا لم نعد إلى مسابقات الصور والنصوص. كانت لدي فكرة رائعة للتحقق منها: ما مقدار الميزات التي تعتمد بشكل مباشر على الصور أو النصوص في المسابقات ذات الصلة؟

لم تكن هناك تسريبات في مسابقات الصور والنصوص، ولكن بحلول ذلك الوقت كنت قد قمت بإرجاع معلمات catboost الافتراضية، وقمت بتنظيف الكود وإضافة بعض الميزات. وكان المجموع:

حل قريباً
الحد الأقصى مع الصور 0.6411
الحد الأقصى لا توجد صور 0.6297
نتيجة المركز الثاني 0.6295

حل قريباً
الحد الأقصى مع النصوص 0.666
الحد الأقصى بدون نصوص 0.660
نتيجة المركز الثاني 0.656

حل قريباً
الحد الأقصى في التعاون 0.745
نتيجة المركز الثاني 0.723

أصبح من الواضح أنه من غير المرجح أن نتمكن من استخراج الكثير من النصوص والصور، وبعد تجربة بعض الأفكار الأكثر إثارة للاهتمام، توقفنا عن العمل معهم.

لم يؤدي الجيل الإضافي من الميزات في الأنظمة التعاونية إلى زيادة، وبدأنا في التصنيف. في المرحلة عبر الإنترنت، أعطتني مجموعة التصنيف والتصنيف زيادة طفيفة، كما اتضح فيما بعد لأنني قمت بتدريب التصنيف بشكل أقل. لم تنتج أي من وظائف الخطأ، بما في ذلك YetiRanlPairwise، أي نتيجة قريبة من النتيجة التي قدمها LogLoss (0,745 مقابل 0,725). لا يزال هناك أمل في QueryCrossEntropy، الذي لا يمكن إطلاقه.

مرحلة غير متصل

في مرحلة عدم الاتصال بالإنترنت، ظلت بنية البيانات كما هي، ولكن كانت هناك تغييرات طفيفة:

  • تم إعادة ترتيب معرفات معرف المستخدم، معرف الكائن، معرف المالك بشكل عشوائي؛
  • تمت إزالة العديد من العلامات وأعيدت تسمية العديد منها؛
  • زادت البيانات حوالي 1,5 مرة.

بالإضافة إلى الصعوبات المذكورة، كانت هناك ميزة إضافية كبيرة: تم تخصيص خادم كبير للفريق مع RTX 2080TI. لقد استمتعت بـ htop لفترة طويلة.
هاكاثون سنا 2019

لم تكن هناك سوى فكرة واحدة - مجرد إعادة إنتاج ما هو موجود بالفعل. بعد قضاء بضع ساعات في إعداد البيئة على الخادم، بدأنا تدريجيًا في التحقق من إمكانية تكرار النتائج. المشكلة الرئيسية التي نواجهها هي زيادة حجم البيانات. قررنا تقليل الحمل قليلاً وتعيين معلمة catboost ctr_complexity=1. يؤدي هذا إلى تقليل السرعة قليلاً، لكن النموذج الخاص بي بدأ العمل، وكانت النتيجة جيدة - 0,733. سيرجي، على عكسي، لم يقسم البيانات إلى جزأين وتدرب على جميع البيانات، على الرغم من أن هذا أعطى أفضل النتائج في المرحلة عبر الإنترنت، إلا أنه في المرحلة غير المتصلة بالإنترنت كانت هناك العديد من الصعوبات. إذا أخذنا جميع الميزات التي أنشأناها وحاولنا دمجها في catboost، فلن ينجح أي شيء في مرحلة الإنترنت. قام سيرجي بتحسين الكتابة، على سبيل المثال، تحويل أنواع float2 إلى float64. في هذه المقالة، يمكنك العثور على معلومات حول تحسين الذاكرة في الباندا. ونتيجة لذلك، تدرب سيرجي على وحدة المعالجة المركزية باستخدام جميع البيانات وحصل على حوالي 0,735.

كانت هذه النتائج كافية للفوز، لكننا أخفينا سرعتنا الحقيقية ولم نتمكن من التأكد من أن الفرق الأخرى لم تفعل الشيء نفسه.

القتال حتى النهاية

ضبط كاتبوست

تم إعادة إنتاج الحل الخاص بنا بالكامل، وأضفنا ميزات البيانات النصية والصور، لذلك كل ما تبقى هو ضبط معلمات catboost. تدرب سيرجي على وحدة المعالجة المركزية بعدد صغير من التكرارات، وأنا تدربت على التكرار الذي يحتوي على ctr_complexity=1. كان هناك يوم واحد متبقي، وإذا قمت للتو بإضافة التكرارات أو زيادة تعقيد ctr_complexity، فبحلول الصباح يمكنك الحصول على سرعة أفضل والمشي طوال اليوم.

في مرحلة عدم الاتصال بالإنترنت، يمكن إخفاء السرعات بسهولة شديدة بمجرد اختيار الحل الأفضل على الموقع. لقد توقعنا تغييرات جذرية في لوحة المتصدرين في الدقائق الأخيرة قبل إغلاق التقديمات وقررنا عدم التوقف.

تعلمت من فيديو Anna أنه لتحسين جودة النموذج، من الأفضل تحديد المعلمات التالية:

  • معدل التعليم - يتم حساب القيمة الافتراضية بناءً على حجم مجموعة البيانات. تتطلب زيادة معدل التعلم زيادة عدد التكرارات.
  • l2_leaf_reg — معامل التنظيم، القيمة الافتراضية 3، ويفضل الاختيار من 2 إلى 30. انخفاض القيمة يؤدي إلى زيادة التناسب.
  • درجة حرارة التعبئة - يضيف التوزيع العشوائي لأوزان الكائنات في العينة. القيمة الافتراضية هي 1، حيث يتم سحب الأوزان من التوزيع الأسي. انخفاض القيمة يؤدي إلى زيادة في overfit.
  • Random_Strength - يؤثر على اختيار الانقسامات في تكرار معين. كلما زادت قوة العشوائية، زادت فرصة تحديد تقسيم منخفض الأهمية. وفي كل تكرار لاحق، تنخفض العشوائية. انخفاض القيمة يؤدي إلى زيادة في overfit.

المعلمات الأخرى لها تأثير أقل بكثير على النتيجة النهائية، لذلك لم أحاول تحديدها. استغرق تكرار التدريب على مجموعة بيانات GPU الخاصة بي باستخدام ctr_complexity=1 20 دقيقة، وكانت المعلمات المحددة في مجموعة البيانات المخفضة مختلفة قليلاً عن المعلمات المثالية في مجموعة البيانات الكاملة. في النهاية، قمت بحوالي 30 تكرارًا على 10% من البيانات، ثم حوالي 10 تكرارات أخرى على جميع البيانات. اتضح شيئا من هذا القبيل:

  • معدل التعليم لقد زادت بنسبة 40٪ عن الافتراضي؛
  • l2_leaf_reg تركته على حاله؛
  • درجة حرارة التعبئة и Random_Strength خفضت إلى 0,8.

يمكننا أن نستنتج أن النموذج لم يتم تدريبه جيدًا باستخدام المعلمات الافتراضية.

لقد فوجئت جدًا عندما رأيت النتيجة على لوحة المتصدرين:

نموذج نموذج 1 نموذج 2 نموذج 3 فرقة
بدون ضبط 0.7403 0.7404 0.7404 0.7407
مع ضبط 0.7406 0.7405 0.7406 0.7408

لقد خلصت بنفسي إلى أنه إذا لم تكن هناك حاجة إلى تطبيق سريع للنموذج، فمن الأفضل استبدال اختيار المعلمات بمجموعة من النماذج المتعددة باستخدام معلمات غير محسنة.

كان سيرجي يعمل على تحسين حجم مجموعة البيانات لتشغيلها على وحدة معالجة الرسومات. الخيار الأبسط هو قطع جزء من البيانات، ولكن يمكن القيام بذلك بعدة طرق:

  • إزالة أقدم البيانات تدريجيًا (بداية شهر فبراير) حتى تبدأ مجموعة البيانات في احتواء الذاكرة؛
  • إزالة الميزات ذات الأهمية الأقل؛
  • إزالة معرفات المستخدم التي يوجد لها إدخال واحد فقط؛
  • اترك فقط معرفات المستخدم الموجودة في الاختبار.

وفي النهاية، قم بإنشاء مجموعة من جميع الخيارات.

الفرقة الأخيرة

وبحلول وقت متأخر من مساء اليوم الأخير، كنا قد وضعنا مجموعة من نماذجنا التي أسفرت عن 0,742. بين عشية وضحاها، أطلقت نموذجي باستخدام ctr_complexity=2 وبدلاً من 30 دقيقة، تدرب لمدة 5 ساعات. تم احتسابها فقط في الساعة الرابعة صباحًا، وقمت بإنشاء المجموعة الأخيرة، والتي أعطت 4 على لوحة المتصدرين العامة.

نظرًا لاختلاف الأساليب في حل المشكلة، لم تكن توقعاتنا مرتبطة بقوة، مما أدى إلى زيادة جيدة في المجموعة. للحصول على مجموعة جيدة، من الأفضل استخدام التنبؤات النموذجية الأولية (prediction_type='RawFormulaVal') وتعيين Scale_pos_weight=neg_count/pos_count.

هاكاثون سنا 2019

على الموقع يمكنك أن ترى النتائج النهائية على المتصدرين الخاصة.

حلول أخرى

اتبعت العديد من الفرق قواعد خوارزميات نظام التوصية. أنا، لست خبيرا في هذا المجال، لا أستطيع تقييمها، لكني أتذكر حلين مثيرين للاهتمام.

  • حل نيكولاي أنوخين. نيكولاي، كونه موظفًا في Mail.ru، لم يتقدم بطلب للحصول على جوائز، لذلك لم يكن هدفه هو تحقيق أقصى سرعة، ولكن الحصول على حل قابل للتطوير بسهولة.
  • يعتمد قرار الفريق الفائز بجائزة لجنة التحكيم على هذه المقالة من الفيسبوك، يسمح بتجميع الصور بشكل جيد جدًا بدون عمل يدوي.

اختتام

أكثر ما بقي في ذاكرتي:

  • إذا كانت هناك ميزات فئوية في البيانات، وكنت تعرف كيفية القيام بالتشفير المستهدف بشكل صحيح، فلا يزال من الأفضل تجربة catboost.
  • إذا كنت تشارك في مسابقة، فيجب ألا تضيع الوقت في اختيار معلمات أخرى غير معدل التعلم والتكرارات. الحل الأسرع هو عمل مجموعة من عدة نماذج.
  • يمكن أن تتعلم التعزيزات على وحدة معالجة الرسومات. يمكن لـ Catboost أن يتعلم بسرعة كبيرة على وحدة معالجة الرسومات، ولكنه يستهلك قدرًا كبيرًا من الذاكرة.
  • أثناء تطوير الأفكار واختبارها، من الأفضل تعيين rsm~=0.2 صغير (وحدة المعالجة المركزية فقط) وctr_complexity=1.
  • على عكس الفرق الأخرى، أعطت مجموعة نماذجنا زيادة كبيرة. لقد تبادلنا الأفكار وكتبنا بلغات مختلفة فقط. كان لدينا نهج مختلف لتقسيم البيانات، وأعتقد أن كل منها كان لديه أخطاءه الخاصة.
  • ليس من الواضح سبب أداء تحسين الترتيب بشكل أسوأ من تحسين التصنيف.
  • لقد اكتسبت بعض الخبرة في العمل مع النصوص وفهم كيفية عمل أنظمة التوصية.

هاكاثون سنا 2019

شكرًا للمنظمين على المشاعر والمعرفة والجوائز التي حصلوا عليها.

المصدر: www.habr.com

إضافة تعليق