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

الوحدة 2 — القيم الناقصة: الحذف والتعويض والترميز

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

السؤال الأوّل ليس «كيف نملأ» بل «لماذا تنقص»

هذا هو الانعكاس الذي يفصل المعالجة السليمة عن الترقيع. فآليّة النقص تحدّد ما يحقّ لك فعله:

الآليةالمعنىالأثر
MCARنقص عشوائيّ تامّالتعويض غير متحيّز
MARالنقص يتبع متغيّرات أخرى مرصودةالتعويض ممكن بالاستناد إليها
MNARالنقص يتبع القيمة الناقصة نفسهاالتعويض يُحيّز؛ والنقص نفسه معلومة

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

وفي الممارسة لا تُبرهَن الآلية بل يُحقَّق فيها: بمقارنة الصفوف الكاملة والناقصة على بقيّة المتغيّرات، وبسؤال أصحاب المجال كيف تُجمَع البيانة. وشرحُ عملية الجمع أنفع من اختبار إحصائيّ.

الاستراتيجية 1 — الحذف

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

ويمكن كذلك حذف العمود، وهو ما يصبح معقولًا بعد 50 أو 60 % نقصًا — لكن ليس قبل التحقّق من أنّ النقص نفسه غير تنبّئيّ.

الاستراتيجية 2 — التعويض

التعويض هو الاستبدال بقيمة معقولة، من الأبسط إلى الأدقّ:

from sklearn.impute import SimpleImputer, KNNImputer

SimpleImputer(strategy="median") # عددي، صامد للقيم الشاذة
SimpleImputer(strategy="most_frequent") # فئوي
SimpleImputer(strategy="constant", fill_value="مجهول") # فئة صريحة
KNNImputer(n_neighbors=5) # من الأرصاد المشابهة

والوسيط أفضل من المتوسّط عند وجود قيم متطرّفة، للسبب نفسه الذي رأيناه في الدورة السابقة. أمّا في المتغيّر الفئوي، فإنشاء فئة «مجهول» أفضل من التعويض بالمنوال غالبًا: فأنت لا تخترع معلومة، ويستطيع النموذج تعلّم سلوك خاصّ بهذه المجموعة.

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

وتتقاسم هذه الأساليب كلّها حدًّا بنيويًّا: فهي تقلّص تشتّت المتغيّر، لأنّها تجمّع قيمًا على تقدير واحد. فتبدو الارتباطات بعدها أقوى قليلًا ممّا هي عليه فعلًا.

الاستراتيجية 3 — إضافة مؤشّر النقص

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

SimpleImputer(strategy="median", add_indicator=True)

فيصير لدى النموذج المعلومتان: قيمة قابلة للاستخدام، وكونُها أُعيد بناؤها. فإن كان النقص تنبّئيًّا — العميل الذي لا يُفصح عن دخله، والمريض الذي لم يُجرِ التحليل — استطاع النموذج الاستفادة منه. والثمن عمود واحد؛ أمّا العائد على بيانات واقعية فهو واضح في كثير من الأحيان.

التعويض قبل التقسيم تسرّبٌ للبيانات

حسابُ الوسيط على مجموعة البيانات كاملةً ثمّ التقسيم إلى تدريب واختبار يُدخل معلومةً من الاختبار إلى التدريب. والنتيجة درجةٌ متفائلة غير قابلة للتكرار. فالوسيط يجب أن يُحسَب على بيانات التدريب وحدها ثمّ يُطبَّق على الاختبار. والعلاج البنيويّ هو خطّ المعالجة في الوحدة 10، الذي يجعل هذا الخطأ مستحيلًا.

الخلاصة

  • السؤال الأوّل هو لماذا تنقص القيمة: MCAR أو MAR أو MNAR — والأخيرة أكثرها شيوعًا وأخطرها.
  • الحذف لا يفترض شيئًا لكنّه مكلف، ويُحيّز العيّنة ما لم يكن النقص عشوائيًّا.
  • عوّض بالوسيط أو المنوال أو فئة «مجهول»؛ والأساليب النمذجية تناسب حالة MAR على حساب البساطة، وكلّ تعويض يقلّص التشتّت.
  • مؤشّر النقص يحفظ المعلومة التي يحملها الغياب نفسه؛ والتعويض يُحسَب على التدريب وحده، وإلّا وقع التسرّب.

الوحدة التالية: تغيير المقياس، وهو التحويل الأساسيّ الثاني، والحالات التي يكون فيها لا غنى عنه أو لا لزوم له.