انتقل إلى المحتوى الرئيسي

الوحدة 7 — الخوارزميات المتاحة وقيودها

بعد Pipeline، السؤال البديهيّ: ماذا نضع في نهايته؟ ثمّة إغراء بالإجابة «كلّ ما لدى scikit-learn». الحقيقة أقلّ رحابةً: MLlib تعرض عائلات محدَّدة، ولكلّ عائلة قيودها الموزَّعة. هذه الوحدة تُقدِّم الخريطة، وتُحدِّد الغائب، وتقترح بدائل واقعيّة.

الانحدار الخطّي واللوجستيّ

LinearRegression و LogisticRegression قواعد كلّ عمل مع MLlib. تعرض تنظيمًا L1 و L2 مختلطًا بمعلمة elasticNetParam بين 0 و 1. يعمل الأخير بمُستمثِل L-BFGS الموزَّع افتراضيًّا، ويمكن استبداله بـ IRLS أو SGD حسب البيانات.

قيد ملحوظ: الانحدار اللوجستيّ متعدّد الأصناف يعمل، لكنّه أقلّ نضجًا من نظيره في scikit-learn. لبضعة آلاف من الأصناف يفشل. البديل الطبيعي: النزول إلى شجرة قرار كبيرة أو غابة عشوائيّة.

أشجار القرار والغابات والتعزيز

DecisionTreeClassifier، RandomForestClassifier، GBTClassifier (Gradient Boosting)، مع نظائرها للانحدار. يعمل التدريب موزَّعًا: يُقسَّم البحث عن انقسام في كلّ عقدة على المنفّذين. أعمدة features مُمثَّلة كمتّجهات كثيفة أو متفرّقة، ولا فرق كبير في السرعة.

قيود مهمّة:

  • العمق الأقصى محدَّد: maxDepth يقف عند 30 (قيد بنية العدد الصحيح لتوصيف عقد الشجرة). فوق ذلك تتفكّك المرجعيّة الداخليّة.
  • GBT لا يدعم متعدّد الأصناف: مُنفَّذ للتصنيف الثنائي والانحدار فقط. لثلاثة أصناف فأكثر، اِستعمل RandomForest.
  • الشجرة الواحدة لا تُطبَع كما في scikit-learn: لا تصوير مباشر ولا plot_tree. تحصل على أهمّيات المتغيّرات (featureImportances) فقط.

عناقيد k-means و Bisecting k-means

KMeans مُنفَّذ بشكل موزَّع بمرحلة تجميع اعتيادية. BisectingKMeans يعمل هرميًّا. لِلبيانات الضخمة، KMeans|| (الإصدار الموزَّع لـk-means++) يُهيِّئ المراكز بشكل أفضل من random.

القيد: لا DBSCAN، لا HDBSCAN، لا GaussianMixture (بالمعنى الكامل). التجميع في MLlib يعني عمليًّا k-means وسلالته.

ALS للتوصية

ALS (Alternating Least Squares) هو خوارزميّة MLlib الفريدة التي لا تجد نظيرًا مباشرًا في scikit-learn. عوامل خفيّة لِلمستخدم والمُنتَج على مصفوفة تقييمات نادرة، مُدَّرَبة بالتناوب بين تحديث عوامل المستخدمين وعوامل المُنتَجات. يعمل على مليارات التقييمات. لِبناء نظام توصية موزَّع، هذا هو الحلّ الطبيعيّ في Spark، وستكرِّس الدورة 35 مقاربات أوسع للتوصية.

MultilayerPerceptronClassifier

الشبكة العصبيّة الوحيدة في MLlib. تسمح بطبقات متّصلة اتّصالًا كاملًا، بدوال تنشيط سيغمويد فقط، بلا dropout ولا تسوية دفعات ولا شيء من الحديث. مفيدة للعرض، لا للإنتاج. لا يوجد Deep Learning داخل MLlib.

ما ينقص فعلًا

قائمة الغائب أقصر من الحاضر لكنّها موجعة:

  • XGBoost و LightGBM: التطبيق الموزَّع الأصلي في MLlib غير موجود. الحلّ: مكتبة xgboost4j-spark (من فريق DMLC) تندمج مع Pipeline وتعمل جيّدًا على عناقيد ضخمة. LightGBM يقدّم SynapseML من مايكروسوفت. اختيار XGBoost أو LightGBM قرار شائع رغم كلفة إضافة اعتماديّة خارجيّة.
  • Deep Learning الحقيقيّ: لِتدريب شبكة عصبيّة على عنقود، تنتقل إلى TensorFlow (مع MultiWorkerMirroredStrategy)، أو PyTorch (مع DistributedDataParallel)، أو Horovod (طبقة موحِّدة). Spark يُعالِج البيانات، والإطار العميق يُدرِّب.
  • SVM حقيقيّ: LinearSVC موجود، لكن لا RBF SVM — تعقيده التربيعيّ لا يوزَّع بسهولة، وتخلّت المكتبة عنه.
  • معالجة نصوص متقدِّمة: يوجد Tokenizer، StopWordsRemover، HashingTF، IDF، Word2Vec. لكن لا تحضيرات كاملة كـ spaCy ولا نماذج مُهيَّأة. المهام الأثقل تُنقَل إلى Spark NLP من John Snow Labs.

متى يفوز التدريب المحلّي

سؤال حاسم: هل يستحقّ التدريب الموزَّع تكلفة إعداده؟ إذا كان جدولك بعد التمهيد يسع ذاكرة آلة واحدة (بضعة غيغابايت)، اِنقله محلّيًّا إلى pandas + XGBoost أو LightGBM. النموذج يُدرَّب في دقائق بأدوات ناضجة، ثمّ يُوزَّع لِلاستدلال فقط. Spark ML مفيد حين حجم التدريب نفسه يفوق آلة واحدة، لا حجم البيانات الخام.

الأنماط الأشيع نجاحًا
  • تنقية موزَّعة + تدريب محلّي: تُنقّي بـSpark، تكتب Parquet مصغَّرًا، تدرِّب بـLightGBM على آلة واحدة.
  • تدريب موزَّع بـ XGBoost4J-Spark: لِلحالات التي تحتاج التدريب على مئات ملايين السطر ولا يمكن تصغيرها بعيّنة صادقة.
  • Spark + Ray: نمط متقدِّم يعرض عنقود Spark بيانات، وعنقود Ray يُدرِّب. هذا صار المعمار المرجعيّ في Databricks الحديث.

الخلاصة

  • الانحدار والأشجار (GBT، RandomForest) والعناقيد (k-means) و ALS هم النواة العمليّة لِـMLlib.
  • XGBoost / LightGBM غائبان أصلًا، لكنّ إضافتهما ممكنة بمكتبات خارجيّة صارت معيارًا صناعيًّا.
  • الشبكات العصبيّة الحقيقيّة خارج MLlib: تُدرَّب في TensorFlow أو PyTorch، وSpark يُهيِّئ البيانات.
  • إذا سعى جدولك بعد التنقية في آلة واحدة، اِنقل التدريب محلّيًّا. Spark ML مفيد حين حجم التدريب نفسه يستدعي التوزيع.

الوحدة التالية: ضبط الأداء، عدد الأقسام، مقاومة عدم توازن المفاتيح، وقراءة واجهة Spark UI.