معمل تعلّم الآلة - الأسبوع 1
جامعة المنصورة
- الفصل الدراسي الأول - 2023-2024
- قسم علوم الحاسب
- كلية الحاسبات والمعلومات
- تعلّم الآلة - الأسبوع 1
- مريم عصام
أساسيات تعلّم الآلة
خطة الفصل الدراسي المبدئية
- 01
- أساسيات تعلّم الآلة
- الانحدار الخطي (Linear Regression) والانحدار اللوجستي (Logistic Regression)
- 04
- تصنيف الجيران الأقرب K (K-Nearest Neighbours Classification)
- 02
- تقييم النموذج واختياره (Model Evaluation & Selection)
- 03
- آلات المتجهات الداعمة (Support Vector Machines)
- 05
- أشجار القرار (Decision Trees)
- 06
- مصنّفات بايز الساذج (Naive Bayes Classifiers)
- 07
- الشبكات العصبية (Neural networks)
- 08
4
- البرمجة التقليدية
- برمجة تعلّم الآلة
ما هو تعلّم الآلة (ML)؟
- دراسة برامج الحاسوب (الخوارزميات) القادرة على التعلّم بالمثال
- يمكن لخوارزميات تعلّم الآلة أن تعمّم (Generalize) من أمثلة موجودة لمهمة ما
- مثال: بعد رؤية مجموعة تدريب من صور مُصنَّفة (Labeled)، يمكن لمصنِّف الصور أن يكتشف كيفية تطبيق التصنيفات بدقة على صور جديدة لم يرها من قبل
- يجمع تعلّم الآلة بين الإحصاء وعلوم الحاسب وأكثر..
- 5
تعلّم الآلة (ML)
- تتعلّم الخوارزميات القواعد من أمثلة مُصنَّفة (بيانات التدريب)
- يجب أن تكون القواعد المتعلَّمة قادرة أيضًا على التعميم للتعرّف على أمثلة جديدة غير موجودة في مجموعة التدريب أو التنبؤ بها بشكل صحيح.
- 6
تعلّم الآلة مقابل تعلّم الآلة التطبيقي
- يهتم تعلّم الآلة الخالص (Pure ML) في الغالب بسلوك الخوارزمية ككل
- تعلّم الآلة (ML)
- يهتم تعلّم الآلة التطبيقي (Applied ML) بالسلوك على مجموعات بيانات محدَّدة من واقع الحياة.
- تعلّم الآلة التطبيقي (Applied ML)
8
- تعلّم الآلة لاكتشاف الاحتيال
- خمّن: ما نوع تعلّم الآلة المستخدَم في اكتشاف الاحتيال؟
أنواع مسائل تعلّم الآلة
- التعلّم الخاضع للإشراف (Supervised learning):
- تعلّم التنبؤ بالقيم المستهدفة من بيانات مُصنَّفة
- التصنيف (Classification) (القيم المستهدفة فئات منفصلة - Discrete)
- اكتشاف الاحتيال
- اكتشاف البريد العشوائي (Spam) في البريد الإلكتروني
- التشخيص
- تصنيف الصور
- الانحدار (Regression) (القيم المستهدفة قيم مستمرة - Continuous)
- تقييم المخاطر
- التنبؤ بالدرجات
- التعلّم غير الخاضع للإشراف (Unsupervised learning):
- إيجاد بنية في بيانات غير مُصنَّفة
- التجميع (Clustering)
- إيجاد مجموعات من الحالات المتشابهة في البيانات
- اكتشاف القيم الشاذة (Outlier detection)
- إيجاد أنماط غير معتادة
- التعلّم المعزَّز (Reinforcement learning):
- يمكن لبعض الخوارزميات التعامل مع بيانات تدريب مُصنَّفة جزئيًا، عادةً كمية كبيرة من البيانات غير المُصنَّفة وكمية صغيرة من البيانات المُصنَّفة.
10
- تعلّم الآلة (ML)
- مثال: بكسلات الصورة، مع مصنِّف الجيران الأقرب K
- مثال: نسبة التنبؤات الصحيحة على مجموعة الاختبار
- مثال: جرّب نطاقًا من القيم
- لمعامل "k" في مصنِّف الجيران الأقرب K
11
- تمثيلات السمات (Feature Representations)
12
- بايثون (Python)
- اختُرعت في الثمانينيات
- بايثون تطوّر للغة برمجة ABC، وتأثّرت بلغات البرمجة C وIcon وModula-3.
- تستخدم المسافات البادئة (Indentation) كخاصية نحوية (Syntactic)
- تشجّع بايثون على النمطية (Modularity) وإعادة استخدام الكود.
بايثون - لماذا؟
- 01
- كود قابل للقراءة وسهل الصيانة
- ستساعدك قاعدة كود واضحة وقابلة للقراءة على صيانة البرنامج وتحديثه دون بذل وقت وجهد إضافيَّين
- توافق مع المنصات والأنظمة الرئيسية
- في الوقت الحالي، تدعم بايثون العديد من أنظمة التشغيل. يمكنك حتى استخدام مفسِّرات بايثون (Interpreters) لتشغيل الكود على منصات وأدوات محدَّدة. كما أن بايثون لغة برمجة مفسَّرة (Interpreted)، ما يتيح لك تشغيل نفس الكود على منصات متعددة دون إعادة ترجمة (Recompilation)
- 02
- تعدد أنماط البرمجة (Multiple Programming Paradigms)
- تدعم بايثون البرمجة كائنية التوجه والبرمجة الهيكلية بشكل كامل. كما تدعم ميزات اللغة مفاهيم متنوعة في البرمجة الوظيفية (Functional) والبرمجة الموجّهة بالجوانب (Aspect-oriented). وفي الوقت نفسه، تتميّز بايثون أيضًا بنظام أنواع ديناميكي وإدارة تلقائية للذاكرة.
- 03
- العديد من الأطر والأدوات مفتوحة المصدر
- 04
بايثون - لماذا؟
- تبسيط تطوير البرمجيات المعقّدة
- بايثون لغة برمجة عامة الغرض. لذا يمكنك استخدامها لتطوير تطبيقات سطح المكتب والويب على حد سواء. كما يمكنك استخدام بايثون لتطوير تطبيقات علمية وعددية معقّدة. صُمِّمت بايثون بميزات تسهّل تحليل البيانات وتصويرها (Visualization). يمكنك الاستفادة من ميزات تحليل البيانات في بايثون لإنشاء حلول بيانات ضخمة (Big data) مخصَّصة دون بذل وقت وجهد إضافيَّين. وفي الوقت نفسه،
- 05
- تمتلك بايثون مكتبات قوية مهمة جدًا مثل numpy وPandas وMatplotlib..
- 06
Anaconda هو مدير حزم (Package manager) ومدير بيئات (Environment manager) مجاني وسهل التثبيت، وتوزيعة بايثون، ومجموعة تضم أكثر من 720 حزمة مفتوحة المصدر توفّر دعمًا مجتمعيًا مجانيًا. يمكن تحميل Anaconda مجانًا من https://docs.continuum.io/anaconda/
- 15
16
- إذن في الخلاصة، بايثون
- تستخدم التنميط الديناميكي (Dynamic Typing) (يقوم المفسِّر بتعيين نوع لجميع المتغيرات وقت التشغيل)
- صياغة نحوية بسيطة
- مفسَّرة (Interpreted)
- كائنية التوجه (في إصدارات بايثون المبكرة لم تكن تدعم التغليف - Encapsulation، لكنها تدعمه الآن)
- _ متغير محمي (Protected)
- __ متغير خاص (Private)
17
- الوحدات (Modules) والحزم (Packages)
- الوحدات (Modules) | الحزم (Packages)
- ملف بايثون واحد يمكن استيراده (Import) في وحدة أخرى | مجموعة من الوحدات منظَّمة في تراتبية مجلدات (Directory hierarchy)
- يمكن استيراد الوحدة مباشرة باستخدام الكلمة المفتاحية import متبوعة باسم الوحدة.
- import module_name | تُستورد الحزمة باستخدام الكلمة المفتاحية import متبوعة باسم الحزمة، ويمكنك الوصول إلى الوحدة والحزم الفرعية داخل اسم الحزمة باستخدام تدوين النقطة (Dot notation).
- import package_name.module_name
- math، وrandom، وos، وdatetime، وcsv | Numpy، وPandas، وMatplotlib
18
- scikit-learn | مكتبة تعلّم الآلة في بايثون
- from sklearn.model_selection import train_test_split
- from sklearn.tree import DecisionTreeClassifier
- مكتبة SciPy: أدوات الحوسبة العلمية | توفّر مجموعة متنوعة من أدوات الحوسبة العلمية المفيدة، بما في ذلك التوزيعات الإحصائية، ومجموعة متنوعة من الدوال الرياضية المتخصصة.
- • مع scikit-learn، توفّر SciPy دعمًا للمصفوفات المتناثرة (Sparse matrices)، وهي طريقة لتخزين جداول كبيرة تتكوّن في معظمها من أصفار.
- import scipy as sp
- NumPy: مكتبة الحوسبة العلمية | توفّر بنى البيانات الأساسية التي تستخدمها scikit-learn، وخاصة المصفوفات متعددة الأبعاد.
- • عادةً، تكون البيانات المُدخَلة إلى scikit-learn على شكل مصفوفة NumPy.
- import numpy as np
- Pandas: معالجة البيانات وتحليلها | توفّر بنى بيانات أساسية مثل DataFrame
- • كما تدعم قراءة/كتابة البيانات بتنسيقات مختلفة
- import pandas as pd
- matplotlib: التصوير البياني (Visualization) | import matplotlib.pyplot as plt
19
20
21
22
23
- مثال كود: نظام التعرّف على الكائنات
- مجموعة البيانات: مجموعة بيانات الفاكهة
- https://github.com/susanli2016/Machine-Learning-with-Python/blob/22c63e943461dab8acdd02bac45710959a90ef65/fruit_data_with_colors.txt
24
25
26
27
28
29
30
31
أي أسئلة؟
- التالي....
- 32
محتوى المعمل 1:
- دفاتر Jupyter (Jupyter notebooks)
- دفاتر Colab (Colab notebooks)
- مكتبة Numpy
- مكتبة Pandas
- مكتبة Matplotlib
Numpy
import numpy as npإنشاء المصفوفات (Creating Arrays)
my_list = [0,1,2,3,4]arr = np.array(my_list)arrarray([0, 1, 2, 3, 4])np.arange(0,10)array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])np.arange(0,10,3)array([0, 3, 6, 9])np.zeros((5,5))array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])np.ones((2,4))array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])np.random.randint(0,10)1np.random.randint(0,100,(3,3))array([[83, 8, 29],
[59, 34, 44],
[72, 19, 10]])np.linspace(0,10,6)array([ 0., 2., 4., 6., 8., 10.])np.linspace(0,10,101)array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ,
1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1,
2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. , 3.1, 3.2,
3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4. , 4.1, 4.2, 4.3,
4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5. , 5.1, 5.2, 5.3, 5.4,
5.5, 5.6, 5.7, 5.8, 5.9, 6. , 6.1, 6.2, 6.3, 6.4, 6.5,
6.6, 6.7, 6.8, 6.9, 7. , 7.1, 7.2, 7.3, 7.4, 7.5, 7.6,
7.7, 7.8, 7.9, 8. , 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7,
8.8, 8.9, 9. , 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8,
9.9, 10. ])العمليات (Operations)
np.random.seed(101)
arr2 = np.random.randint(0,100,10)arr2array([95, 11, 81, 70, 63, 87, 75, 9, 77, 40])print( np.random.randint(0,100,10))[49 66 58 87 32 40 42 45 33 32]arr2.max()95arr2.min()9arr2.mean()60.8arr2.argmin()7arr2.argmax()0arr2.reshape(2,5)array([[95, 11, 81, 70, 63],
[87, 75, 9, 77, 40]])arr3=np.random.randint(0,100,9)arr3.reshape(3,3)array([[ 4, 63, 40],
[60, 92, 64],
[ 5, 12, 93]])الفهرسة (Indexing)
mat = np.arange(0,100).reshape(10,10)matarray([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])row = 0
col = 1
mat[row,col]1# With Slices
mat[:,0]array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])mat[0,:]array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])mat[0:3,0:3]array([[ 0, 1, 2],
[10, 11, 12],
[20, 21, 22]])mat[0:3,-3:-1]array([[ 7, 8],
[17, 18],
[27, 28]])Pandas
مكتبة Pandas
مكتبة للحوسبة مع البيانات الجدولية (Tabular data)
import pandas as pdstep_data = [3620, 7891, 9761, 3907, 4338, 5373]
print(step_data)
step_counts = pd.Series(step_data, name='steps')
print(step_counts)[3620, 7891, 9761, 3907, 4338, 5373]
0 3620
1 7891
2 9761
3 3907
4 4338
5 5373
Name: steps, dtype: int64step_counts.index = pd.date_range('20240329',periods=6)
print(step_counts)2024-03-29 3620
2024-03-30 7891
2024-03-31 9761
2024-04-01 3907
2024-04-02 4338
2024-04-03 5373
Freq: D, Name: steps, dtype: int64# Just like a dictionary
print(step_counts['2024-04-01'])3907# Or by index position--like an array
print(step_counts[3])3907# View the data type
print(step_counts.dtypes)int64cycling_data = [10.7, 0, None, 2.4, 15.3,10.9, 0, None]
# Create a tuple of data
joined_data = list(zip(step_data, cycling_data))
print(joined_data)
# The dataframe
activity_df = pd.DataFrame(joined_data)
print(activity_df)[(3620, 10.7), (7891, 0), (9761, None), (3907, 2.4), (4338, 15.3), (5373, 10.9)]
0 1
0 3620 10.7
1 7891 0.0
2 9761 NaN
3 3907 2.4
4 4338 15.3
5 5373 10.9activity_df = pd.DataFrame(joined_data,
index=pd.date_range('20240329',
periods=6),
columns=['Walking','Cycling'])
print(activity_df) Walking Cycling
2024-03-29 3620 10.7
2024-03-30 7891 0.0
2024-03-31 9761 NaN
2024-04-01 3907 2.4
2024-04-02 4338 15.3
2024-04-03 5373 10.9print(activity_df['Walking'])2024-03-29 3620
2024-03-30 7891
2024-03-31 9761
2024-04-01 3907
2024-04-02 4338
2024-04-03 5373
Freq: D, Name: Walking, dtype: int64print(activity_df.loc['2024-04-01'])Walking 3907.0
Cycling 2.4
Name: 2024-04-01 00:00:00, dtype: float64print(activity_df.loc['2024-04-01':'2024-04-03']) Walking Cycling
2024-04-01 3907 2.4
2024-04-02 4338 15.3
2024-04-03 5373 10.9print(activity_df.loc['2024-04-01':'2024-04-03',['Walking']]) Walking
2024-04-01 3907
2024-04-02 4338
2024-04-03 5373print(activity_df.iloc[0,:])
print(activity_df.iloc[:2,0])Walking 3620.0
Cycling 10.7
Name: 2024-03-29 00:00:00, dtype: float64
2024-03-29 3620
2024-03-30 7891
Freq: D, Name: Walking, dtype: int64data = pd.read_csv('D:\Deeplearning\LABS\Lab_01\data\Iris_Data.csv')data.head() sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosaprint(data.iloc[:5]) sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa#access dataset commands or from file mount drive
#from google.colab import drive
#drive.mount('/content/drive')#data = pd.read_csv('/content/drive/MyDrive/Iris_Data.csv')data.head()#num of rows
data.shape[1]5print(data['sepal_width'])
#print(data.sepal_width)0 3.5
1 3.0
2 3.2
3 3.1
4 3.6
...
145 3.0
146 2.5
147 3.0
148 3.4
149 3.0
Name: sepal_width, Length: 150, dtype: float64تُعدّ Loc وiloc دالتين في Pandas تُستخدمان لتقطيع (Slice) مجموعة بيانات في DataFrame الخاص بـPandas. تُستخدم الدالة .loc عادةً للفهرسة بالتسمية (Label indexing) ويمكنها الوصول إلى أعمدة متعددة، بينما تُستخدم .iloc للفهرسة بالأعداد الصحيحة (Integer indexing). دالة loc() هي طريقة اختيار بيانات قائمة على التسمية (Label based)، بمعنى أنه يجب علينا تمرير اسم الصف أو العمود الذي نريد اختياره. تتضمن هذه الطريقة العنصر الأخير من النطاق الممرَّر إليها، بخلاف iloc(). يمكن لـloc() قبول البيانات المنطقية (Boolean) بخلاف iloc(). يمكن تنفيذ عمليات عديدة باستخدام دالة loc() https://www.geeksforgeeks.org/difference-between-loc-and-iloc-in-pandas-dataframe/
print(data.loc[2],'\n')
print(data.loc[2,['sepal_length']])sepal_length 4.7
sepal_width 3.2
petal_length 1.3
petal_width 0.2
species Iris-setosa
Name: 2, dtype: object
sepal_length 4.7
Name: 2, dtype: objectprint(data.iloc[:5,:]) sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosaprint(data.iloc[0,:])
print(data.iloc[:,0])sepal_length 5.1
sepal_width 3.5
petal_length 1.4
petal_width 0.2
species Iris-setosa
Name: 0, dtype: object
0 5.1
1 4.9
2 4.7
3 4.6
4 5.0
...
145 6.7
146 6.3
147 6.5
148 6.2
149 5.9
Name: sepal_length, Length: 150, dtype: float64data['species'] = data.species.str.replace('Iris-', '')
print(data.loc[(data.sepal_width>3.5)]) sepal_length sepal_width petal_length petal_width species \
4 5.0 3.6 1.4 0.2 setosa
5 5.4 3.9 1.7 0.4 setosa
10 5.4 3.7 1.5 0.2 setosa
14 5.8 4.0 1.2 0.2 setosa
15 5.7 4.4 1.5 0.4 setosa
16 5.4 3.9 1.3 0.4 setosa
18 5.7 3.8 1.7 0.3 setosa
19 5.1 3.8 1.5 0.3 setosa
21 5.1 3.7 1.5 0.4 setosa
22 4.6 3.6 1.0 0.2 setosa
32 5.2 4.1 1.5 0.1 setosa
33 5.5 4.2 1.4 0.2 setosa
44 5.1 3.8 1.9 0.4 setosa
46 5.1 3.8 1.6 0.2 setosa
48 5.3 3.7 1.5 0.2 setosa
109 7.2 3.6 6.1 2.5 virginica
117 7.7 3.8 6.7 2.2 virginica
131 7.9 3.8 6.4 2.0 virginica
sepal_area
4 18.00
5 21.06
10 19.98
14 23.20
15 25.08
16 21.06
18 21.66
19 19.38
21 18.87
22 16.56
32 21.32
33 23.10
44 19.38
46 19.38
48 19.61
109 25.92
117 29.26
131 30.02# Create a new column that is a product
# of both measurements
data['sepal_area'] = data.sepal_length *data.sepal_width
# Print a few rows and columns
print(data.iloc[:5, -3:]) petal_width species sepal_area
0 0.2 setosa 17.85
1 0.2 setosa 14.70
2 0.2 setosa 15.04
3 0.2 setosa 14.26
4 0.2 setosa 18.00# Use the size method with a
# DataFrame to get count For a Series, use the .value_counts method
group_sizes = (data.groupby('species').size())
print(group_sizes)species
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
dtype: int64في تعلّم الآلة (وفي الرياضيات) غالبًا ما توجد ثلاث قيم تهمّنا:
- المتوسط (Mean) - القيمة المتوسطة
- الوسيط (Median) - قيمة نقطة المنتصف
- المنوال (Mode) - القيمة الأكثر تكرارًا
https://www.w3schools.com/python/python_ml_mean_median_mode.asp
print(data.sepal_width.mean())3.0540000000000003print(data.petal_length.median())4.35print(data.petal_length.mode())الانحراف المعياري (Standard deviation) رقم يصف مدى تشتّت القيم. الانحراف المعياري المنخفض يعني أن معظم الأرقام قريبة من قيمة المتوسط (Mean).
الانحراف المعياري المرتفع يعني أن القيم متناثرة عبر نطاق أوسع يُحسَب الانحراف المعياري كجذر تربيعي للتباين (Variance)
التباين (Variance) هو متوسط مربعات الفروق عن المتوسط. لحساب التباين، احسب الفرق بين كل نقطة في مجموعة البيانات والمتوسط. بمجرد حساب ذلك، ربّع النتائج واحسب متوسطها.
يقيس الخطأ المعياري للمتوسط (SEM - Standard error of the mean) مدى بُعد متوسط العينة (Sample mean) عن المتوسط الحقيقي للمجتمع (Population mean) على الأرجح. يكون SEM دائمًا أصغر من الانحراف المعياري (SD). يُحسَب SEM ببساطة بأخذ الانحراف المعياري وقسمته على الجذر التربيعي لحجم العيّنة
print(data.petal_length.std())
print(data.petal_length.var())
print(data.petal_length.sem())1.7644204199522617
3.1131794183445156
0.1440643240210085Matplotlib
import matplotlib.pyplot as pltax = plt.axes()
ax.hist(data.petal_length, bins=25);
ax.set(xlabel='Petal Length (cm)',
ylabel='Frequency',
title='Distribution of Petal Lengths');plt.plot(data.sepal_length,
data.sepal_width,
marker='o')
#plt.xlim(3,9)
#plt.ylim(1,20)
plt.title("Distribution of Petal Lengths")
plt.xlabel("Petal Length (cm)")
plt.ylabel("sepal_width")Text(0, 0.5, 'sepal_width')plt.hist(data.sepal_length, bins=25)
plt.title("Histogram")
plt.xlabel("Petal Length (cm)")
plt.ylabel("Frequency")