تفاصيل العمل

Calories Burn Prediction using Encoder–Decoder Architecture

1) نبذة عن المشروع

مشروع تعلّم آلة من نوع الانحدار (Regression) يتنبأ بعدد السعرات الحرارية المحروقة أثناء النشاط البدني، اعتمادًا على بيانات الشخص وبيانات التمرين. ينفّذ المشروع خط معالجة كاملًا (Pipeline) بتقسيم Encoder–Decoder:

الـ Encoder: تجهيز البيانات وتحويلها إلى تمثيل رقمي مناسب للنماذج (تعويض القيم الناقصة، التحجيم، الترميز، وتوليد خصائص جديدة).

الـ Decoder: نماذج الانحدار التي تحوّل هذا التمثيل إلى القيمة المتنبأ بها.

2) مواصفات المشروع

البند التفاصيل:

نوع المشكلة: Regression (القيمة المستهدفة رقم مستمر)

حجم البيانات: 15,000 سجل و9 أعمدة

المدخلات: Gender, Age, Height, Weight, Duration, Heart_Rate, Body_Temp (وعمود User_ID استُبعد لأنه معرّف فقط)

المخرج المستهدف: Calories

مقياس التقييم معامل التحديد: R²

تقسيم البيانات: 80% تدريب (12,000) و20% اختبار (3,000)

عدد التجارب: 40 تجربة = 4 طرق تنظيف × 2 Encoder × 5 Decoders

3) الأدوات والبرامج المستخدمة

لغة Python داخل بيئة Google Colab (دفاتر Jupyter).

pandas و NumPy: قراءة ملف Excel ومعالجة البيانات والعمليات الرياضية.

Matplotlib و Seaborn: الرسوم البيانية.

scikit-learn: train_test_split وStandardScaler وPolynomialFeatures وKNNImputer وRidgeCV وLassoCV وElasticNetCV وr2_score.

pickle: حفظ النموذج النهائي.

4) مراحل التنفيذ

المرحلة 1: جمع البيانات وفهمها. قراءة الملف وفحص أنواع الأعمدة، وتصنيف الخصائص إلى فئوية (Gender) ورقمية (باقي الأعمدة). كشف الفحص الأولي عن مشكلتين: قيم ناقصة (Gender حوالي 900، Weight حوالي 1,200، Heart_Rate حوالي 660)، وقيم شاذة مستحيلة (مثل عمر 306 ونبض 447).

المرحلة 2: التحليل الاستكشافي (EDA). Histogram للأعمدة الرقمية، وBar Chart لتوزيع الجنس، وBoxplots لكشف القيم الشاذة (رسمة لكل عمود لاختلاف المقاييس)، وScatter Plots (Duration/Heart_Rate مقابل Calories)، وCorrelation Heatmap. أظهر التحليل أن Duration أقوى عامل مؤثر ثم Heart_Rate.

المرحلة 3: تنظيف البيانات.

لاحظت أن القيم الصحيحة في خمسة أعمدة أعداد صحيحة، بينما القيم الشاذة كسور عشرية (مثل 306.17)، فبنيت دالة تحقق تعتمد على المدى المنطقي ونوع البيانات معًا وتحوّل القيم غير الصالحة إلى NaN.

قسمت البيانات إلى تدريب واختبار قبل أي معالجة لمنع تسرّب البيانات (Data Leakage)، وحُسبت كل الإحصاءات من بيانات التدريب فقط.

قارنت 4 طرق:

الطريقة الفكرة حجم بيانات التدريب

A) حذف بالـ IQR أسلوب basic 9,270 (77%)

B) حذف بالقواعد حذف الصفوف غير الصالحة 9,347 (78%)

C) تعويض بالوسيط Median / Mode 12,000 (100%)

D) تعويض بـ KNN متوسط أقرب 5 صفوف مشابهة 12,000 (100%)

المرحلة 4: تصميم الـ Encoder.

Method 1 (Classical): ترميز One-Hot لـ Gender وتحجيم قياسي (Standard Scaling) للأعمدة الرقمية: Z = (X − μ) / σ.

Method 2 (Polynomial): إضافة تفاعلات من الدرجة الثانية (مثل Duration × Heart_Rate) فيرتفع عدد الخصائص من 7 إلى 35 لالتقاط العلاقات غير الخطية.

المرحلة 5: تصميم الـ Decoders (5 نماذج).

Normal Equation: مبنية يدويًا بالمعادلة θ = (ZᵀZ)⁻¹Zᵀy.

Gradient Descent: مبنية يدويًا (حلقة تكرار تحدّث θ بمشتقة MSE).

Ridge (L2).

Lasso (L1).

Elastic Net.

يُختار معامل التنظيم λ في النماذج الثلاثة الأخيرة بالتحقق المتقاطع (Cross-Validation بـ 5 طيات).

المرحلة 6: التقييم. حُسب R² يدويًا بالمعادلة وطابق نتيجة المكتبة. صُمم التقييم بمقياسين:

Clean Test: 1,631 صفًا سليمًا بالكامل، وهو مقارنة عادلة بين الطرق الأربع.

All Test: كل الـ 3,000 صف بما فيها المعوَّضة، وهو الأقرب للاستخدام الواقعي، ولا تتنبأ عليه طرق الحذف لأنها لا تتعامل مع صف فيه قيمة ناقصة.

المرحلة 7: أهمية الخصائص. رسم معاملات θ لكل نموذج، ومقارنة التباعد (Sparsity) خاصة في Lasso، وتجربة حذف الخصائص الضعيفة (Gender وHeight).

المرحلة 8: النشر والمراقبة. حفظ النموذج في ملف pkl، ودالة تتنبأ بسعرات شخص جديد، ومؤشر مراقبة بسيط يُنبّه لإعادة التدريب إذا هبط R² تحت 0.90.

النتائج:

أفضل إعداد: تعويض KNN + Polynomial + Ridge.

R² على Clean Test: 0.9976. R² على All Test: 0.9922.

Classical مقابل Polynomial: 0.963 مقابل 0.992، وهذا أكبر تحسّن في المشروع.

KNN مقابل Median على All Test: 0.9920 مقابل 0.9747.

الـ Decoders الخمسة متقاربة جدًا (فرق أقل من 0.002)، لأن البيانات كبيرة والخصائص قليلة.

Gradient Descent وصل إلى نفس حل الـ Normal Equation (فرق حوالي 6×10⁻⁶).

لا يوجد Overfitting: الفرق بين R² التدريب والاختبار أقل من 0.001.

Lasso أصفر 13 معاملًا من 35، فحصلنا على نموذج أبسط بنفس الدقة تقريبًا.

Duration أهم خاصية بفارق كبير، ثم Heart_Rate وBody_Temp وAge، بينما Height وGender ضعيفان.

ما يبرز مهاراتي:

الاستنتاج من البيانات: اكتشاف أن الشواذ كسور عشرية بينما القيم الحقيقية أعداد صحيحة، وبناء قاعدة تحقق منها.

منع تسرّب البيانات: التقسيم أولًا، وحساب كل الإحصاءات من التدريب فقط.

فهم الرياضيات: تنفيذ Normal Equation وGradient Descent وR² يدويًا من المعادلات.

منهجية تجريبية: مقارنة منظمة لـ 40 تجربة بدل اختيار حل واحد، وتصميم مقياسين للتقييم لضمان عدالة المقارنة.

النقد والتحقق: فحص Overfitting، ومقارنة أثر حذف الخصائص، وعرض سلبيات كل طريقة.

التفكير الإنتاجي: حفظ النموذج ودالة تنبؤ ومراقبة الأداء.

حدود المشروع:

التقييم على تقسيم واحد (seed = 42)، وبهذا التقسيم وقعت كل قيم Gender الناقصة في بيانات الاختبار. جرّبنا تقسيمات أخرى (seed 0 و7) وثبتت الاستنتاجات.

قيمة K في KNN (5) ومعدل التعلم في Gradient Descent (0.05) ثابتان ولم يُضبطا بالبحث.

الأرقام العالية جزء منها يعود إلى أن علاقة السعرات بالمدة والنبض قوية في هذه البيانات، فلا ينبغي تعميمها على بيانات حقيقية مختلفة.

ملفات مرفقة

بطاقة العمل

اسم المستقل
عدد الإعجابات
0
تاريخ الإضافة
المهارات