IoT_Lecture_6_by_Hindih_(1)
أول Algorithm هو الـ Naive Bayes algorithm، هنشرح فكرته على الـ Example ده.
 إحنا عندنا أربعة Column features وفيه Output بيبقى Two classes، 
0 أو 1، تمام؟ وعدد الـ Records 14. فالمفروض في الـ Algorithm ده هناخد كل Column feature...
وهنشوف الـ Rows اللي فيه، الـ Distinct attributes اللي فيها اتكررت كام مرة مع كل Class أو مع كل Output. يعني هنشوف أول حاجة هنا الـ Rainy record 
ده اتكرر كام مرة مع الـ Output 
1 وهنشوف اتكرر كام مرة مع الـ Output
 0 اللي هو الـ No
وهنشوف برضه الـ Overcast اتكررت كام مرة مع الـ Output
 1 واتكررت كام مرة مع الـ Output 
0. ونفس الشيء في الـ Sunny، هناخد كل Distinct attribute ونشوف اتكررت كام مرة لما 
الـ Output كان بـ 0 أو لما الـ Output كان بـ 1. زي الشكل اللي هنا، هنا خدنا الـ Outlook column.
والـ 3 distinct attributes ولما كان الـ Output بـ Yes الـ Sunny اتكررت تلات مرات، ولما كان الـ Output بـ No الـ Sunny اتكررت مرتين. ونفس الشيء للـ Humidity column
الـ Humidity column فيه 2 distinct attributes الـ High والـ Normal. أول حاجة هنشوف الـ High اتكرر كام مرة لما كان الـ Output بـ 0 واتكرر كام مرة لما كان الـ Output بـ 1.
وكذلك للـ Temperature column والـ Windy column، تمام؟ وكذلك لباقي
 الـ Columns. بعدها هنعمل إيه بعد ما نجيب النسبة؟ بعد كده لكل Column...
هنحسب الـ Probability للـ Distinct attribute لما كان الـ Class بـ 1 ولما كان الـ Class
 بـ 0. هنا عندنا عدد الـ Classes اللي هي بـ 1 عددهم 9 وعدد الـ Classes اللي هما بـ 0 عددهم 5، تمام؟ فـ هنشوف الـ Probability للـ Sunny لما كان الـ Class Yes والـ Probability 
للـ Sunny لما كان الـ Class بـ No. ونفس الشيء ده لكل.. لكل الـ Columns.
أول حاجة لما يبقى عندي Input features والمفروض إن أنا أ Predict ده هيبقى للـ Class 0 أو للـ Class 1. أول حاجة هجيب الـ Probability إن الـ Class ده يبقى 1 
given الـ X features، والـ Probability إن الـ Class ده يبقى 0 given الـ X features. أول حاجة أشوف الـ Input features اللي عندي هجيب الـ Probability للـ Rainy لما الـ Class ده يبقى بـ 1.
هنروح للـ Outlook column هنجيب الـ Probability للـ Rainy لما الـ Class ده يبقى بـ 1، multiplication الـ Probability للـ Cool لما الـ Class ده يبقى بـ 1 في الـ Temperature
، Probability للـ Cool لما الـ Class ده يبقى بـ 1 هنعملها multiplication في
 الـ Probability للـ High لما الـ Class ده يبقى بـ 1 في الـ Humidity
، Probability للـ High لما الـ Class ده يبقى بـ 1.
بعدها هنعمل بها multiplication في الـ Probability للـ True لما الـ Class ده يبقى بـ Yes. هنروح للـ Column ده نجيب الـ Probability للـ True لما الـ Class يبقى بـ 1 ونعمب لها برضو multiplication. في الآخر هنعمل لها multiplication في الـ Probability للـ Yes. إحنا قلنا إن إحنا عندنا 14 Records، تسعة منهم هم الـ...
الـ Output
 Class 1 فالـ Probability للـ Yes هتبقى 9 على الـ 14 تمام فنعمل لهم كلهم multiplication ونشوف الـ Result هنيجي في الـ Probability للـ No
 Given الـ X Features هنشوف بقى الـ Probability للـ Rainy لما الـ Value تبقى 0 أو No
من من الـ Outlook 
column تمام؟ بعدها هنعمل multiplication هنعمل نفس الشيء تمام؟ بعدها هنجيب الـ probability للـ No في الاخر هنقارن بين الـ 2 values دول وهناخد اعلى value لها هي هتمثل لي الـ Output يعني اعلى value هتمثل لي الـ Output class
هنا أعلى Value لو كانت عند الـ No فهيبقى الـ Class ده بيبقى Output 0. 
تاني Algorithm هو الـ Decision Tree فكرة الـ Decision Tree إن إحنا بيبقى عندنا مجموعة Features عايزين نحولها لـ Tree سواء هي Regression أو Classification. فأول حاجة بنختار الـ Root feature، وإحنا بنختار الـ Features أو بنختار شكل الـ Tree على أساس Equations بس إحنا هنشرح الـ Algorithm بشكل General.
اول حاجة نختار Root Feature اختارنا Outlook تبقى هي الـ Root Feature بعدها هنشوف الـ Distinct Attributes اللي في Records بتاعت الـ Feature اللي احنا اخترناها يعني هنشوف الـ Attributes اللي في عندنا هنا 3 Distinct Attributes 
Sunny, Overcast و Rain بخلاف هما متكررين كام مرة
فبعدها هنعمل Level تاني للـ Tree فيه 3 
nodes للـ Distinct attributes اللي إحنا اختارناهم، أو اللي هما already موجودين يعني. بعدها هنشوف كل Attribute بـ map لأنهي Output يعني هنا الـ Output
 Binary classification، يا 0 يا 1. فإحنا هنشوف كل Attribute...
بـ map لـ Output إيه، 0 أو 1. فلو بدأنا بالـ Overcast هنشوف مثلاً هي بـ map لـ Output
 1. تاني Record في الـ Overcast يعني بـ map لـ Output 1. آخر Two records في
 الـ Overcast بـ map لـ Output 1 برضو. فهنلاحظ إن لو هي بـ map لـ Output
 value واحدة، فده معناه إن هي Pure subset.
لو هي Pure subset إحنا مش هنعمل Level تاني أو مش هنعمل Separate يعني مش هنعمل Separate عند الـ Subset دي. تمام، هنشوف باقي الـ Attributes.
 الـ Sunny هنلاحظ هنا أول Two records بيـ mapـوا للـ No اللي هو الـ Output.
بعدها فيه Record من Sunny بيـ map لـ Output 
1. فلما نلاقي Record من.. يعني المفروض يبقى في Class مختلف، فدي مش Pure subset. لما هي تبقى مش Pure subset، هنختار Feature تانية برضه على أساس Equations.
 الـ Feature التانية اللي إحنا هنختارها، هنشوف برضه الـ Distinct attribute
 إحنا هنا اخترنا الـ Humidity، هنشوف الـ Distinct attributes اللي موجودة في
 الـ Humidity.
هنا الـ High والـ Normal. هنعمل إيه؟ هنعمل Two nodes؛واحدة للـ High
 و واحدة للـ Normal. المفروض بقى هنشوف برضو بيـ map لـ أنهي Output، 
بس هنشوف على أساس إيه؟ مش على أساس الـ High لوحدها، لا على أساس الـ High
 وعلى أساس الـ Feature اللي قبلها اللي هي Outlook. فهنا المفروض هنشوف على أساس الـ Sunny والـ High بـ map لأنهي Output.
فلاحظنا إن الـ Sunny والـ High بيـ map ـوا للـ No، وهنا تاني Sunny والـ High بيـ mapـوا للـ No. وهنلاحظ إن أي Sunny والـ High بيـ map ـوا للـ Output No. فهنا وصلنا إن إحنا عندنا.. إن الـ Output لحد هنا بيـ map لإيه؟ لـ Class واحد، فـ ده بقى Pure subset
 فـ إحنا هنا مش هنعمل أي...
هنشوف بقى تاني Attribute في الـ Humidity اللي هو Normal.
 هنشوف الـ Normal بقى مع الـ Features اللي قبلها اللي هي الـ Sunny. فهنا هنلاحظ إن 
الـ Sunny مع الـ Normal بتـ map لـ Output Yes، وهنا الـ Sunny مع الـ Normal بتـ map لـ Output Yes اللي هو 1.
فبرضو دي هتمثل لي الـ Pure subset، ومش هنحتاج إن إحنا نعمل أي Split. 
هنروح بقى لآخر Attribute معانا في الـ Outlook feature اللي هو الـ Rain. 
هنشوف الـ Attribute ده بيـ map لـ Output إيه. هنا أول Rain بتـ map لـ Output Yes.
وتاني Rain بتـ map لـ Output Yes، وفيه Rain بتـ map لـ Output No. 
ده هنا مش محتاجين إن إحنا نكمل، إحنا عرفنا إن هي مش Pure subset، وعرفنا إن إحنا المفروض نعمل Split. فهنا اخترنا Feature الـ Wind
Feature الـ Wind فيها Two distinct attributes اللي هي الـ Weak والـ Strong. المفروض هنعمل.. هنشوف بقى الـ Weak.
... output بس بناءًا على الـ Features اللي قبله 
 الـ Features اللي قبله المفروض هنا اختارنا.. هنا Feature الـ Wind، المفروض هنشوف كل Attribute فيها بيـ map لـ أنهي Output، بس على أساس الـ Feature اللي قبلها. فهنا هنشوف الـ Weak مع الـ Rainy، لأن هي قبلها Rainy.
الـ Rain هنشوف الـ Weak مع الـ Rain. هنا الـ Rain والـ Weak بيـ map لـ Output Yes. وهنلاحظ إن كل Rain معاها الـ Attribute
 Weak بيـ map لـ Output Yes. فـ ده برضو بقى distinct
بقى Pure subset، فبرضو مش هنعمل Split. وآخر حاجة الـ Strong 
هنشوف الـ Rain والـ Strong.
هنلاحظ إن هم بيعملوا map لـ Output No، فـ ده برضو بقى Pure subset ومش هنحتاج نعمل Split. كده الـ Tree هنعرف نـ predict لو عندنا Input جديد هنعرف نعمل predict
 للـ Output. ده Example كان في الـ Lecture
هنا عنده 3 features أول مرة بدأ يعمل split على أساس...
الـ Feature class، وبيشوف الـ Output. ومرة تانية عمل Split على أساس الـ Height، وبعدها عمل Split على أساس الـ Gender. دلوقتي إحنا المفروض بقى هنحسب الـ Error
فلو هي Regression problem هنحسب الـ Y اللي هو الـ Target label يعني...
minus الـ Y-Predict² ده الـ Error في الـ Regression function. طيب لو هي Classification؟ في الـ Classification بيبقى فيه طريقتين نحسب بيهم الـ Error
الـ Loss Gini والـ Loss Cross-Entropy. في الـ Loss Gini بنعمل Summation 
للـ Probability اللي إحنا عملناها predict للـ Class...
multiplied by
 (1 - the probability). في الـ Cross-Entropy يبقى negative summation 
للـ probability
 log للـ probability نفسها اللي إحنا عملناها predict. 
فكرة الـ Ensemble Learning إن أنا بيبقى عندي أكتر من Model وبأعمل train لنفس
 الـ Data set دي على الـ Models دي؛ يعني مثلاً ممكن يبقى عندي Logistic Regression، SVM، Naive Bayes، Decision Tree وبأعمل لكل الـ Models دي train على نفس
 الـ Data set. يعني مثلاً لو أنا عندي Classification problem...
لـ Apple أو Orange فأنا هعمل train للـ Data set دي على الـ Models دي 
وأشوف الـ Result لكل Model. لو أنا عندي 3 Models مثلاً هشوف الـ 3 
Models دول هيعملوا Classification إزاي. يعني لو 2 Models مثلاً طلعوا إن دي Apple و Model طلع إن دي Orange فـ أنا هختار الـ...
الأعلى نسبة إن هي هتبقى Apple، تمام. طب لو أنا عندي دلوقتي 4 Models اتنين منهم طلعوا إن دي Apple واتنين طلعوا إن دي Orange، هختار على أساس إيه الـ Class الصح؟ هشوف إيه الـ Model اللي ليه أعلى نسبة Error، ما هو إحنا بعد ما بنعمل train بنحسب لكل Model الـ Loss function بنعرف الـ Error عند كل Model.
فهنشوف الـ Model اللي ليه أعلى نسبة Error هنعمل ignore للـ Value اللي عنده
يعني مثلاً لو الـ Model اللي ليه أعلى نسبة Error كان مطلع إن دي Orange، فكدا هعمل له ignore وكدا كأن عندي 3 Models اتنين Apple وواحدة Orange، 
فهختار الـ Classification اللي هو بيطلع إن دي Apple. فيه حاجتين بعملهم على الـ Train data set لما بستخدم الـ Ensemble Learning...
الـ Bagging والـ Pasting؛ الـ Bagging بعمل إيه؟ إن أنا بضيف عدد الـ Training data samples عن طريق إن أنا بعملها.. بعمل combinations أو إن أنا أعمل repetition
 للـ Rows أكتر من مرة. ده بيهدف لإيه؟ إن أنا أخلي الـ Output لكل الـ Models 
يبقى متقارب وإن أنا أقلل الـ Variation في الـ Models نفسها، يعني أقلل الـ Variation
 للـ Output نفسه.
في الـ Pasting بنقسم الـ Training data set على كل Model، 
يعني كل Model هياخد Subset من الـ Training data set ومفيش أكتر.. مش هيبقى فيه كمان Replacement للـ Dataset دي يعني كل Model.. الـ Model اللي هياخد Subset من الـ Data، الـ Model التاني مش هياخد نفس الـ Subset. فيه شوية Steps هنطبقها عشان الـ Model يشتغل بطريقة صح وكمان نقلل نسبة الـ Error أول حاجة الـ Feature Scaling.
هي إيه أصلاً فكرة الـ Feature Scaling؟ إن أنا أخلي الـ Input data، 
لو أنا عندي مجموعة Column features وليها Records، إن أنا أخلي الـ Values 
دي في ranges قريبة من بعض. ليه بقى؟ لو عندي example زي ده 
هنا الـ Age ودي الـ Values بتاعة الـ Age، وهنا الـ Salary ودي الـ Values بتاعة الـ Salary. هنلاحظ إن فيه gap بين الـ Values بتاعة الـ Age أو range الـ Values اللي في الـ Age وrange الـ Values اللي في الـ Salary.
فعشان الـ Model.. ممكن الـ Model يعني يفهم إن الـ Salary ليه priority أعلى،
 وإن المفروض عشان دي Values أكتر، فإن هو يدي الـ features دي أهمية، مع إن ممكن 
الـ feature دي على حسب الـ problem ما يبقاش ليها تأثير على الـ Output 
أو إحنا مش هنحتاج نستخدمها في الـ Output نفسه. فعشان يبقى كل الـ features...
في range قريب أو scale قريب ومفيش.. والـ model لما يجي يتـtrain على الـ features مايديش لـ column 
priority عن column تاني على حسب الـ range نفسه، بنستخدم الـ scaling. 
أول نوع من الـ feature scaling الـ Z-score normalization. الفكرة إن إحنا بنحاول نخلي الـ mean أو الـ center للـ data يبقى هو الـ origin.
فده عن طريق إن إحنا بنجيب الـ Input value اللي إحنا عايزين نعملها Scaling،
ونطرح منها الـ Mean يعني إحنا لو عندنا Column، هنجيب الـ Mean للـ Column ده 
والـ Standard deviation، ونجيب كل Value نطرحها من الـ Mean ونقسمها على
 الـ Standard deviation.
وبعدها نعمل save للـ Value الجديدة، ونعمل كدة لكل الـ Values اللي موجودة في
 الـ Columns. تاني نوع الـ Minimum والـ Maximum
 Normalization إحنا بناخد الـ Value اللي موجودة في الـ Column اللي إحنا عايزين نعملها Scaling، ونجيب الـ Minimum Value الموجودة في الـ Column والـ Maximum Value. نطرح الـ Value من الـ Minimum ونقسمها على maximum mins minimum 
يدينا الـ New Value اللي هي بعد ما نكون عملنالها Scaling.
الـ Min-Max scaling ده بيـ map الـ new x لـ range من 0 لـ 1، تمام. 
والـ Z-score normalization بنستخدمه أكتر لما الـ Data بتبقى Normally distributed يعني. تاني حاجة.. أنا دلوقتي عندي Model عملت train لـ Dataset على الـ Model ده...
والمفروض إن أنا حسبتلها Accuracy
فـ في الـ Overfitting، الـ Accuracy للـ Train data set بتبقى عالية، والـ Accuracy 
للـ Test data set بتبقى قليلة جداً، تمام؟ يعني بيبقى فيه Gap بين الـ Accuracy للـ Train والـ Accuracy للـ Test. المشكلة دي سببها إن أنا فضلت أعمل train أو optimize
 للـ Model كتير لحد ما حفظ شكل الـ Dataset نفسها.
حفظ شكل الـ Dataset نفسها من غير ما يعرف الـ Features اللي على أساسها هيقدر
 يـ detect الـ Output من الـ Test data مثلاً. لا، هو عرف شكل الداتا نفسها، شكل Specific للداتا، فـ بكدة مش هيعرف يعملها Classify أو يـ...
زي في الشكل ده، هنا الـ Model عمل separate لكل الـ samples الموجودة
 في الـ two classes، وده ينفع للـ data دي بس، يعني لو Test data مش هيعرف يعملها classification صح، ونفس الكلام هنا في
 الـ Regression. أول حاجة عشان نحل الـ Overfitting إن إحنا نـ apply
 Regularization parameter.
الفكرة من الـ Parameter ده إيه؟ إن هو هيبقى.. الـ Parameter ده هنضربه في
 الـ Weight، تمام؟ الفكرة إيه؟ إن إحنا نقلل قيمة الـ Weight، لأن الـ Weights هي اللي بتدي Strength للـ Features. فلما نقلل قيمة الـ Weights، فإحنا كدة هيبقى فيه نسبة Error، 
بس مش هيوصل للـ Overfitting. بمعنى إن إحنا لو خلينا الـ Parameter ده...
بقيمة عالية.. عالية جداً يعني، نسبة الـ Weight هتقل جداً بحيث إن في الآخر الـ Equation دي تبقى قليلة لأن الهدف برضو إن إحنا نقلل الـ Loss function. ولو إدينا الـ Parameter ده قيمة قليلة جداً، قيمة الـ Weight هتعلى تمام برضو عشان نقلل الـ Loss function وتبقى في range معقول. فالفكرة الهدف بقى إن إحنا إزاي نختار الـ Parameter ده.
بحيث إن إحنا ندي قيمة للـ Weight تكون Suitable للـ Weight وفـ نفس الوقت
 ماتخليش الـ Model يـ Overfit. عندنا نوعين للـ Regularization؛ أول حاجة Lasso، وتاني حاجة Ridge. الـ Lasso Regularization هو بياخد الـ Absolute لكل Value في
 الـ Weight ويعملهم Summation. طب والـ Ridge...
بياخد الـ square لكل value في الـ weight ويعمل لهم summation برضو. تالت طريقة عشان نحل الـ Overfitting هي الـ Cross-validation. الـ Cross-validation إن إحنا بنقسم الـ Data set اللي عندنا.. الـ Train data set اللي عندنا بنقسمها جزء train وجزء validation بنـ test بيه. بمعنى إن إحنا لو الداتا عندنا...
100 sample ممكن ناخد 90%.. 90 sample نـ train بيهم، و10 samples نـ test بيهم، تمام؟ على حسب عدد الـ iterations اللي إحنا هنعملها عشان نوصل للـ Weights
 الـ Optimal، تمام؟ فإحنا مثلاً أول مرة هناخد أول 90 sample نـ train بيهم وآخر 10 samples نـ test بيهم.
وبعدها كل مرة هنغير الـ Values نفسها اللي إحنا بنـ train ونـ test بيها. دي فكرة
 الـ Cross-validation إن إحنا بنـ train ونـ test بنفس الـ data، وكل مرة بنحسب
 الـ Accuracy عشان نحل مشكلة الـ Overfitting. تالت حاجة 
الـ No Free Lunch Theorem دي فكرتها إيه؟ إن إحنا لو عندنا Input data...
و عندنا موديل كثيرة و نحن لا نعرف ما هو المفضل للموديل الذي سيفتح معه فنحن سنجرب أكثر من موديل للـ Data Set D و نرى إذا كان Data Set D يتعامل مع الموديل المتطلع و نرى ما هو الموديل الذي يتطلع لأكثر من موديل
ولو Regression problem برضو هنجرب أكتر من Model للـ Regression
 ونشوف إيه الـ Models اللي بتطلع أحسن Accuracy لو إحنا مش عارفين الـ Data دي
 إيه أحسن Model نستخدمه ليها، أو مفيش Experience. آخر حاجة الـ Hyperparameter Tuning والـ Grid Search. إيه هي الـ Hyperparameter؟
 إحنا عندنا Hyperparameters...
و Model parameters. 
الـ Model parameters دي الـ Parameters اللي الـ Model بيديها Values وبيعمل لها Update مع الـ train، زي الـ Weights أو الـ Learning rates مثلاً دي
 Model parameters هو الـ Model هو اللي بيـ set values للـ Parameters دي.
 إنما الـ Hyperparameters إحنا بنديها Input للـ Model نفسه...
زي في الـ Unsupervised learning لما نيجي نعمل K-means clustering
إحنا اللي بنحدد عدد الـ Clusters. في.. لما بنيجي نعمل train لـ Deep learning model إحنا بنحدد عدد الـ Epochs دي كلها Hyperparameters.
 الـ Regularization parameter ده Hyperparameter إحنا اللي بنحدده برضو. طب دلوقتي إحنا بنختار القيم دي، عايزين نعمل لها Improve يعني إحنا عايزين نعمل Improve لقيم الـ...
الـ Hyperparameters اللي إحنا بنختارها. بنستخدم حاجة اسمها الـ Grid Search.
 الـ Grid Search ده فكرته إيه؟ إن إحنا بندي للـ.. بعد ما بنختار الـ Hyperparameter.. 
بندي للـ Model 
Input Parameters ليها Values كتير والـ Model يجرب الـ Values دي ويشوف أنهي Value بتدي أحسن Performance
ويختار الـ Value دي يعني كـ Hyperparameter. 
ده شكل الـ Grid Search إحنا عندنا مجموعة Values، بياخد كل Value يجربها في
 الـ Model، بس إحنا اللي بنبقى مديينه الـ Values دي، تمام؟ بيجرب كل Value 
ويشوف أنهي Value اللي هتطلع أحسن Performance