بايثونتعلم الآلةعلم البيانات

Scikit-Learn: استخدام ترميز التسميات عبر أعمدة متعددة

دليل أكاديمي شامل يشرح كيفية تطبيق ترميز التسميات (Label Encoding) عبر أعمدة متعددة في Scikit-Learn وPandas مع أفضل الممارسات البرمجية.

تاريخ النشر

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

ضمن المنظومة البرمجية للغة بايثون، تتربع مكتبة Scikit-Learn على عرش أدوات المعالجة المسبقة والنمذجة الخوارزمية، بفضل تصميمها المعياري الأنيق وواجهاتها البرمجية الموحدة. وتوفر المكتبة حزمة من الأدوات المخصصة للتحويل العددي، يأتي في طليعتها محول ترميز التسميات المعروف بفئة LabelEncoder. غير أن الممارسة العملية في معالجة مجموعات البيانات الحقيقية تفرض تحديات هيكلية دقيقة؛ إذ صُممت هذه الفئة في أصلها لمعالجة متجهات المتغير التابع المستهدف أحادية البعد، مما يخلق عائقاً برمجياً ومنهجياً عند رغبة مهندس البيانات في تطبيق هذا التحويل على مصفوفات متعددة الأعمدة دفعة واحدة داخل أطر بيانات Pandas.

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

1. مقدمة شاملة حول معالجة البيانات الفئوية في تعلم الآلة

1.1 طبيعة البيانات الفئوية وتحدياتها في النماذج الخوارزمية

تمثل البيانات الفئوية (Categorical Data) قطاعاً واسعاً من المعلومات التي يتم جمعها في قواعد البيانات الواقعية، وهي تصف سمات أو خصائص نوعية بدلاً من المقادير العددية القابلة للقياس المباشر. وتنقسم هذه البيانات بنيوياً إلى نوعين رئيسيين: المتغيرات الفئوية الاسمية (Nominal Variables) التي تفتقر بطبيعتها إلى أي ترتيب هرمي أو منطقي ضمني، مثل أسماء الدول، أو الألوان، أو أنواع المعاملات المصرفية؛ والمتغيرات الفئوية الترتيبية (Ordinal Variables) التي تمتلك تدرجاً قيمياً واضحاً ذا دلالة، مثل المستويات التعليمية (ابتدائي، ثانوي، جامعي) أو تقييمات رضا العملاء (منخفض، متوسط، مرتفع).

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

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

1.2 موقع مرحلة المعالجة المسبقة في خط سير تعلم الآلة (ML Pipeline)

تتموضع مرحلة المعالجة المسبقة للبيانات كحلقة وصل حرجة بين استخراج البيانات الخام من مصادرها التخزينية ومرحلة التدريب الخوارزمي المتقدمة ضمن خط سير تعلم الآلة (ML Pipeline). يمر تدفق البيانات المعياري بسلسلة من المراحل المتتابعة التي تبدأ بتنظيف الشوائب والتعامل مع القيم الشاذة، تليها معالجة القيم المفقودة، ثم هندسة وترميز المتغيرات الفئوية، وصولاً إلى مقايسة الخصائص (Feature Scaling) وتمرير المصفوفات النهائية إلى نماذج التعلم. إن أي خلل منهجي في هذه المرحلة التحويلية يمتد تأثيره السلبي عبر كامل خط السير وفق مبدأ “المدخلات الرديئة تنتج مخرجات رديئة” (Garbage In, Garbage Out).

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

تلعب المكتبات القياسية في بايثون، وبشكل خاص Scikit-Learn بالتعاون مع Pandas، دوراً حاسماً في توحيد هذه المعايير الهندسية. فهي توفر فئات برمجية تتكامل بسلاسة مع هياكل الأنابيب الموحدة Pipeline، مما يضمن خضوع جميع مجموعات البيانات الفرعية لنفس القواعد والتحويلات الإحصائية دون تدخل يدوي عرضة للأخطاء البشرية، وهو ما يرفع من قابلية تكرار التجارب العلمية واختبار النماذج البرمجية بكفاءة وموثوقية.

2. الأساس النظري لتقنية ترميز التسميات (Label Encoding)

2.1 التعريف الرياضي والإجرائي لترميز التسميات

يُعرف ترميز التسميات (Label Encoding) إجرائياً بأنه أسلوب لتحويل مجموعة من القيم الفئوية المنفصلة والمتمايزة إلى أرقام صحيحة غير سالبة متتالية تبدأ عادة من الصفر وحتى العدد الكلي للفئات الفريدة منقوصاً منه واحد. رياضياً، يمكن تمثيل هذا التحويل كدالة تطبيقية تقابلية (Bijective Function) أو اقتران أحادي الإسقاط يُرمز له بالدالة:

f: S → {0, 1, 2, …, k – 1}

حيث تمثل S مجموعة الفئات الفريدة المنتهية داخل العمود الفئوي، ويمثل k عدد تلك الفئات، بحيث تقابل كل قيمة فئوية si قيمة عددية صحيحة وحيدة ni لا تتكرر لغيرها ضمن نطاق التطبيق.

تعتمد آلية الفهرسة التلقائية في معظم التطبيقات البرمجية على استخراج الفئات الفريدة وترتيبها وفق المعيار الأبجدي المعجمي (Lexicographical Order) أو حسب أسبقية الظهور في مجموعة البيانات. فإذا كان لدينا عمود يحتوي على أسماء مدن مثل: [“القاهرة”، “الرياض”، “بيروت”]، فإن عملية الترتيب الأبجدي ستسند الرقم 0 إلى “الرياض”، والرقم 1 إلى “القاهرة”، والرقم 2 إلى “بيروت”.

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

2.2 المزايا الحسابية لترميز التسميات

يتمتع ترميز التسميات بمزايا حسابية فائقة تجعله خياراً جذاباً في العديد من السيناريوهات العملية، وفي مقدمتها الحفاظ التام على الأبعاد الهندسية لمصفوفة البيانات. فعلى العكس من تقنيات مثل الترميز أحادي الساخن (One-Hot Encoding) الذي يوسع فضاء الميزات بإضافة أعمدة جديدة مساوية لعدد الفئات، يحتفظ ترميز التسميات بعمود واحد فقط لكل متغير، مما يمنع تضخم أبعاد المصفوفة ويحافظ على بنية متراصة للبيانات.

تنعكس هذه السمة مباشرة على الكفاءة الاستثنائية في استهلاك الذاكرة الحسابية (RAM) وسرعة المعالجة؛ حيث يتم تخزين المتغيرات كأرقام صحيحة من أحجام مدمجة تستهلك مساحة تخزينية ضئيلة للغاية مقارنة بالمصفوفات المتفرقة الكبيرة. يساهم هذا التقليص في سرعة قراءة وكتابة البيانات ونقلها عبر ناقلات الذاكرة الداخلية أثناء تدريب النماذج الحسابية المعقدة.

تعد الخوارزميات المعتمدة على الأشجار، مثل أشجار القرار (Decision Trees) والغابات العشوائية (Random Forests) ونماذج تعزيز التدرج مثل XGBoost وLightGBM، المستفيد الأكبر من ترميز التسميات. فهذه الخوارزميات تعتمد على تقسيم البيانات عبر عتبات رقمية متتالية ولا تعتمد على المسافات الجبرية، مما يجعل التعامل مع الفئات كأرقام متسلسلة ملائماً جداً لقدرتها على عزل الفئات عند العقد التفريعية بفعالية عالية وبأقل تكلفة حسابية ممكنة.

2.3 القيود المنهجية والمخاطر الإحصائية

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

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

كذلك تنهار الخوارزميات القائمة على المسافات الإقليدية مثل خوارزمية الجار الأقرب (K-Nearest Neighbors) وآلات المتجهات الداعمة (Support Vector Machines) عند تطبيق ترميز التسميات على المتغيرات الاسمية؛ حيث تحسب هذه الخوارزميات البعد الفضائي بين النقاط، فتعتبر الفئة 0 والفئة 1 متقاربتين جداً في الفضاء الرياضي مقارنة بالفئة 0 والفئة 2، بالرغم من أن الفئات الثلاث قد تكون متساوية البعد مفاهيمياً. هذا التشويه الفضائي يولد تقييمات مضللة لمدى تقارب العينات ويؤثر سلباً على جودة التصنيف أو التجميع.

3. بنية مكتبة Scikit-Learn ووحدة المعالجة المسبقة sklearn.preprocessing

3.1 المعمارية البرمجية للمحولات (Transformers) في Scikit-Learn

تستند مكتبة Scikit-Learn في تصميمها البرمجي إلى أنماط التصميم كائنية التوجه الموحدة (Object-Oriented Design Patterns)، مما يمنحها قوة هائلة واتساقاً منقطع النظير عبر كافة أدواتها. وتعتمد وحدة المعالجة المسبقة sklearn.preprocessing على مفهوم “المحولات” (Transformers)، وهي أصناف برمجية تنفذ ثلاث دوال أساسية تمثل بروتوكول التحويل الموحد: دالة الملاءمة fit()، ودالة التحويل transform()، والدالة المدمجة fit_transform().

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

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

3.2 نظرة دقيقة على فئة LabelEncoder المصممة للمتغير الهدف

صُممت فئة LabelEncoder في وثائق ومستودعات Scikit-Learn الرسمية لغرض وظيفي محدد بدقة: ترميز المتغير التابع أو الهدف (Target Variable y) في مهام التصنيف متعدد الفئات، وليس لمعالجة مصفوفات الخصائص المدخلة (Input Features X). يظهر هذا التخصيص في التوقيع البرمجي للدالة وطريقة معالجتها للبيانات المدخلة؛ حيث تتوقع الفئة استقبال متجه أحادي البعد بطول العينات فقط (n_samples,)، لتقوم بتحويل نصوص التصنيفات إلى أرقام صحيحة.

تفرض هذه الفلسفة التصميمية قيوداً برمجية صارمة تمنع تمرير مصفوفات ثنائية الأبعاد (n_samples, n_features) إلى كائن LabelEncoder مباشرة. فعند محاولة تمرير جدول أو إطار بيانات متعدد الأعمدة، تطلق الدالة استثناءات برمجية تفيد بعدم ملاءمة الأبعاد، لأنها ليست مهيأة لحفظ سمات فئوية متعددة ومنفصلة لكل عمود على حدة داخل كائن واحد.

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

4. تحدي تطبيق ترميز التسميات على أعمدة متعددة في بايثون

4.1 أسباب فشل التنفيذ المباشر باستخدام LabelEncoder()

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

le.fit_transform(df[['feature1', 'feature2']])

وهو ما يؤدي فوراً إلى إطلاق استثناء من نوع ValueError أو TypeError يشير إلى أن أبعاد البيانات المدخلة غير متوافقة مع المتوقع، محذراً من تمرير مصفوفة ثنائية الأبعاد بشكل (n_samples, 2) إلى دالة تتطلب شكلاً أحادي البعد (n_samples,).

يعود السبب الجذري لهذا الفشل إلى الكيفية التي تم بها بناء المنطق الداخلي لـ LabelEncoder داخل Scikit-Learn؛ حيث تعتمد خوارزمية الترتيب وتوليد الفئات على دالة numpy.unique() المطبقة على متجه مفرد مسطح. فعند تمرير مصفوفة ثنائية الأبعاد، تحاول الدالة إما تسطيح المصفوفة بالكامل مما يخلط فئات الأعمدة المختلفة في فضاء ترقيمي موحد ومشوه، أو تفشل في تفسير الأعمدة المستقلة وتطلق الخطأ المذكور لوقف التنفيذ الخاطئ.

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

4.2 الحلول البرمجية التقليدية غير الفعالة

يلجأ العديد من المبرمجين في بداية تعاملهم مع هذه المشكلة إلى كتابة حلقات تكرارية يدوية (Manual for loops) للمرور على قائمة الأعمدة الفئوية وتطبيق كائن LabelEncoder على كل عمود على حدة. ورغم أن هذا الأسلوب يحقق الغرض الظاهري بتشفير البيانات، إلا أنه يمثل ممارسة برمجية ضعيفة تعاني من عيوب هيكلية متعددة، من أبرزها تكرار الكود وانخفاض قابليته للقراءة والصيانة، وبطء التنفيذ مقارنة بالعمليات الموجهة (Vectorized Operations).

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

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

5. استخدام الدالة apply في Pandas لترميز أعمدة متعددة بكفاءة

5.1 الصيغة البرمجية القياسية وتفكيك آليتها

توفر مكتبة Pandas حلاً برمجياً عالي الكفاءة لتطبيق الدوال عبر محاور أطر البيانات باستخدام الدالة الشهيرة apply(). تتيح هذه الدالة تطبيق كائن LabelEncoder على مجموعة محددة من الأعمدة الفئوية دفعة واحدة عبر صياغة برمجية مدمجة وأنيقة تتجاوز قيود الحلقات التكرارية التقليدية. وتتخذ الصيغة البرمجية القياسية النمط التالي:

df[categorical_cols] = df[categorical_cols].apply(lambda col: LabelEncoder().fit_transform(col))

تعتمد آلية عمل هذه الصياغة على تمرير كل عمود محدد داخل categorical_cols كسلسلة بيانات أحادية البعد من نوع pandas.Series إلى الدالة المجهولة (Lambda Function). داخل هذه الدالة، يتم إنشاء نسخة جديدة تماماً ومستقلة من كائن LabelEncoder، ويتم استدعاء الدالة fit_transform() على السلسلة المفردة، وهو ما يتطابق تماماً مع متطلبات الأبعاد الأحادية للفئة.

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

5.2 التحكم في اختيار الأعمدة الفئوية ديناميكياً

تتطلب كتابة أكواد برمجية متينة ومستدامة تجنب الإدخال اليدوي الصريح لأسماء الأعمدة المراد ترميزها، خاصة في مجموعات البيانات الكبيرة والمتغيرة. توفر مكتبة Pandas التابع المتقدم select_dtypes() الذي يتيح فحص أنواع البيانات وتحديد الأعمدة المستهدفة ديناميكياً وفق المعايير البرمجية:

categorical_cols = df.select_dtypes(include=['object', 'category']).columns

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

يضمن هذا الأسلوب أيضاً حماية الأعمدة الرقمية (سواء كانت أعداداً صحيحة int أو أعداداً عشرية float) من التعرض لعمليات تشفير غير مقصودة قد تشوه مدلولاتها الحسابية أو تحول قيمها المتصلة إلى تصنيفات متقطعة، مما يحافظ على السلامة الهيكلية للبيانات الكمية طوال مراحل المعالجة المسبقة.

5.3 التعامل مع القيم المفقودة (NaNs) أثناء التشفير بالدالة apply

يمثل وجود القيم المفقودة أو الفارغة (Missing Values / NaN) عقبة كبرى عند استخدام LabelEncoder؛ حيث يتعامل هذا المحول مع القيمة المفقودة كسلسلة نصية عادية أو قد يفشل تماماً بإطلاق استثناءات برمجية تبعاً لإصدار Scikit-Learn ونوع البيانات في بايثون. في الإصدارات الحديثة، إذا احتوى العمود على قيم مفقودة ككائنات عائمة np.nan متداخلة مع نصوص، ستفشل دالة الترتيب الأبجدي في المقارنة بين الأنواع المختلفة مطلقة خطأ TypeError: '<' not supported between instances of 'float' and 'str'.

تفرض الممارسة الهندسية السليمة معالجة القيم المفقودة كخطوة استباقية إلزامية قبل الشروع في تشفير التسميات. يمكن تبني استراتيجيتين رئيسيتين في هذا السياق:

  • الاستراتيجية الأولى (الملء بفئة صريحة): ملء الخانات الفارغة بقيمة نصية دالة مثل “Missing” أو “غير معروف” عبر الدالة df[col].fillna('Missing'). ينتج عن هذا الأسلوب تخصيص رقم مشفر مستقل لفئة القيم المفقودة، مما يسمح للنماذج المعتمدة على الأشجار بالاستفادة من نمط الفقدان كمعلومة تنبؤية بحد ذاتها.
  • الاستراتيجية الثانية (العزل والإسناد اللاحق): تشفير القيم غير المفقودة فقط ثم إعادة إدراج القيم الفارغة كـ NaN رقمي في العمود المشفر، ليتم التعامل معها لاحقاً عبر أدوات التعويض الإحصائي المتقدمة مثل KNNImputer أو SimpleImputer.

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

6. تطبيق عملي خطوة بخطوة: ترميز مجموعة بيانات رياضية متكاملة

6.1 إنشاء إطار البيانات وتجهيز البيئة البرمجية

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

تتضمن المكتبات الأساسية الواجب استدعاؤها كلاً من pandas لإدارة الجداول، وnumpy للعمليات الرياضية، ووحدة sklearn.preprocessing لاستيراد كائن LabelEncoder. نقوم بعد ذلك بإنشاء إطار البيانات الافتراضي الذي يضم أعمدة مثل اسم الفريق (Team)، ومركز اللعب (Position)، وحالة الانضمام لفريق النجوم (All_Star)، إضافة إلى مقاييس عددية كالعمر (Age) ومعدل النقاط (Points_Per_Game).

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

6.2 تنفيذ كود الترميز المتعدد وفحص التغييرات الهيكلية

ننتقل الآن إلى كتابة الشيفرة البرمجية الموحدة لتطبيق الترميز على كافة الأعمدة الفئوية المستهدفة دفعة واحدة. نحدد أولاً أسماء الأعمدة المطلوب تحويلها، وهي أعمدة ['team', 'position', 'all_star']، ثم نطبق دالة apply بالاقتران مع LabelEncoder كما هو موضح بالمنهجية التالية:

يقوم المحرك البرمجي بمعالجة كل عمود على حدة عبر تحويل القيم النصية في عمود الفريق (مثل: “Hawks”, “Bulls”, “Lakers”) إلى أرقام صحيحة، وتكرار نفس العملية لعمود مراكز اللعب (مثل: “Guard”, “Forward”, “Center”) وعمود حالة النجومية (مثل: “Yes”, “No”).

بمقارنة مصفوفة البيانات قبل وبعد التنفيذ، نلاحظ تحول القيم النصية بالكامل إلى أرقام صحيحة تبدأ من الصفر داخل نفس الأعمدة، مع بقاء الأعمدة العددية الأصلية مثل Age وPoints_Per_Game دون أي تعديل أو تغيير. كما يؤكد فحص الخصائص النمطية للأعمدة تحولها من النمط object إلى النمط الصحيح المدمج int64 أو int32، مما يؤكد نجاح التحويل البرمجي وتوافق المصفوفة التام مع متطلبات خوارزميات التعلم الآلي.

6.3 التحقق من صحة الإسقاط وتطابق الترتيب الأبجدي

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

يمكن بناء معجم تحليلي يوثق هذه المطابقة من خلال استخراج الفئات المشفرة ومقارنتها بقيمها الرقمية المقابلة. يوضح هذا التوثيق أن الفئات قد رُتبت معجمياً بدقة متناهية؛ فعلى سبيل المثال في عمود مراكز اللعب، تأخذ الفئة “Center” الرقم 0 لسبقها الأبجدي، تليها “Forward” بالرقم 1، ثم “Guard” بالرقم 2.

يعد الاحتفاظ بهذا المعجم التوثيقي (Mapping Dictionary) خطوة جوهرية لا غنى عنها؛ فهو المرجع الأساسي الذي يعتمد عليه علماء البيانات وخبراء الأعمال لاحقاً لتفسير مخرجات النماذج التنبؤية، مثل فهم أوزان الخصائص أو قراءة قواعد اتخاذ القرار في الأشجار التنبؤية عند إعادة ترجمة الأرقام إلى معانيها الواقعية.

7. البديل المعياري الموصى به: استخدام OrdinalEncoder في Scikit-Learn

7.1 التعريف بفئة OrdinalEncoder والفروق الهندسية مع LabelEncoder

استجابة للتعقيدات والارتباك البرمجي الذي سببه استخدام LabelEncoder على ميزات الإدخال، طوّر فريق Scikit-Learn المحول المعياري الموصى به رسمياً: فئة OrdinalEncoder. صُممت هذه الفئة هندسياً منذ البداية للتعامل المباشر مع مصفوفات الميزات ثنائية الأبعاد (n_samples, n_features)، مما يجعلها البديل المباشر والأنظف لمعالجة الأعمدة المتعددة دفعة واحدة.

يتمثل الفارق المعماري الأبرز في قدرة OrdinalEncoder على استقبال إطار البيانات بالكامل أو مجموعة الأعمدة الفئوية وتطبيق التحويل بأمر برمجي مباشر encoder.fit_transform(df[categorical_cols]) دون الحاجة لكتابة دوال apply أو استخدام تعبيرات Lambda وسيطة. يقوم الكائن تلقائياً بإنشاء مصفوفات تحويل منفصلة لكل عمود، مع تخزين الفئات الفريدة لكل ميزة في قائمة مصفوفات يمكن الوصول إليها بسهولة عبر الخاصية العامة categories_.

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

7.2 التعامل مع الفئات غير المرئية (Unknown Categories) أثناء الاختبار

تواجه النماذج في بيئات الإنتاج الحقيقية مشكلة متكررة تتمثل في ظهور فئات جديدة لم تكن موجودة إطلاقاً في بيانات التدريب (Unseen/Unknown Categories). في هذه الحالة، يتصرف كائن LabelEncoder بجمود مطلق، حيث يطلق فوراً استثناء برمجياً قاتلاً من نوع ValueError: y contains previously unseen labels، مما يؤدي إلى تعطل كامل لخط الإنتاج وعجز النموذج عن تقديم تنبؤات.

على النقيض من ذلك، يتضمن OrdinalEncoder آليات مرنة واستباقية فائقة التطور للتعامل مع الفئات غير المرئية عبر المعامل المتقدم handle_unknown='use_encoded_value' المقترن بتحديد قيمة بديلة للمجهول مثل unknown_value=-1 أو np.nan. تتيح هذه الميزة للمحول الاستمرار في العمل بسلاسة عند مصادفة قيمة غريبة أثناء مرحلة الاختبار أو التشغيل الفعلي، حيث يقوم بإسناد القيمة المحددة لها مباشرة دون إيقاف النظام البرمجي.

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

7.3 التكامل مع ColumnTransformer لتخصيص عمليات الترميز

تكمن القوة الحقيقية لـ OrdinalEncoder في قدرته على الاندماج التام داخل فئة ColumnTransformer، وهي الأداة القياسية في Scikit-Learn لتطبيق عمليات معالجة مسبقة متمايزة على أعمدة مختلفة بالتوازي ضمن كائن موحد. يتيح هذا التكامل بناء خطوط أنابيب بالغة التعقيد والتنظيم بأقل قدر من الشيفرات البرمجية.

باستخدام ColumnTransformer، يستطيع مهندس البيانات تحديد تطبيق OrdinalEncoder على المتغيرات الترتيبية أو المتغيرات الموجهة لنماذج الأشجار، وتطبيق OneHotEncoder بالتوازي على المتغيرات الاسمية منخفضة التعددية، وتطبيق StandardScaler على المتغيرات الرقمية المستمرة، كل ذلك ضمن بنية برمجية موحدة تُدار بأمر استدعاء واحد.

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

8. بناء محول مخصص متوافق مع خطوط أنابيب Scikit-Learn

8.1 وراثة الفئات BaseEstimator وTransformerMixin

للمطورين الذين يفضلون الاحتفاظ بسلوك LabelEncoder المستقل لكل عمود مع الحفاظ على التوافق الصارم مع معمارية أنابيب Scikit-Learn، يمكن بناء صنف برمجي مخصص (Custom Transformer) عبر الاستفادة من آليات الوراثة الكائنية. يتم ذلك من خلال وراثة الفئتين الأساسيتين BaseEstimator وTransformerMixin من وحدة sklearn.base.

توفر الوراثة من TransformerMixin دالة fit_transform() تلقائياً بمجرد تعريف دالتي fit() وtransform() بشكل صريح داخل الصنف الجديد، بينما تتيح فئة BaseEstimator الحصول التلقائي على دوال إدارة المعاملات وضبط المعايير الفائقة مثل get_params() وset_params() اللازمة لعمليات البحث الشبكي (Grid Search).

يقوم المنطق الداخلي لهذا المحول المخصص على إنشاء قاموس تخزيني داخلي (مثل self.encoders = {}) أثناء مرحلة fit()، حيث يتم المرور على قائمة الأعمدة المحددة وبناء كائن LabelEncoder مستقل لكل عمود وحفظه داخل القاموس. في مرحلة transform()، يتم استدعاء كل كائن مشفر من القاموس لتطبيق التحويل على العمود المطابق له، مما يوفر هيكلية محكمة تجمع بين كفاءة الإدارة البرمجية والالتزام بمعايير المكتبة القياسية.

8.2 تضمين وظيفة التحويل العكسي (Inverse Transformation)

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

تعتمد آلية التحويل العكسي داخل الصنف المخصص على المرور العكسي عبر القاموس المحفوظ، واستدعاء دالة inverse_transform() الخاصة بكل كائن LabelEncoder لتطبيقها على العمود الرقمي المقابل. يتم بعد ذلك إعادة تجميع السلاسل النصية المسترجعة في إطار بيانات جديد مطابق تماماً للهيكل والمسميات الأصلية للبيانات المدخلة.

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

9. مقارنة منهجية: ترميز التسميات مقابل تقنيات الترميز البديلة

9.1 ترميز التسميات مقابل الترميز أحادي الساخن (One-Hot Encoding)

يمثل الاختيار بين ترميز التسميات والترميز أحادي الساخن (One-Hot Encoding) أحد أهم القرارات المفصلية في مرحلة هندسة الخصائص، وتعتمد المفاضلة بينهما على طبيعة البيانات المستهدفة ونوع الخوارزمية المستخدمة. يقوم الترميز أحادي الساخن بتحويل كل فئة فريدة إلى عمود ثنائي منفصل يحتوي على القيمة 1 عند تحقق الفئة و0 في غير ذلك، مما يقضي تماماً على معضلة فرض العلاقات الترتيبية الزائفة، وهو ما يجعله الخيار المثالي والافتراضي للنماذج الخطية وشبكات التعلم العميق.

غير أن هذه الميزة الإحصائية يقابلها ثمن حسابي باهظ؛ فالترميز أحادي الساخن يعاني من مشكلة “لعنة الأبعاد” (Curse of Dimensionality) عند تطبيقه على أعمدة عالية التعددية (High Cardinality) كالأعمدة التي تحتوي على مئات أو آلاف الفئات الفريدة مثل الرموز البريدية. يؤدي ذلك إلى تضخم هائل في مساحة الذاكرة وتفرت غير مرغوب في مصفوفة البيانات (Sparse Matrix)، مما يثقل كاهل خوارزميات التدريب ويبطئ الأداء.

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

9.2 ترميز التسميات مقابل الترميز المستهدف (Target Encoding)

يعد الترميز المستهدف (Target Encoding)، أو ما يعرف بترميز المتوسط (Mean Encoding)، تقنية متقدمة تلجأ إليها علوم البيانات لمعالجة المتغيرات الفئوية عالية التعددية بذكاء إحصائي رفيع. تقوم هذه التقنية باستبدال كل فئة بالقيمة المتوقعة أو المتوسط الحسابي لمتغير الهدف المقابل لتلك الفئة عبر بيانات التدريب، مما يضمن الحفاظ على عمود واحد مدمج يمتلك كثافة معلوماتية عالية ورابطاً مباشراً بالاستجابة التنبؤية.

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

لتفادي هذه المخاطر، يتطلب الترميز المستهدف تطبيق تقنيات تنظيم إحصائي صارمة (Regularization / Smoothing) واستخدام أساليب الأطر الخارجية المتقاطعة (Out-of-fold Target Encoding)، مما يجعله أكثر تعقيداً في التنفيذ البرمجي مقارنة بالبساطة المباشرة لترميز التسميات.

9.3 الترميز الثنائي والتردد والترميزات المتقدمة

إلى جانب الطرق الكلاسيكية، تتوفر تقنيات ترميز متطورة توفر حلولاً وسطى بين ضغط الأبعاد والحفاظ على الدلالة الإحصائية، ومن أبرزها الترميز الثنائي (Binary Encoding). يقوم هذا الأسلوب بتحويل الفئات أولاً إلى أرقام صحيحة متتالية مثل ترميز التسميات، ثم تحويل تلك الأرقام إلى تمثيلها بالنظام الثنائي (Binary Digits)، وتوزيع الخانات الثنائية على أعمدة منفصلة. ينتج عن هذا الأسلوب تقليص أبعاد البيانات بمعدل لوغاريتمي O(log2 k)، مما يوفر حلاً فعالاً للمتغيرات ذات التعددية العالية دون إغراق الذاكرة بآلاف الأعمدة.

من الأساليب العملية الأخرى ترميز التردد (Frequency / Count Encoding)، وفيه تُستبدل كل فئة بنسبة تكرارها أو عدد مرات ظهورها الإجمالي في مجموعة البيانات. يمنح هذا التمثيل الخوارزمية معلومة كاشفة عن مدى ندرة أو شيوع كل فئة، وهو ما يشكل سمة قوية ومفيدة للغاية لنماذج الأشجار لاكتشاف الأنماط غير المعتادة والمعاملات الشاذة.

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

10. الوقاية من تسرب البيانات (Data Leakage) أثناء الترميز المتعدد

10.1 مبدأ الفصل الصارم بين مجموعتي التدريب والاختبار

يعد تسرب البيانات (Data Leakage) من أخطر الأخطاء المنهجية التي يقع فيها ممارسو تعلم الآلة، ويحدث عندما تتسرب معلومات إحصائية من مجموعة بيانات الاختبار أو التحقق إلى مجموعة بيانات التدريب أثناء مرحلة المعالجة المسبقة. يؤدي هذا التسرب إلى تحقيق النموذج لنتائج دقة وهمية ومرتفعة جداً أثناء التجارب المخبرية، يليها انهيار دراماتيكي في الأداء عند نشره في بيئة الإنتاج الحقيقية.

تتمثل القاعدة الذهبية لتفادي هذا الفخ في الحظر الصارم لاستخدام الدالة fit() أو fit_transform() على مجموعة البيانات الكلية قبل إجراء عملية تقسيم البيانات (Train-Test Split). يجب إجراء التقسيم أولاً، ثم تطبيق fit_transform() حصراً على مجموعة التدريب لاستخلاص الفئات والمعايير، وتطبيق دالة transform() فقط على مجموعة الاختبار باستخدام المعايير المستفادة سابقاً.

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

10.2 التحقق المتقاطع (Cross-Validation) وتأمين المعالجة المسبقة

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

الحل المعماري الأمثل هو دمج خطوات الترميز ومحولات المعالجة المسبقة بالكامل داخل كائن Pipeline مع النموذج النهائي. عند استخدام Pipeline مع دوال التحقق المتقاطع مثل cross_val_score، تضمن Scikit-Learn تلقائياً إعادة تنفيذ مرحلة fit() للترميز فقط على الطيات المخصصة للتدريب داخل كل تكرار، وتطبيق transform() على طية التحقق المعزولة.

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

11. أفضل الممارسات البرمجية والتحسين الحسابي

11.1 تحسين استخدام الذاكرة وإدارة أنواع البيانات (Data Types)

تُسند لغة بايثون ومكتبة Pandas تلقائياً النوع int64 للأرقام الصحيحة الناتجة عن عمليات الترميز، وهو نوع بيانات يستهلك 8 بايت لكل قيمة مفردة في الذاكرة. في مجموعات البيانات الكبيرة التي تحتوي على ملايين الصفوف، يؤدي هذا التخصيص الافتراضي إلى إهدار هائل لموارد الذاكرة الحسابية دون مبرر تقني، خاصة وأن عدد الفئات في معظم الأعمدة لا يتجاوز بضع مئات.

يمكن تحسين استهلاك الذاكرة بشكل جذري عبر تطبيق تقنية خفض دقة الأنواع (Downcasting). فإذا كان عدد الفئات الفريدة في العمود أقل من 128 فئة، يمكن تحويل نوع العمود بأمان تام إلى int8 (الذي يستهلك 1 بايت فقط)، أو إلى int16 إذا كان عدد الفئات أقل من 32,767 فئة، عبر استخدام التابع astype():

df[col] = df[col].astype('int16')

يسهم هذا الترشيد البرمجي في تقليص البصمة التخزينية لمصفوفة البيانات في الذاكرة العشوائية بنسبة تصل إلى 75% أو أكثر، مما ينعكس مباشرة على تسريع العمليات الحسابية، وتحسين كفاءة التخزين المؤقت في المعالج (CPU Cache)، وتفادي أخطاء نفاد الذاكرة (Out-Of-Memory Errors) عند معالجة البيانات الضخمة (Big Data).

11.2 التوثيق الصارم وقابلية تكرار النتائج (Reproducibility)

تعتبر قابلية تكرار النتائج (Reproducibility) والتوثيق الهندسي الصارم معيارين أساسيين لجودة البرمجيات في مشاريع تعلم الآلة المتقدمة. عند تنفيذ عمليات الترميز المتعدد، يجب توثيق وحفظ كافة كائنات التحويل والمعاجم المشتقة في ملفات ثنائية مستقلة باستخدام أدوات التجميد مثل joblib أو pickle لضمان استرجاع نفس الحالة التشغيلية بدقة عند نشر النموذج.

يجب أيضاً تثبيت بذور التوليد العشوائي (Random Seeds) وتوثيق الإصدارات البرمجية للمكتبات المستخدمة بدقة في ملفات التبعيات مثل requirements.txt، نظراً لأن التحديثات في خوارزميات الترتيب الأبجدي أو آليات التعامل مع الأنواع بين إصدارات Scikit-Learn قد تؤدي إلى تباين في الإسقاط الرقمي للفئات.

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

12. دليل اتخاذ القرار وخلاصة إرشادية للمطورين وعلماء البيانات

12.1 مخطط انسيابي لاختيار طريقة الترميز المناسبة

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

  • الخطوة الأولى (تحديد موقع المتغير): إذا كان المتغير المستهدف هو المتغير التابع y، فإن LabelEncoder هو الخيار الافتراضي الصحيح والمباشر.
  • الخطوة الثانية (تقييم طبيعة المتغير الفئوي X):
    • إذا كان المتغير ترتيبياً (Ordinal) يحمل تدرجاً معنوياً: استخدم OrdinalEncoder مع تحديد ترتيب الفئات يدوياً عبر المعامل categories.
    • إذا كان المتغير اسمياً (Nominal) والتعددية منخفضة (أقل من 10-20 فئة): استخدم OneHotEncoder مع النماذج الخطية والشبكات العصبية.
    • إذا كان المتغير اسمياً والتعددية عالية جداً: استخدم TargetEncoder المنظم أو BinaryEncoder.
  • الخطوة الثالثة (تحديد نوع الخوارزمية التنبؤية):
    • مع النماذج القائمة على الأشجار (Random Forest, XGBoost): يوصى باستخدام OrdinalEncoder لكافة المتغيرات الفئوية لتوفير الأبعاد وتحقيق أقصى كفاءة حسابية.
    • مع النماذج المعتمدة على المسافات أو العلاقات الخطية (Linear Models, SVM, KNN): تجنب تماماً استخدام LabelEncoder أو OrdinalEncoder على المتغيرات الاسمية، واعتمد كلياً على OneHotEncoder بعد مقايسة الخصائص.
  • الخطوة الرابعة (اختيار الأداة الهندسية للإنتاج): اعتمد دائماً على OrdinalEncoder المدمج داخل ColumnTransformer وتجنب استخدام دوال الحلقات التكرارية أو apply غير المعيارية في خطوط الإنتاج الحساسة.

12.2 الخلاصة والتوصيات الهندسية لمشاريع الإنتاج الحقيقية

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

ومع ذلك، تقتضي التوصيات الهندسية المعاصرة لمشاريع الإنتاج الحقيقية الانتقال الكامل نحو الأدوات المعيارية الحديثة التي توفرها مكتبة Scikit-Learn، وفي مقدمتها فئة OrdinalEncoder المدعومة بحاويات ColumnTransformer وخطوط الأنابيب Pipeline. يوفر هذا الانتقال حماية صارمة ضد أخطاء تسرب البيانات، وإدارة استباقية ومرنة للفئات غير المرئية والقيم المفقودة، فضلاً عن ضمان أعلى درجات النظافة وقابلية الصيانة والتوسع في الأكواد البرمجية.

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

References

  • Buitinck, L., Louppe, G., Blondel, M., Pedregosa, F., Mueller, A., Grisel, O., Niculae, V., Prettenhofer, P., Gramfort, A., Grobler, J., Layton, R., Vanderplas, J., Joly, A., Holt, B., & Varoquaux, G. (2013). API design for machine learning software: experiences from the scikit-learn project. arXiv preprint arXiv:1309.0238. https://arxiv.org/abs/1309.0238
  • Chen, T., & Guestrin, C. (2016). XGBoost: A scalable tree boosting system. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (pp. 785–794). ACM. https://doi.org/10.1145/2939672.2945399
  • Géron, A. (2022). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems (3rd ed.). O’Reilly Media.
  • Kuhn, M., & Johnson, K. (2019). Feature Engineering and Selection: A Practical Approach for Predictive Models. CRC Press. https://doi.org/10.1201/9781315108230
  • McKinney, W. (2022). Python for Data Analysis: Data Wrangling with pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media.
  • Micci-Barreca, D. (2001). A preprocessing scheme for high-cardinality categorical attributes in classification and prediction problems. ACM SIGKDD Explorations Newsletter, 3(1), 27–32. https://doi.org/10.1145/507533.507538
  • Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., Blondel, M., Prettenhofer, P., Weiss, R., Dubourg, V., Vanderplas, J., Passos, A., Cournapeau, D., Brucher, M., Perrot, M., & Duchesnay, É. (2011). Scikit-learn: Machine learning in Python. Journal of Machine Learning Research, 12(85), 2825–2830. https://jmlr.org/papers/v12/pedregosa11a.html
  • Scikit-Learn Developers. (2023). Preprocessing data: Encoding categorical features. Scikit-Learn Documentation. https://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-features
  • VanderPlas, J. (2016). Python Data Science Handbook: Essential Tools for Working with Data. O’Reilly Media.
  • Zheng, A., & Casari, A. (2018). Feature Engineering for Machine Learning: Principles and Techniques for Data Scientists. O’Reilly Media.

اقتباس هذا المقال

looti, M. (2026, سبتمبر 2). Scikit-Learn: استخدام ترميز التسميات عبر أعمدة متعددة. عرب سايكلوجي. https://arabpsychology.com/statistics/scikit-learn-use-label-encoding-across-multiple-columns/
looti, Mohammed. “Scikit-Learn: استخدام ترميز التسميات عبر أعمدة متعددة.” عرب سايكلوجي, 2 سبتمبر 2026, https://arabpsychology.com/statistics/scikit-learn-use-label-encoding-across-multiple-columns/.
looti, Mohammed. “Scikit-Learn: استخدام ترميز التسميات عبر أعمدة متعددة.” عرب سايكلوجي. سبتمبر 2, 2026. https://arabpsychology.com/statistics/scikit-learn-use-label-encoding-across-multiple-columns/.