One-Hot Encoding أم حذف الأعمدة في تعلم الآلة

x32x01
  • بواسطة x32x01 ||
هل نستخدم One-Hot Encoding لكل الأعمدة Categorical؟ 🤔
سؤال بيقابل أي Data Scientist أو Machine Learning Engineer بشكل شبه يومي:
هل أعمل One-Hot Encoding لكل الأعمدة اللي نوعها Categorical؟
ولا أسيب بعض الأعمدة وأعملها Drop؟

السؤال شكله بسيط…
بس إجابته هي الفرق بين:
✅ موديل شغال كويس في الـ Production
❌ وموديل شكله حلو بس في الـ Notebook

خلّينا نفهم القرار الصح بطريقة عملية وبسيطة 👇

إمتى نستخدم One-Hot Encoding؟ ✅

نستخدم One-Hot Encoding لما العمود يكون:
  • عدد الفئات فيه قليل (Low Cardinality)
  • ليه تأثير حقيقي على الـ Target
  • شغالين بنماذج زي Linear Models أو Neural Networks

مثال عملي 👇

عمود زي NAME_FAMILY_STATUS قيمه بتكون مثلاً:
  • Married
  • Single
  • Divorced
ده عمود مثالي جدًا لـ One-Hot Encoding 👌

كود Python باستخدام Pandas​

Python:
import pandas as pd

df = pd.get_dummies(
    df,
    columns=['NAME_FAMILY_STATUS'],
    drop_first=True
)

النتيجة​

  • NAME_FAMILY_STATUS_Married
  • NAME_FAMILY_STATUS_Single
كده الموديل يقدر يتعامل مع البيانات بسهولة ومن غير لخبطة 👍


إمتى نعمل Drop للعمود؟ ❌

أحيانًا أحسن قرار هو إننا نشيل العمود خالص 😄
وده بيكون لما:
  • عدد الفئات كبير جدًا (High Cardinality)
  • العمود تأثيره ضعيف على التنبؤ
  • بيعمل Noise أو Overfitting

مثال شائع جدًا 👇

عمود زي ORGANIZATION_TYPE ممكن يحتوي على أكتر من 40 فئة:
  • Business Entity Type 1
  • School
  • University
  • Police
  • Military
  • Other
عمل One-Hot Encoding هنا = انفجار أعمدة 💥

الحل​

لو العمود مش فارق في الأداء:
Python:
df.drop(columns=['ORGANIZATION_TYPE'], inplace=True)
📌 مش كل الأعمدة لازم تكمّل - في أعمدة وجودها أسوأ من عدمها 😄


حلول ذكية بدل One-Hot أو Drop 🧠

لو العمود مهم بس فئاته كتير، عندك حلول احترافية جدًا 👇

Frequency Encoding​

كل فئة بنحوّلها لعدد مرات ظهورها
Python:
freq_map = df['ORGANIZATION_TYPE'].value_counts()
df['ORG_TYPE_FREQ'] = df['ORGANIZATION_TYPE'].map(freq_map)
📌 ممتاز مع Tree-based Models


Target Encoding (احترافي جدًا) 🎯

كل فئة بتاخد متوسط قيمة الـ Target
Python:
target_mean = df.groupby('ORGANIZATION_TYPE')['TARGET'].mean()
df['ORG_TYPE_TARGET_ENC'] = df['ORGANIZATION_TYPE'].map(target_mean)
📌 شغال بقوة مع:
  • XGBoost
  • LightGBM
⚠️ لازم يتستخدم جوه Cross Validation عشان نتجنب Data Leakage


Grouping (دمج الفئات النادرة)​

الفئات اللي بتظهر قليل بنجمعها تحت اسم واحد
Python:
rare_categories = df['ORGANIZATION_TYPE'].value_counts()
rare_categories = rare_categories[rare_categories < 100].index

df['ORGANIZATION_TYPE'] = df['ORGANIZATION_TYPE'].replace(
    rare_categories, 'Other'
)
📌 بيقلل التعقيد وبيحافظ على المعلومة المهمة


القرار بيعتمد على نوع الموديل 🔥

Linear Models (Logistic Regression)​

  • حساسة جدًا للـ Encoding
  • One-Hot Encoding ضروري
  • Scaling مهم جدًا

Tree-based Models (XGBoost / LightGBM)​

  • أقل حساسية
  • Encoding ذكي بيكون أفضل
  • LightGBM أحيانًا بيدعم Categorical مباشرة


الخلاصة الذهبية 👑

  • ❌ ترميز كل الأعمدة = خطأ
  • ❌ حذف كل الأعمدة = خطأ
  • ✅ الأعمدة القليلة → One-Hot Encoding
  • ✅ الأعمدة الكتير والمهمة → Encoding ذكي
  • ❌ الأعمدة الضعيفة → Drop
🎯 الهدف الحقيقي مش زيادة عدد الأعمدة
الهدف هو تحسين أداء الموديل
 
المواضيع ذات الصلة
x32x01
الردود
0
المشاهدات
145
x32x01
x32x01
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
2,178
المشاركات
2,386
أعضاء أكتب كود
535
أخر عضو
ezzatkhalidgad@
عودة
أعلى