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

x32x01
  • بواسطة x32x01 ||
  • #1
هل نستخدم 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
المشاهدات
245
x32x01
x32x01
الوسوم : الوسوم
data leakage feature engineering frequency encoding high cardinality lightgbm logistic regression one hot encoding target encoding xgboost الأعمدة الفئوية
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟

آخر المشاركات

إحصائيات المنتدى
المواضيع
2,388
المشاركات
2,601
أعضاء أكتب كود
574
أخر عضو
الياس
عودة
أعلى