- بواسطة x32x01 ||
هل نستخدم One-Hot Encoding لكل الأعمدة Categorical؟ 🤔
سؤال بيقابل أي Data Scientist أو Machine Learning Engineer بشكل شبه يومي:
هل أعمل One-Hot Encoding لكل الأعمدة اللي نوعها Categorical؟
ولا أسيب بعض الأعمدة وأعملها Drop؟
السؤال شكله بسيط…
بس إجابته هي الفرق بين:
✅ موديل شغال كويس في الـ Production
❌ وموديل شكله حلو بس في الـ Notebook
خلّينا نفهم القرار الصح بطريقة عملية وبسيطة 👇
وده بيكون لما:
📌 مش كل الأعمدة لازم تكمّل - في أعمدة وجودها أسوأ من عدمها 😄
📌 ممتاز مع Tree-based Models
📌 شغال بقوة مع:
📌 بيقلل التعقيد وبيحافظ على المعلومة المهمة
الهدف هو تحسين أداء الموديل
سؤال بيقابل أي 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
كود 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
الهدف هو تحسين أداء الموديل