Skip to main content
Ctrl+K
scikit-learn homepage scikit-learn homepage
  • Install
  • دليل المستخدم
  • API
  • Examples
  • Community
    • البدء
    • Release History
    • Glossary
    • Development
    • FAQ
    • الدعم الفني
    • مشاريع ذات علاقة
    • Roadmap
    • Governance
    • من نحن
  • GitHub
  • Install
  • دليل المستخدم
  • API
  • Examples
  • Community
  • البدء
  • Release History
  • Glossary
  • Development
  • FAQ
  • الدعم الفني
  • مشاريع ذات علاقة
  • Roadmap
  • Governance
  • من نحن
  • GitHub

Section Navigation

  • 1. التعليم الخاضع للإشراف
    • 1.1. النماذج الخطية
    • 1.2. تحليل التمييز الخطي والتربيعي
    • 1.3. انحدار حافة النواة
    • 1.4. آلات الدعم المتجهية (SVM)
    • 1.5. التحسين التدريجي العشوائي
    • 1.6. أقرب الجيران
    • 1.7. العمليات الغاوسية
    • 1.8. التحليل المتقاطع
    • 1.9. خوارزميات بايز الساذجة
    • 1.10. شجرة القرار
    • 1.11. المجموعات: تعزيز التدرج، الغابات العشوائية، التجميع، التصويت، التكديس
    • 1.12. خوارزميات متعددة التصنيف ومتعددة الإخراج
    • 1.13. اختيار الميزات
    • 1.14. التعليم شبه الخاضع للإشراف
    • 1.15. الانحدار المتساوي التوتر
    • 1.16. معايرة الاحتمال
    • 1.17. نماذج الشبكات العصبية (الخاضعة للإشراف)
  • 2. التعليم الغير خاضع للإشراف
    • 2.1. نماذج خليط غاوسي
    • 2.2. تعلم المشعبات
    • 2.3. التجميع
    • 2.4. التجميع الثنائي
    • 2.5. تحليل الإشارات إلى مكونات (مشاكل تحليل المصفوفات)
    • 2.6. تقدير التباين المشترك
    • 2.7. كشف القيم الغريبة والقيم المتطرفة
    • 2.8. تقدير الكثافة
    • 2.9. نماذج الشبكة العصبية (غير خاضعة للإشراف)
  • 3. تقييم وإختيار النموذج
    • 3.1. التحقق المتبادل: تقييم أداء المقدر
    • 3.2. ضبط المعلمات الفائقة لمُقدِّر
    • 3.3. ضبط عتبة القرار لتنبؤ الفئة
    • 3.4. المقاييس والتهديف: تحديد جودة التنبؤات
    • 3.5. منحنيات التحقق من الصحة: رسم الدرجات لتقييم النماذج
  • 4. الفحص
    • 4.1. مخططات الاعتماد الجزئي والتوقع الشرطي الفردي
    • 4.2. أهمية التبديل
  • 5. التصورات المرئية
  • 6. تحويلات مجموعات البيانات
    • 6.1. خطوط الأنابيب والمقدرات المركبة
    • 6.2. استخراج الميزات
    • 6.3. المعالجة المسبقة للبيانات
    • 6.4. تعويض القيم المفقودة
    • 6.5. تخفيض الأبعاد غير الخاضع للإشراف
    • 6.6. الإسقاط العشوائي
    • 6.7. Kernel Approximation
    • 6.8. مقاييس المقارنة الزوجية، والصلات، والنوى (Kernels)
    • 6.9. تحويل هدف التنبؤ (y)
  • 7. مجموعات البيانات التجريبية
  • 8. مجموعات بيانات العالم الحقيقي
  • 9. مجموعات البيانات المُولَّدة
  • 10. تحميل مجموعات بيانات أخرى
  • 11. الحوسبة مع scikit-learn
    • 11.1. استراتيجيات للقياس حسابيًا: بيانات أكبر
    • 11.2. الأداء الحسابي
    • 11.3. التوازي وإدارة الموارد والتهيئة
  • 12. حفظ النموذج
  • 13. المزالق الشائعة والممارسات الموصى بها
  • 14. Dispatching
    • 14.1. دعم المدخلات المتوافقة مع Array API
  • 15. اختيار المقدر المناسب
  • 16. المصادر الخارجية ومقاطع الفيديو والمحادثات
  • دليل المستخدم
  • 3. تقييم وإختيار النموذج
  • 3.2. ضبط المعلمات الفائقة لمُقدِّر

3.2. ضبط المعلمات الفائقة لمُقدِّر#

المعلمات الفائقة هي معلمات لا يتم تعلمها مباشرةً داخل المُقدِّرات. في scikit-learn، يتم تمريرها كوسائط إلى مُنشئ فئات المُقدِّر. تتضمن الأمثلة النموذجية C و kernel و gamma لـ مُصنف متجه الدعم، alpha لـ Lasso، إلخ.

من الممكن والمُوصى به البحث في مساحة المعلمات الفائقة عن أفضل درجة تحقق متبادل.

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

estimator.get_params()

يتكون البحث من:

  • مُقدِّر (مُنحدِر أو مُصنف مثل sklearn.svm.SVC())؛

  • مساحة معلمات؛

  • أسلوب للبحث أو أخذ عينات من المُرشحين؛

  • مخطط تحقق متبادل؛ و

  • دالة درجة.

يتم توفير نهجين عامين للبحث عن المعلمات في scikit-learn: بالنسبة لقيم مُعطاة، GridSearchCV يأخذ في الاعتبار جميع مجموعات المعلمات بشكل شامل، بينما RandomizedSearchCV يمكنه أخذ عينات من عدد مُعين من المُرشحين من مساحة معلمات بتوزيع مُحدد. كلتا هاتين الأداتين لهما نظائر مُتتالية للنصف HalvingGridSearchCV و HalvingRandomSearchCV، والتي يمكن أن تكون أسرع بكثير في إيجاد مجموعة معلمات جيدة.

بعد وصف هذه الأدوات، نُفصِّل أفضل الممارسات المطبقة على هذه الأساليب. تسمح بعض النماذج بـ استراتيجيات بحث مُتخصصة وفعالة للمعلمات، موضحة في بدائل للبحث الشامل عن المعلمات.

لاحظ أنه من الشائع أن يكون لمجموعة فرعية صغيرة من هذه المعلمات تأثير كبير على أداء التنبؤ أو الحساب للنموذج بينما يمكن ترك الآخرين إلى قيمهم الافتراضية. يُوصى بقراءة سلسلة docstring لـ فئة المُقدِّر للحصول على فهم أدق لسلوكها المُتوقع، ربما عن طريق قراءة المرجع المُرفق للأدبيات.

3.2.1. بحث الشبكة الشامل#

البحث الشبكي الذي يُوفره GridSearchCV يُولِّد المُرشحين بشكل شامل من شبكة من قيم المعلمات المُحددة باستخدام معلمة param_grid. على سبيل المثال، param_grid التالي:

param_grid = [
  {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
  {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
 ]

يُحدد أنه يجب استكشاف شبكتين: واحدة بنواة خطية و قيم C في [1، 10، 100، 1000]، والثانية بنواة RBF، وحاصل ضرب قيم C التي تتراوح من [1، 10، 100، 1000] وقيم gamma في [0.001، 0.0001].

يُطبق مثيل GridSearchCV واجهة برمجة تطبيقات المُقدِّر المعتادة: عند "ملاءمته" على مجموعة بيانات، يتم تقييم جميع مجموعات قيم المعلمات المُمكنة ويتم الاحتفاظ بأفضل مجموعة.

أمثلة

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

  • انظر مثال على خط أنابيب لاستخراج ميزات النص وتقييمها للحصول على مثال على معلمات اقتران البحث الشبكي من مُستخرج ميزات مستندات نصية (متجه عدد n-gram ومُحوِّل TF-IDF) مع مُصنف (هنا SVM خطي مُدرَّب باستخدام SGD مع إما شبكة مرنة أو عقوبة L2) باستخدام مثيل Pipeline.

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

  • انظر توضيح التقييم متعدد المقاييس على cross_val_score و GridSearchCV للحصول على مثال على استخدام GridSearchCV لتقييم عدة مقاييس في وقت واحد.

  • انظر الموازنة بين تعقيد النموذج ودرجة الدقة عبر التحقق المتقاطع للحصول على مثال على استخدام واجهة refit=callable في GridSearchCV. يُظهر المثال كيف تُضيف هذه الواجهة قدرًا مُعينًا من المرونة في تحديد "أفضل" مُقدِّر. يمكن أيضًا استخدام هذه الواجهة في تقييم المقاييس المتعددة.

  • انظر المقارنة الإحصائية للنماذج باستخدام البحث الشبكي للحصول على مثال عن كيفية إجراء مقارنة إحصائية على مخرجات GridSearchCV.

3.2.2. تحسين المعلمات العشوائي#

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

  • يمكن اختيار ميزانية مستقلة عن عدد المعلمات والقيم المُمكنة.

  • لا يؤدي إضافة معلمات لا تؤثر على الأداء إلى تقليل الكفاءة.

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

{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),
  'kernel': ['rbf'], 'class_weight':['balanced', None]}

يستخدم هذا المثال وحدة scipy.stats، التي تحتوي على العديد من التوزيعات المفيدة لأخذ عينات من المعلمات، مثل expon و gamma و uniform و loguniform أو randint.

من حيث المبدأ، يمكن تمرير أي دالة تُوفر أسلوب rvs (عينة متغير عشوائي) لأخذ عينة من قيمة. يجب أن يُوفر استدعاء دالة rvs عينات عشوائية مستقلة من قيم المعلمات المُمكنة على استدعاءات مُتتالية.

تحذير

لا تسمح التوزيعات في scipy.stats قبل الإصدار scipy 0.16 بتحديد حالة عشوائية. بدلاً من ذلك، يستخدمون حالة numpy العشوائية العامة، والتي يمكن زرعها عبر np.random.seed أو تعيينها باستخدام np.random.set_state. ومع ذلك، بدءًا من scikit-learn 0.18، تُعيِّن وحدة sklearn.model_selection الحالة العشوائية التي يُوفرها المستخدم إذا كان scipy >= 0.16 مُتاحًا أيضًا.

بالنسبة للمعلمات المُستمرة، مثل C أعلاه، من المهم تحديد توزيع مُستمر للاستفادة الكاملة من العشوائية. بهذه الطريقة، ستؤدي زيادة n_iter دائمًا إلى بحث أدق.

متغير عشوائي لوغاريتمي مُستمر مُوحد هو الإصدار المُستمر لـ معلمة مُتباعدة لوغاريتميًا. على سبيل المثال، لتحديد ما يُعادل C من أعلى، يمكن استخدام loguniform(1, 100) بدلاً من [1, 10, 100].

بمُحاكاة المثال أعلاه في البحث الشبكي، يمكننا تحديد متغير عشوائي مُستمر موزع بشكل لوغاريتمي مُوحد بين 1e0 و 1e3:

from sklearn.utils.fixes import loguniform
{'C': loguniform(1e0, 1e3),
 'gamma': loguniform(1e-4, 1e-3),
 'kernel': ['rbf'],
 'class_weight':['balanced', None]}

أمثلة

  • مقارنة البحث العشوائي والبحث الشبكي لتقدير فرط المعلمات تُقارن استخدام وكفاءة البحث العشوائي والبحث الشبكي.

المراجع

  • Bergstra, J. and Bengio, Y., البحث العشوائي لتحسين المعلمات الفائقة, The Journal of Machine Learning Research (2012)

3.2.3. البحث عن المعلمات المثلى مع النصف المُتتالي#

يُوفر Scikit-learn أيضًا مُقدِّري HalvingGridSearchCV و HalvingRandomSearchCV اللذين يمكن استخدامهما لـ البحث في مساحة المعلمات باستخدام النصف المُتتالي [1] [2]. النصف المُتتالي (SH) يشبه دورة بين مجموعات المعلمات المُرشحة. SH هو عملية اختيار متكررة حيث يتم تقييم جميع المُرشحين (مجموعات المعلمات) بكمية صغيرة من الموارد في التكرار الأول. يتم تحديد بعض هؤلاء المُرشحين فقط للتكرار التالي، والذي سيتم تخصيص المزيد من الموارد له. بالنسبة لضبط المعلمات، يكون المورد عادةً هو عدد عينات التدريب، ولكن يمكن أيضًا أن يكون معلمة عددية عشوائية مثل n_estimators في غابة عشوائية.

ملاحظة

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

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

../_images/sphx_glr_plot_successive_halving_iterations_001.png

نصف هنا بإيجاز المعلمات الرئيسية، ولكن يتم وصف كل معلمة وتفاعلاتها بمزيد من التفصيل في الأقسام أدناه. تتحكم معلمة factor (> 1) في المعدل الذي تنمو به الموارد، و المعدل الذي يتناقص به عدد المرشحين. في كل تكرار، يتم ضرب عدد الموارد لكل مرشح في factor ويتم قسمة عدد المرشحين على نفس العامل. جنبًا إلى جنب مع resource و min_resources، factor هي أهم معلمة للتحكم في البحث في تطبيقنا، على الرغم من أن القيمة 3 تعمل عادةً بشكل جيد. factor تتحكم بشكل فعال في عدد التكرارات في HalvingGridSearchCV وعدد المرشحين (افتراضيًا) و التكرارات في HalvingRandomSearchCV. يمكن أيضًا استخدام aggressive_elimination=True إذا كان عدد الموارد المتاحة صغيرًا. يتوفر المزيد من التحكم من خلال ضبط معلمة min_resources.

لا يزال هذان المُقدِّران تجريبيين: تنبؤاتهما وواجهة برمجة التطبيقات الخاصة بهما قد تتغير دون أي دورة إهمال. لاستخدامهما، تحتاج إلى استيراد enable_halving_search_cv صراحة:

>>> # طلب هذه الميزة التجريبية صراحة
>>> from sklearn.experimental import enable_halving_search_cv  # noqa
>>> # الآن يمكنك الاستيراد بشكل طبيعي من model_selection
>>> from sklearn.model_selection import HalvingGridSearchCV
>>> from sklearn.model_selection import HalvingRandomSearchCV

أمثلة

  • مقارنة بين البحث الشبكي وتقليص الخيارات المتتابع

  • عمليات التقسيم المتتالية

3.2.3.1. اختيار min_resources وعدد المرشحين#

بجانب factor، المعلمتان الرئيسيتان اللتان تؤثران على سلوك بحث النصف المتتالي هما معلمة min_resources، و عدد المرشحين (أو مجموعات المعلمات) التي يتم تقييمها. min_resources هو مقدار الموارد المخصصة في التكرار الأول لكل مرشح. يتم تحديد عدد المرشحين مباشرةً في HalvingRandomSearchCV، ويتم تحديده من معلمة param_grid لـ HalvingGridSearchCV.

ضع في اعتبارك حالة يكون فيها المورد هو عدد العينات، وحيث لدينا 1000 عينة. من الناحية النظرية، مع min_resources=10 و factor=2، نحن قادرون على تشغيل 7 تكرارات على الأكثر بالعدد التالي من العينات: [10, 20, 40, 80, 160, 320, 640].

ولكن اعتمادًا على عدد المرشحين، قد نُجري أقل من 7 تكرارات: إذا بدأنا بعدد صغير من المرشحين، فإن التكرار الأخير قد يستخدم أقل من 640 عينة، مما يعني عدم استخدام جميع الموارد المتاحة (العينات). على سبيل المثال، إذا بدأنا بـ 5 مرشحين، فإننا نحتاج إلى تكرارين فقط: 5 مرشحين للتكرار الأول، ثم 5 // 2 = 2 مرشحين في التكرار الثاني، وبعد ذلك نعرف أي مرشح يؤدي بشكل أفضل (لذا لا نحتاج إلى مرشح ثالث). سنستخدم فقط 20 عينة على الأكثر وهو إهدار لأن لدينا 1000 عينة تحت تصرفنا. من ناحية أخرى، إذا بدأنا بعدد كبير من المرشحين، فقد ينتهي بنا الأمر بالكثير من المرشحين في التكرار الأخير، وهو ما قد لا يكون مثاليًا دائمًا: فهذا يعني أن العديد من المرشحين سيعملون بالموارد الكاملة، مما يُقلل بشكل أساسي الإجراء إلى بحث قياسي.

في حالة HalvingRandomSearchCV، يتم تعيين عدد المرشحين افتراضيًا بحيث يستخدم التكرار الأخير أكبر قدر ممكن من الموارد المتاحة. بالنسبة لـ HalvingGridSearchCV، يتم تحديد عدد المرشحين بواسطة معلمة param_grid. سيؤثر تغيير قيمة min_resources على عدد التكرارات الممكنة، ونتيجة لذلك سيكون له أيضًا تأثير على العدد المثالي للمرشحين.

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

لاحظ في المثال أعلاه أن التكرار الأخير لا يستخدم الحد الأقصى لمقدار الموارد المتاحة: 1000 عينة متاحة، ومع ذلك يتم استخدام 640 فقط، على الأكثر. افتراضيًا، يحاول كل من HalvingRandomSearchCV و HalvingGridSearchCV استخدام أكبر قدر ممكن من الموارد في التكرار الأخير، بشرط أن يكون مقدار الموارد هذا مُضاعفًا لكل من min_resources و factor (سيكون هذا القيد واضحًا في القسم التالي). HalvingRandomSearchCV يُحقق ذلك عن طريق أخذ عينات من الكمية المناسبة من المرشحين، بينما HalvingGridSearchCV يُحقق ذلك عن طريق تعيين min_resources بشكل صحيح. يرجى مراجعة استنفاد الموارد المتاحة للتفاصيل.

3.2.3.2. مقدار الموارد وعدد المرشحين في كل تكرار#

في أي تكرار i، يتم تخصيص مقدار مُعين من الموارد لكل مرشح والذي نُشير إليه بـ n_resources_i. يتم التحكم في هذه الكمية بواسطة المعلمات factor و min_resources على النحو التالي (factor أكبر تمامًا من 1):

n_resources_i = factor**i * min_resources,

أو بشكل مُكافئ:

n_resources_{i+1} = n_resources_i * factor

حيث min_resources == n_resources_0 هو مقدار الموارد المُستخدمة في التكرار الأول. تُحدد factor أيضًا نسب المرشحين الذين سيتم اختيارهم للتكرار التالي:

n_candidates_i = n_candidates // (factor ** i)

أو بشكل مُكافئ:

n_candidates_0 = n_candidates
n_candidates_{i+1} = n_candidates_i // factor

لذا في التكرار الأول، نستخدم موارد min_resources n_candidates مرة. في التكرار الثاني، نستخدم موارد min_resources * factor n_candidates // factor مرة. يضاعف الثالث مرة أخرى الموارد لكل مرشح ويقسم عدد المرشحين. تتوقف هذه العملية عندما يتم الوصول إلى الحد الأقصى لمقدار الموارد لكل مرشح، أو عندما نُحدد أفضل مرشح. يتم تحديد أفضل مرشح في التكرار الذي يُقيِّم factor أو أقل من المرشحين (انظر أدناه مباشرةً للحصول على تفسير).

فيما يلي مثال مع min_resources=3 و factor=2، بدءًا من 70 مرشحًا:

n_resources_i

n_candidates_i

3 (=min_resources)

70 (=n_candidates)

3 * 2 = 6

70 // 2 = 35

6 * 2 = 12

35 // 2 = 17

12 * 2 = 24

17 // 2 = 8

24 * 2 = 48

8 // 2 = 4

48 * 2 = 96

4 // 2 = 2

يمكننا ملاحظة ما يلي:

  • تتوقف العملية عند التكرار الأول الذي يُقيِّم factor=2 مرشحًا: أفضل مرشح هو الأفضل من بين هذين المرشحين. ليس من الضروري إجراء تكرار إضافي، لأنه سيُقيِّم مرشحًا واحدًا فقط (وهو الأفضل، الذي حددناه بالفعل). لهذا السبب، بشكل عام، نُريد أن يُجري التكرار الأخير factor مرشحًا على الأكثر. إذا كان التكرار الأخير يُقيِّم أكثر من factor مرشحين، فإن هذا التكرار الأخير يُختصر إلى بحث منتظم (كما في RandomizedSearchCV أو GridSearchCV).

  • كل n_resources_i هو مُضاعف لكل من factor و min_resources (وهو ما تؤكده تعريفه أعلاه).

يمكن العثور على مقدار الموارد المُستخدمة في كل تكرار في السمة n_resources_.

3.2.3.3. اختيار مورد#

افتراضيًا، يتم تعريف المورد من حيث عدد العينات. أي، سيستخدم كل تكرار عددًا متزايدًا من العينات للتدريب عليها. يمكنك مع ذلك تحديد معلمة يدويًا لاستخدامها كمورد باستخدام معلمة resource. فيما يلي مثال حيث يتم تعريف المورد من حيث عدد مُقدِّرات غابة عشوائية:

>>> from sklearn.datasets import make_classification
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.experimental import enable_halving_search_cv  # noqa
>>> from sklearn.model_selection import HalvingGridSearchCV
>>> import pandas as pd
>>>
>>> param_grid = {'max_depth': [3, 5, 10],
...               'min_samples_split': [2, 5, 10]}
>>> base_estimator = RandomForestClassifier(random_state=0)
>>> X, y = make_classification(n_samples=1000, random_state=0)
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
...                          factor=2, resource='n_estimators',
...                          max_resources=30).fit(X, y)
>>> sh.best_estimator_
RandomForestClassifier(max_depth=5, n_estimators=24, random_state=0)

لاحظ أنه ليس من الممكن وضع ميزانية على معلمة هي جزء من شبكة المعلمات.

3.2.3.4. استنفاد الموارد المتاحة#

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

>>> from sklearn.datasets import make_classification
>>> from sklearn.svm import SVC
>>> from sklearn.experimental import enable_halving_search_cv  # noqa
>>> from sklearn.model_selection import HalvingGridSearchCV
>>> import pandas as pd
>>> param_grid= {'kernel': ('linear', 'rbf'),
...              'C': [1, 10, 100]}
>>> base_estimator = SVC(gamma='scale')
>>> X, y = make_classification(n_samples=1000)
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
...                          factor=2, min_resources=20).fit(X, y)
>>> sh.n_resources_
[20, 40, 80]

ستستخدم عملية البحث 80 موردًا فقط على الأكثر، بينما الحد الأقصى لمقدار الموارد المتاحة لدينا هو n_samples=1000. هنا، لدينا min_resources = r_0 = 20.

بالنسبة لـ HalvingGridSearchCV، افتراضيًا، يتم تعيين معلمة min_resources إلى "exhaust". هذا يعني أنه يتم تعيين min_resources تلقائيًا بحيث يمكن للتكرار الأخير استخدام أكبر قدر ممكن من الموارد، ضمن حد max_resources:

>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
...                          factor=2, min_resources='exhaust').fit(X, y)
>>> sh.n_resources_
[250, 500, 1000]

تم تعيين min_resources هنا تلقائيًا إلى 250، مما يؤدي إلى استخدام التكرار الأخير لجميع الموارد. تعتمد القيمة الدقيقة المُستخدمة على عدد معلمات المرشح، و max_resources و factor.

بالنسبة لـ HalvingRandomSearchCV، يمكن استنفاد الموارد بطريقتين:

  • عن طريق تعيين min_resources='exhaust'، تمامًا كما هو الحال بالنسبة لـ HalvingGridSearchCV؛

  • عن طريق تعيين n_candidates='exhaust'.

كلا الخيارين مُتبادلان للاستبعاد: استخدام min_resources='exhaust' يتطلب معرفة عدد المرشحين، وبشكل متماثل n_candidates='exhaust' يتطلب معرفة min_resources.

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

3.2.3.5. الإزالة العدوانية للمرشحين#

من الناحية المثالية، نُريد أن يُقيِّم التكرار الأخير factor مرشحين (انظر مقدار الموارد وعدد المرشحين في كل تكرار). علينا بعد ذلك فقط اختيار الأفضل. عندما يكون عدد الموارد المتاحة صغيرًا بالنسبة لعدد المرشحين، قد يضطر التكرار الأخير إلى تقييم أكثر من factor مرشحين:

>>> from sklearn.datasets import make_classification
>>> from sklearn.svm import SVC
>>> from sklearn.experimental import enable_halving_search_cv  # noqa
>>> from sklearn.model_selection import HalvingGridSearchCV
>>> import pandas as pd
>>>
>>>
>>> param_grid = {'kernel': ('linear', 'rbf'),
...               'C': [1, 10, 100]}
>>> base_estimator = SVC(gamma='scale')
>>> X, y = make_classification(n_samples=1000)
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
...                          factor=2, max_resources=40,
...                          aggressive_elimination=False).fit(X, y)
>>> sh.n_resources_
[20, 40]
>>> sh.n_candidates_
[6, 3]

نظرًا لأنه لا يمكننا استخدام أكثر من max_resources=40 موردًا، فإن العملية يجب أن تتوقف عند التكرار الثاني الذي يُقيِّم أكثر من factor=2 مرشحين.

باستخدام معلمة aggressive_elimination، يمكنك إجبار عملية البحث على الانتهاء بأقل من factor مرشحين في التكرار الأخير. للقيام بذلك، ستُزيل العملية أكبر عدد ممكن من المرشحين باستخدام موارد min_resources:

>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
...                            factor=2,
...                            max_resources=40,
...                            aggressive_elimination=True,
...                            ).fit(X, y)
>>> sh.n_resources_
[20, 20,  40]
>>> sh.n_candidates_
[6, 3, 2]

لاحظ أننا انتهينا بمرشحين في التكرار الأخير لأننا أزلنا عددًا كافيًا من المرشحين خلال التكرارات الأولى، باستخدام n_resources = min_resources = 20.

3.2.3.6. تحليل النتائج باستخدام سمة cv_results_#

تحتوي سمة cv_results_ على معلومات مفيدة لتحليل نتائج البحث. يمكن تحويلها إلى إطار بيانات pandas باستخدام df = pd.DataFrame(est.cv_results_). تشبه سمة cv_results_ لـ HalvingGridSearchCV و HalvingRandomSearchCV سمة GridSearchCV و RandomizedSearchCV، مع معلومات إضافية متعلقة بعملية النصف المتتالي.

فيما يلي مثال على بعض أعمدة إطار بيانات (مُقتطع):

iter

n_resources

mean_test_score

params

0

0

125

0.983667

{'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 5}

1

0

125

0.983667

{'criterion': 'gini', 'max_depth': None, 'max_features': 8, 'min_samples_split': 7}

2

0

125

0.983667

{'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 10}

3

0

125

0.983667

{'criterion': 'log_loss', 'max_depth': None, 'max_features': 6, 'min_samples_split': 6}

...

...

...

...

...

15

2

500

0.951958

{'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10}

16

2

500

0.947958

{'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 10}

17

2

500

0.951958

{'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 4}

18

3

1000

0.961009

{'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10}

19

3

1000

0.955989

{'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 4}

يتوافق كل صف مع مجموعة معلمات مُعينة (مرشح) وتكرار مُعين. يتم إعطاء التكرار بواسطة عمود iter. يُخبرك عمود n_resources بعدد الموارد التي تم استخدامها.

في المثال أعلاه، أفضل مجموعة معلمات هي {'criterion': 'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10} لأنها وصلت إلى التكرار الأخير (3) بأعلى درجة: 0.96.

المراجع

[1]

K. Jamieson, A. Talwalkar, تحديد أفضل ذراع غير عشوائي وتحسين المعلمات الفائقة، في وقائع Machine Learning Research، 2016.

[2]

L. Li, K. Jamieson, G. DeSalvo, A. Rostamizadeh, A. Talwalkar, Hyperband: نهج جديد قائم على قطاع الطرق لتحسين المعلمات الفائقة، في Machine Learning Research 18، 2018.

3.2.4. نصائح للبحث عن المعلمات#

3.2.4.1. تحديد مقياس هدف#

افتراضيًا، يستخدم بحث المعلمات دالة score للمُقدِّر لتقييم إعداد معلمة. هذه هي sklearn.metrics.accuracy_score للتصنيف و sklearn.metrics.r2_score للانحدار. بالنسبة لبعض التطبيقات، تكون دوال التسجيل الأخرى أكثر ملاءمة (على سبيل المثال، في التصنيف غير المتوازن، غالبًا ما تكون درجة الدقة غير مفيدة). يمكن تحديد دالة تسجيل بديلة عبر معلمة scoring لمعظم أدوات بحث المعلمات. انظر معلمة scoring: تعريف قواعد تقييم النموذج لمزيد من التفاصيل.

3.2.4.2. تحديد مقاييس متعددة للتقييم#

يسمح GridSearchCV و RandomizedSearchCV بتحديد مقاييس متعددة لمعلمة scoring.

يمكن تحديد تسجيل المقاييس المتعددة إما كقائمة من سلاسل أسماء الدرجات المُعرفة مسبقًا أو قاموس يُعيِّن اسم المُسجل إلى دالة المُسجل و / أو اسم (أسماء) المُسجل المُعرف مسبقًا. انظر استخدام تقييم متعدد المقاييس لمزيد من التفاصيل.

عند تحديد مقاييس متعددة، يجب تعيين معلمة refit إلى المقياس (سلسلة) الذي سيتم العثور على best_params_ له واستخدامه لبناء best_estimator_ على مجموعة البيانات بأكملها. إذا لم يكن البحث يجب إعادة ملاءمته، فعيِّن refit=False. سيؤدي ترك refit إلى القيمة الافتراضية None إلى حدوث خطأ عند استخدام مقاييس متعددة.

انظر توضيح التقييم متعدد المقاييس على cross_val_score و GridSearchCV للحصول على مثال على الاستخدام.

HalvingRandomSearchCV و HalvingGridSearchCV لا يدعمان تسجيل المقاييس المتعددة.

3.2.4.3. مقدرات التركيب ومساحات المعلمات#

يسمح GridSearchCV و RandomizedSearchCV بالبحث على معلمات مقدرات التركيب أو المتداخلة مثل Pipeline، ColumnTransformer، VotingClassifier أو CalibratedClassifierCV باستخدام بناء جملة مُخصص <estimator>__<parameter>:

>>> from sklearn.model_selection import GridSearchCV
>>> from sklearn.calibration import CalibratedClassifierCV
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.datasets import make_moons
>>> X, y = make_moons()
>>> calibrated_forest = CalibratedClassifierCV(
...    estimator=RandomForestClassifier(n_estimators=10))
>>> param_grid = {
...    'estimator__max_depth': [2, 4, 6, 8]}
>>> search = GridSearchCV(calibrated_forest, param_grid, cv=5)
>>> search.fit(X, y)
GridSearchCV(cv=5,
             estimator=CalibratedClassifierCV(...),
             param_grid={'estimator__max_depth': [2, 4, 6, 8]})

هنا، <estimator> هو اسم معلمة المُقدِّر المتداخل، في هذه الحالة estimator. إذا تم إنشاء المُقدِّر التعريفي كمجموعة من المُقدِّرات كما في pipeline.Pipeline، فإن <estimator> يُشير إلى اسم المُقدِّر، انظر الوصول إلى المعلمات المتداخلة. في الممارسة العملية، يمكن أن يكون هناك العديد من مستويات التداخل:

>>> from sklearn.pipeline import Pipeline
>>> from sklearn.feature_selection import SelectKBest
>>> pipe = Pipeline([
...    ('select', SelectKBest()),
...    ('model', calibrated_forest)])
>>> param_grid = {
...    'select__k': [1, 2],
...    'model__estimator__max_depth': [2, 4, 6, 8]}
>>> search = GridSearchCV(pipe, param_grid, cv=5).fit(X, y)

يرجى الرجوع إلى Pipeline: سلسلة المقدرات لإجراء عمليات بحث عن المعلمات على خطوط الأنابيب.

3.2.4.4. اختيار النموذج: التطوير والتقييم#

يمكن اعتبار اختيار النموذج عن طريق تقييم إعدادات المعلمات المختلفة طريقة لاستخدام البيانات المُصنَّفة لـ "تدريب" معلمات الشبكة.

عند تقييم النموذج الناتج، من المهم القيام بذلك على عينات مُخصصة للاختبار لم تتم رؤيتها أثناء عملية البحث الشبكي: يُوصى بتقسيم البيانات إلى مجموعة تطوير (لـ تغذية مثيل GridSearchCV) و مجموعة تقييم لحساب مقاييس الأداء.

يمكن القيام بذلك باستخدام دالة الأداة المساعدة train_test_split.

3.2.4.5. التوازي#

تُقيِّم أدوات بحث المعلمات كل مجموعة معلمات على كل طية بيانات بشكل مستقل. يمكن تشغيل الحسابات بالتوازي باستخدام الكلمة الرئيسية n_jobs=-1. راجع توقيع الدالة لمزيد من التفاصيل، وكذلك إدخال المُصطلحات لـ n_jobs.

3.2.4.6. المتانة للفشل#

قد تؤدي بعض إعدادات المعلمات إلى فشل fit طية بيانات واحدة أو أكثر. افتراضيًا، سيؤدي هذا إلى فشل البحث بأكمله، حتى لو كان من الممكن تقييم بعض إعدادات المعلمات بالكامل. تعيين error_score=0 (أو =np.nan) سيجعل الإجراء متينًا لمثل هذا الفشل، مع إصدار تحذير وتعيين درجة تلك الطية إلى 0 (أو nan)، ولكن إكمال البحث.

3.2.5. بدائل للبحث الشامل عن المعلمات#

3.2.5.1. التحقق المتبادل المُخصص للنموذج#

يمكن لبعض النماذج ملاءمة البيانات لنطاق من قيم بعض المعلمات تقريبًا بنفس كفاءة ملاءمة المُقدِّر لقيمة واحدة من المعلمة. يمكن الاستفادة من هذه الميزة لإجراء تحقق متبادل أكثر كفاءة يُستخدم لاختيار نموذج هذه المعلمة.

المعلمة الأكثر شيوعًا المُوافقة لهذه الإستراتيجية هي المعلمة التي تُرمِّز قوة المُنظِّم. في هذه الحالة، نقول إننا نحسب مسار التنظيم للمُقدِّر.

فيما يلي قائمة بهذه النماذج:

linear_model.ElasticNetCV(*[, l1_ratio, ...])

Elastic Net model with iterative fitting along a regularization path.

linear_model.LarsCV(*[, fit_intercept, ...])

Cross-validated Least Angle Regression model.

linear_model.LassoCV(*[, eps, n_alphas, ...])

Lasso linear model with iterative fitting along a regularization path.

linear_model.LassoLarsCV(*[, fit_intercept, ...])

Cross-validated Lasso, using the LARS algorithm.

linear_model.LogisticRegressionCV(*[, Cs, ...])

Logistic Regression CV (aka logit, MaxEnt) classifier.

linear_model.MultiTaskElasticNetCV(*[, ...])

Multi-task L1/L2 ElasticNet with built-in cross-validation.

linear_model.MultiTaskLassoCV(*[, eps, ...])

Multi-task Lasso model trained with L1/L2 mixed-norm as regularizer.

linear_model.OrthogonalMatchingPursuitCV(*)

Cross-validated Orthogonal Matching Pursuit model (OMP).

linear_model.RidgeCV([alphas, ...])

Ridge regression with built-in cross-validation.

linear_model.RidgeClassifierCV([alphas, ...])

Ridge classifier with built-in cross-validation.

3.2.5.2. معيار المعلومات#

يمكن لبعض النماذج تقديم صيغة شكل مغلق للمعلومات النظرية لـ التقدير الأمثل لمعلمة التنظيم عن طريق حساب مسار تنظيم واحد (بدلاً من عدة مسارات عند استخدام التحقق المتبادل).

فيما يلي قائمة بالنماذج التي تستفيد من معيار معلومات Akaike (AIC) أو معيار معلومات Bayesian (BIC) لاختيار النموذج التلقائي:

linear_model.LassoLarsIC([criterion, ...])

Lasso model fit with Lars using BIC or AIC for model selection.

3.2.5.3. تقديرات خارج الحقيبة#

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

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

يتم تطبيق هذا حاليًا في الفئات التالية:

ensemble.RandomForestClassifier([...])

A random forest classifier.

ensemble.RandomForestRegressor([...])

A random forest regressor.

ensemble.ExtraTreesClassifier([...])

An extra-trees classifier.

ensemble.ExtraTreesRegressor([n_estimators, ...])

An extra-trees regressor.

ensemble.GradientBoostingClassifier(*[, ...])

Gradient Boosting for classification.

ensemble.GradientBoostingRegressor(*[, ...])

Gradient Boosting for regression.

السابق

3.1. التحقق المتبادل: تقييم أداء المقدر

التالي

3.3. ضبط عتبة القرار لتنبؤ الفئة

On this page
  • 3.2.1. بحث الشبكة الشامل
  • 3.2.2. تحسين المعلمات العشوائي
  • 3.2.3. البحث عن المعلمات المثلى مع النصف المُتتالي
    • 3.2.3.1. اختيار min_resources وعدد المرشحين
    • 3.2.3.2. مقدار الموارد وعدد المرشحين في كل تكرار
    • 3.2.3.3. اختيار مورد
    • 3.2.3.4. استنفاد الموارد المتاحة
    • 3.2.3.5. الإزالة العدوانية للمرشحين
    • 3.2.3.6. تحليل النتائج باستخدام سمة cv_results_
  • 3.2.4. نصائح للبحث عن المعلمات
    • 3.2.4.1. تحديد مقياس هدف
    • 3.2.4.2. تحديد مقاييس متعددة للتقييم
    • 3.2.4.3. مقدرات التركيب ومساحات المعلمات
    • 3.2.4.4. اختيار النموذج: التطوير والتقييم
    • 3.2.4.5. التوازي
    • 3.2.4.6. المتانة للفشل
  • 3.2.5. بدائل للبحث الشامل عن المعلمات
    • 3.2.5.1. التحقق المتبادل المُخصص للنموذج
    • 3.2.5.2. معيار المعلومات
    • 3.2.5.3. تقديرات خارج الحقيبة
إظهار المصدر

© Copyright 2007 - 2024, scikit-learn developers (BSD License) ### Translate into Arabic Eng. Ahmed Almaghz - 2024.