تقنية

ضم محولات الأعمدة: هل تأتي النتيجة بترتيب الجدول؟

ترتيب حقول طول وعرض وارتفاع ينتقل إلى عرض وطول وارتفاع حسب قائمة الاختيار وسياسة مرور الباقي مع ثبات القيم
رسم تعليمي مؤلف لقائمة المرور؛ ليس ناتج تشغيل محولات.

ترتيب الأعمدة بعد ColumnTransformer يتبع ترتيب القائمة التي تحدد التحويلات، وليس ترتيب الجدول الأصلي تلقائيا. [1] نختار في مثال بسيط مرور أعمدة دون تغيير قيمها، فيظهر فرق المواضع وحده: قيمة سليمة قد تصبح تحت عنوان خطأ إذا نسخنا عناوين الجدول الأول.

الخلاصة السريعة

لا؛ في عقد ColumnTransformer تتبع الأعمدة المختارة ترتيب قائمة التحويلات، وتضاف أعمدة المرور المتبقية بعد نواتجها.

  • يوثق ColumnTransformer ترتيب أعمدة الناتج وفق transformers، وإضافة أعمدة المرور المتبقية في النهاية. [1] هذا ترتيب مواضع حتى إن لم نغير القيم.
  • مدخلنا طول ثم عرض ثم ارتفاع، وقيمه 2 و 5 و 7. نختار مرور العرض أولا ثم الطول، مع remainder=passthrough للارتفاع؛ ترتيب الناتج في مثالنا عرض ثم طول ثم ارتفاع، وقيمه 5 و 2 و 7.
  • إذا كتبنا عناوين المدخل فوق هذا الناتج، نسبنا 5 للطول و 2 للعرض خطأ. المرور يحفظ قيمة الحقل، ولا يحفظ موضعه الأصلي بالضرورة.
  • الافتراضي remainder=drop يحذف غير المختار؛ ومع DataFrame تستبعد transform الأعمدة الجديدة التي لم ترها fit. [1] ثبت السياسة والأسماء ونسخة المخطط، ولا تعد عدد الأعمدة وحده إثباتا لصحة ترتيبها.

ما الترتيب الذي يعلنه المحول؟

توضح الوثيقة أن ترتيب مصفوفة الميزات المحولة يتبع تحديد الأعمدة في قائمة transformers، وأن أعمدة passthrough المتبقية تضاف بعد نواتج القائمة. [1]

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

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

ماذا يحدث لقيم الصفين؟

نؤلف صفين: الأول طوله 2 وعرضه 5 وارتفاعه 7 ، والثاني طوله 4 وعرضه 9 وارتفاعه 8. قائمة المرور التي اخترناها تعطي العرض ثم الطول ثم الارتفاع. تصبح قيم الصف الأول 5 ثم 2 ثم 7 ، والثاني 9 ثم 4 ثم 8.

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

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

صفنامدخل: طول؛ عرض؛ ارتفاعناتج: عرض؛ طول؛ ارتفاع
الأولطول 2؛ عرض 5؛ ارتفاع 7عرض 5؛ طول 2؛ ارتفاع 7
الثانيطول 4؛ عرض 9؛ ارتفاع 8عرض 9؛ طول 4؛ ارتفاع 8

هل مرور الباقي يعني بقاؤه مكانه؟

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

تفرق الوثيقة بين سياسة الباقي الافتراضية drop وبين passthrough. [1] فإذا اخترنا العرض والطول مع حذف الباقي، لم يعد الارتفاع جزءا من الناتج. نصرح بالسياسة قبل أن نعد الأعمدة أو نسميها.

كما أن تغيير ترتيب كتلتين في القائمة يغير ترتيب ناتجيهما في هذا المثال. نحفظ القائمة مع وصف الناتج؛ وجود الحقول نفسها في ملفين لا يجعل مواضعها متطابقة تلقائيا.

كيف نحافظ على معنى الناتج عند نقل الجدول؟

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

للـDataFrame، تستبعد transform أعمدة إضافية لم تكن موجودة أثناء fit. [1] لذلك لا نفسر كلمة «الباقي» بأنها وعد بمرور أي عمود جديد نضيفه لاحقا، دون مراجعة عقد المخطط.

لم نشغل ColumnTransformer أو نختبر تنبؤا. المثال يوضح أن حفظ القيمة وحفظ موضعها شرطان مختلفان؛ عند تغيير الاختيار أو المخطط نراجع وصف الناتج ونحفظ نسخة الترتيب السابق للمقارنة.

المصادر ومتابعة القراءة

  1. scikit-learn: ColumnTransformer (يفتح في نافذة جديدة)scikit-learn.org

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