الوحدة 10 — ضبط المعاملات الفائقة ومشروع من طرف إلى طرف
كلّ نموذجٍ في هذه الدورة يحمل مِزلاجات: لـRidge، و لأقرب الجيران، وmax_depth للأشجار، وlearning_rate للتعزيز. وهذه المعاملات الفائقة — تُضبَط قبل التدريب ولا تُتعلَّم من البيانات — كثيراً ما تحسم أك ثر من اختيار الخوارزمية ذاته. تُبيّن هذه الوحدة الختامية كيف نضبطها بلا غشّ، ثمّ تجمع الدورة كلّها في سير عملٍ واحدٍ كامل.
البحث في فضاء المعاملات الفائقة
البحث الشبكي: شاملٌ لكن مُكلِف
يُجرّب البحث الشبكي كلّ تركيبةٍ من شبكةٍ مُعلَنة، ويُقيّم كلّاً منها بالتحقّق المتقاطع:
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(
pipe, # خطّ معالجة الوحدة 8، دوماً
param_grid={"ridge__alpha": [0.01, 0.1, 1, 10, 100]},
cv=5, scoring="neg_mean_squared_error",
)
grid.fit(X_train, y_train)
grid.best_params_, grid.best_score_
وتنفجر كلفته تركيبياً: 4 معاملات فائقة × 5 قيم = 625 تركيبة × 5 طيّات = 3125 تدريباً. مقبولٌ لمعامل أو اثنين، ومانعٌ فيما بعد ذلك.
البحث العشوائي: الافتراض الأذكى
يسحب البحث العشوائي تركيباتٍ عشوائياً من توزيعات. ومخالفٌ للبديهة لكنّه راسخ: عند تساوي الميزانية، يتجاوز عادةً البحثَ الشبكي حين تكثر المعاملات الفائقة — لأنّ قليلاً منها فقط يُهِمّ فعلاً، ولأنّ السحوبات العشوائية تستكشف قيم كلّ بُعدٍ بكثافةٍ أكبر بكثير من الشبكة.
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import loguniform, randint
search = RandomizedSearchCV(
pipe,
param_distributions={
"model__learning_rate": loguniform(0.01, 0.3),
"model__max_depth": randint(3, 8),
"model__subsample": [0.7, 0.8, 0.9],
},
n_iter=60, cv=5, scoring="roc_auc", n_jobs=-1, random_state=42,
)
لاحظ loguniform لمعاملات المقياس — فالفرق بين 0.01 و0.1 أهمّ من الفرق بين 0.2 و0.3. وفيما بعد هذين، يُوجّه التحسين البايزي (Optuna) البحث نحو المناطق الواعدة؛ وهو جديرٌ بالعناء حين يكون كلّ تدريبٍ مُكلِفاً.
الضبط بلا كذبٍ على الذات
تنطبق قواعد الوحدة 8 بكلّ قوّتها. فيجب أن يجري البحث على بيانات التدريب وحدها، مع خطّ المعالجة داخل التحقّق المتقاطع (تُعاد تركيب المعالجة لكلّ طيّة). ولأنّ نتيجة البحث نفسها مُنحازة تفاؤلياً — إذ احتفظتَ بالتركيبة التي جمّلت طيّات التحقّق — يجري القياس النهائي مرّةً واحدة، على مجموعة الاختبار المختومة من الوحدة 1.
المشروع من طرف إلى طرف: الدورة كلّها بالترتيب
غُطّيت كلّ القطع؛ وهذا ترتيب تجميعها — قائمة التحقّق لأيّ مشروع مُوجَّه:
- الصياغة (الوحدة 1): الهدف، المتغيّرات المتاحة لحظة التنبّؤ، انحدارٌ أم تصنيف، والمقياس المختار سلفاً (الوحدة 9)؛
- التقسيم: مجموعة اختبارٍ مختومة،
stratifyإن كان تصنيفاً، وتقسيمٌ زمني إن كانت البيانات زمنية (الوحدة 8)؛ - خطّ الأساس: نموذجٌ بسيط — انحدارٌ خطّي أو لوجستي منظَّم (الوحدتان 2 و3). يضع السقف وقد يكفي أحياناً؛
- خطّ المعالجة: معالجةٌ مسبقة + نموذج، والتسرّب مستحيلٌ (الوحدة 8)؛
- الترقّي في القوّة: غابةٌ عشوائية مرجعاً متيناً (الوحدة 6)، ثمّ تعزيزٌ مع إيقافٍ مبكّر لكسب النقاط الأخيرة (الوحدة 7)؛
- الضبط: بحثٌ عشوائي مع تحقّقٍ متقاطع، على المقياس المختار في الخطوة 1؛
- القياس النهائي: مرورٌ واحدٌ فقط على مجموعة الاختبار — وهو الرقم القابل للإبلاغ؛
- الشرح: المعاملات، أهمّية التبديل (الوحدة 6)، وتحليلٌ رصينٌ للأخطاء.
قد يحلّ انحدارٌ لوجستي مضبوط على مسافة نقطةٍ واحدة من تعزيزٍ مضبوط — بجزءٍ ضئيل من التعقيد، ومعاملاتٍ مقروءة زيادةً على ذلك. وتخطّي خطّ الأساس يعني حرمان نفسك من المسطرة التي تُخبرك إن كان التعقيد الإضافي يُجدي فعلاً.
الخلاصة
- تُضبَط المعاملات الفائقة قبل التدريب؛ ونضبطها بالبحث، لا بالعين أبداً.
- يتجاوز البحث العشوائي عادةً الشبكيَّ عند تساوي الميزانية حين تكثر المِزلاجات؛ و
loguniformلمعاملات المقياس. - يجري البحث على بيانات التدريب مع خطّ المعالجة داخل التحقّق المتقاطع؛ وتُستعمل مجموعة الاختبار مرّةً واحدة في النهاية القصوى.
- سير العمل — صياغة، تقسيم، خطّ أساس، خطّ معالجة، ترقٍّ، ضبط، قياس، شرح — هو المكسب الحقيقي من الدورة.
تبقى خطوةٌ واحدة: المراجعة والاختبار من 40 سؤالاً الذي يُصادِق على الدورة كلّها.