- بواسطة x32x01 ||
هل نستخدم One-Hot Encoding لكل الأعمدة Categorical؟ 
سؤال بيقابل أي Data Scientist أو Machine Learning Engineer بشكل شبه يومي:
هل أعمل One-Hot Encoding لكل الأعمدة اللي نوعها Categorical؟
ولا أسيب بعض الأعمدة وأعملها Drop؟
السؤال شكله بسيط…
بس إجابته هي الفرق بين:
موديل شغال كويس في الـ Production
وموديل شكله حلو بس في الـ Notebook
خلّينا نفهم القرار الصح بطريقة عملية وبسيطة
إمتى نستخدم One-Hot Encoding؟
نستخدم One-Hot Encoding لما العمود يكون:
مثال عملي
عمود زي NAME_FAMILY_STATUS قيمه بتكون مثلاً:


إمتى نعمل Drop للعمود؟
أحيانًا أحسن قرار هو إننا نشيل العمود خالص 
وده بيكون لما:
مثال شائع جدًا
عمود زي ORGANIZATION_TYPE ممكن يحتوي على أكتر من 40 فئة:

مش كل الأعمدة لازم تكمّل - في أعمدة وجودها أسوأ من عدمها 
حلول ذكية بدل One-Hot أو Drop
لو العمود مهم بس فئاته كتير، عندك حلول احترافية جدًا 
ممتاز مع Tree-based Models
Target Encoding (احترافي جدًا)
كل فئة بتاخد متوسط قيمة الـ Target
شغال بقوة مع:
لازم يتستخدم جوه Cross Validation عشان نتجنب Data Leakage
بيقلل التعقيد وبيحافظ على المعلومة المهمة
القرار بيعتمد على نوع الموديل
الخلاصة الذهبية
الهدف الحقيقي مش زيادة عدد الأعمدة
الهدف هو تحسين أداء الموديل
سؤال بيقابل أي Data Scientist أو Machine Learning Engineer بشكل شبه يومي:
هل أعمل One-Hot Encoding لكل الأعمدة اللي نوعها Categorical؟
ولا أسيب بعض الأعمدة وأعملها Drop؟
السؤال شكله بسيط…
بس إجابته هي الفرق بين:
خلّينا نفهم القرار الصح بطريقة عملية وبسيطة
إمتى نستخدم One-Hot Encoding؟
نستخدم One-Hot Encoding لما العمود يكون:- عدد الفئات فيه قليل (Low Cardinality)
- ليه تأثير حقيقي على الـ Target
- شغالين بنماذج زي Linear Models أو Neural Networks
مثال عملي
عمود زي NAME_FAMILY_STATUS قيمه بتكون مثلاً:- Married
- Single
- Divorced
كود 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
الحل
لو العمود مش فارق في الأداء: 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)
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
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
الهدف هو تحسين أداء الموديل