في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
تعلم الآلة، الأسبوع 5
التصنيف بخوارزمية أقرب الجيران (KNN)
صنف عينة جديدة بسؤال أقرب K من جيرانها، ثم ابن النموذج وقيمه واضبطه باستخدام scikit-learn.
الأهداف
- ▸شرح كيف تتنبأ خوارزمية أقرب الجيران (KNN) بالصنف: المسافة، ثم أقرب K من الصفوف، ثم التصويت بالأغلبية (majority vote)
- ▸حساب المسافات الإقليدية (Euclidean distances) وتنبؤ KNN يدويا عند K = 1 و3 و5
- ▸تحجيم (scaling) الخصائص (features) باستخدام
StandardScaler، وبيان سبب حاجة المسافة إليه - ▸تدريب
KNeighborsClassifier، ثم قراءة مصفوفة الالتباس (confusion matrix) والدقة (accuracy) والضبط (precision) والاستدعاء (recall) - ▸اختيار K بطريقة الكوع (elbow method)
- ▸بناء نموذج KNN واستخدامه على مجموعة بيانات iris، وتطبيقه على مشروعك
الأسبوع 5 من الخطة
موقع الدرس من المقرر
- ▸دفتران (notebooks): KNN_Classification (مجموعة بيانات من 1000 صف فيها 10 خصائص مجهولة الاسم) وNearest Neighbors (أزهار iris)
- ▸سيناريو من الواقع: نموذج تعلم موجه (supervised learning) بسيط على مجموعة بيانات iris الشهيرة، وفيها 150 عينة من ثلاثة أنواع
- ▸مرحلة المشروع (project milestone) هذا الأسبوع: تنفيذ نموذج تعلم الآلة (Machine Learning Model Implementation)
خطة الساعتين
| الجزء | ما نفعله | الزمن |
|---|---|---|
| 1 | الفكرة، ومثال محلول يدويا | 30 دقيقة |
| 2 | الدفتر 1: التحجيم، والتدريب، والتقييم | 25 دقيقة |
| 3 | اختيار K بطريقة الكوع | 10 دقائق |
| 4 | الدفتر 2 على iris، والأخطاء، ومشروعك | 20 دقيقة |
| 5 | تمارين مع الإجابات، ثم الخلاصة | 35 دقيقة |
الجزء 1
فكرة KNN
المدخلات المتشابهة لها تسميات متشابهة
ما خوارزمية أقرب الجيران؟
- خوارزمية أقرب الجيران (K-nearest neighbors)
- خوارزمية تعلم موجه بسيطة تتنبأ بالنتيجة بتحديد نقاط البيانات الأقرب إلى بيانات الإدخال.
المصطلحات على بيانات iris
| المصطلح | في بيانات iris |
|---|---|
الخصائص X | طول السبلة (sepal)، وعرض السبلة، وطول البتلة (petal)، وعرض البتلة (سم) |
التسمية (label) y | النوع: 0 setosa، و1 versicolor، و2 virginica |
| مجموعة التدريب (training set) | الأزهار التي يخزنها النموذج |
| نقطة الاستعلام (query) | زهرة جديدة نريد معرفة نوعها |
| K | عدد الجيران الذين يصوتون، وهو n_neighbors في scikit-learn |
الخوارزمية في أربع خطوات
- 1خزن صفوف التدريب وتسمياتها (وهذا كل ما يحتاج
fitإلى فعله) - 2احسب المسافة من نقطة الاستعلام إلى كل صف تدريب
- 3رتب المسافات واحتفظ بأصغر K منها
- 4احسب عدد كل تسمية بين هذه الصفوف الـK: تسمية الأغلبية هي التنبؤ
قياس القرب: المسافة الإقليدية
- ▸
xصف تدريب، وqنقطة الاستعلام، وnعدد الخصائص - ▸اطرح خاصية بخاصية، ثم ربع، ثم اجمع، ثم خذ الجذر التربيعي
- ▸الترتيب حسب مربع المسافة (squared distance) يعطي الترتيب نفسه، لذا يمكنك يدويا تأجيل الجذر حتى النهاية
يدويا
مثال محلول: زهرة جديدة واحدة
تسع أزهار iris حقيقية، وخاصيتان: طول البتلة وعرض البتلة بوحدة سم. الزهرة الجديدة هي (4.7, 1.7).
| الزهرة | النوع | (الطول، العرض) |
|---|---|---|
| F1 | setosa | (1.4, 0.2) |
| F2 | versicolor | (4.7, 1.6) |
| F3 | versicolor | (5.0, 1.7) |
| F4 | versicolor | (5.1, 1.6) |
| F5 | versicolor | (4.9, 1.5) |
| الزهرة | النوع | (الطول، العرض) |
|---|---|---|
| F6 | virginica | (4.9, 1.8) |
| F7 | virginica | (4.8, 1.8) |
| F8 | virginica | (5.0, 1.5) |
| F9 | virginica | (5.1, 1.8) |
الخطوة 1: مربعات المسافات، من F1 إلى F5
الفرق = الزهرة ناقص نقطة الاستعلام، للطول وللعرض
| الزهرة | الفروق | مربع المسافة |
|---|---|---|
| F1 | -3.30, -1.50 | 10.89 + 2.25 = 13.14 |
| F2 | 0, -0.10 | 0 + 0.01 = 0.01 |
| F3 | +0.30, 0 | 0.09 + 0 = 0.09 |
| F4 | +0.40, -0.10 | 0.16 + 0.01 = 0.17 |
| F5 | +0.20, -0.20 | 0.04 + 0.04 = 0.08 |
الخطوة 1: مربعات المسافات، من F6 إلى F9
| الزهرة | الفروق | مربع المسافة |
|---|---|---|
| F6 | +0.20, +0.10 | 0.04 + 0.01 = 0.05 |
| F7 | +0.10, +0.10 | 0.01 + 0.01 = 0.02 |
| F8 | +0.30, -0.20 | 0.09 + 0.04 = 0.13 |
| F9 | +0.40, +0.10 | 0.16 + 0.01 = 0.17 |
الخطوة 2: الترتيب وأخذ الجذور
| الترتيب | الزهرة | النوع | المسافة d |
|---|---|---|---|
| 1 | F2 | versicolor | √0.01 = 0.100 |
| 2 | F7 | virginica | √0.02 = 0.141 |
| 3 | F6 | virginica | √0.05 = 0.224 |
| 4 | F5 | versicolor | √0.08 = 0.283 |
| 5 | F3 | versicolor | √0.09 = 0.300 |
الخطوة 3: التصويت عند K = 1
الخطوة 3: التصويت عند K = 3
الخطوة 3: التصويت عند K = 5
جرب بنفسك: المثال المحلول تفاعليا
قيمة K اختيار، والتعادل وارد
- ▸لا تتعلم الخوارزمية قيمة K من البيانات: أنت تختارها، ثم تتحقق منها على بيانات الاختبار (الجزء 3)
- ▸قيمة K الصغيرة تتبع الصف الأقرب وحده، حتى لو كان صفا شاذا
- ▸قيمة K الأكبر تصغي إلى صفوف أكثر، فيقل أثر الصف الشاذ الواحد
- ▸مع قيمة K زوجية قد يتعادل التصويت، مثل 1 مقابل 1 عند K = 2
الجزء 2
الدفتر 1: بيانات Classified Data
التحجيم، والتقسيم، والتدريب، والتقييم
افتح الدفتر في Colab
https://colab.research.google.com/github/
tirthajyoti/Machine-Learning-with-Python/blob/
master/Classification/KNN_Classification.ipynbتحميل البيانات وفحصها
import pandas as pd
import numpy as np
url = ("https://raw.githubusercontent.com/"
"tirthajyoti/Machine-Learning-with-Python/"
"master/Datasets/Classified%20Data")
df = pd.read_csv(url, index_col=0)
df.info()- ▸1000 صف، و10 أعمدة خصائص بأسماء مختلقة (
WTT،PTI، ...) - ▸عمود تسمية واحد،
TARGET CLASS، وقيمه0و1 - ▸بيانات متوازنة: 500 صف من كل صنف
- ▸يرسم الدفتر مخطط صندوق (boxplot) لكل خاصية، مقسما حسب الصنف، لنرى أي الخصائص تفصل بين الصنفين
لماذا تحتاج KNN إلى خصائص محجمة
- ▸المسافة تجمع مربعات فروق كل الخصائص
- ▸الخاصية المقيسة على مقياس أكبر تضيف أرقاما أكبر، فتتحكم وحدها فيمن يعد "قريبا"
- ▸يعيد
StandardScalerتحجيم كل خاصية إلى متوسط 0 (mean) وانحراف معياري 1 (standard deviation)، فيصبح لكل خاصية صوت عادل
مثال محلول: تحجيم قيمة واحدة
الصف 0 من WTT: x = 0.913917، والمتوسط 0.949682، والانحراف المعياري 0.289490
تحجيم الخصائص
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(df.drop('TARGET CLASS', axis=1))
scaled_features = scaler.transform(df.drop('TARGET CLASS', axis=1))
df_feat = pd.DataFrame(scaled_features, columns=df.columns[:-1])
df_feat.head()التقسيم والتدريب والتنبؤ
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
scaled_features, df['TARGET CLASS'], test_size=0.50, random_state=101)
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
pred = knn.predict(X_test)مصفوفة الالتباس عند K = 1
print(confusion_matrix(y_test, pred))
| التنبؤ 0 | التنبؤ 1 | |
|---|---|---|
| الفعلي 0 | 233 | 17 |
| الفعلي 1 | 24 | 226 |
الدقة ونسبة الخطأ
الضبط والاستدعاء من المصفوفة نفسها
- ضبط الصنف
- من بين الصفوف التي تنبأ النموذج بأنها من هذا الصنف، نسبة ما ينتمي إليه فعلا.
- استدعاء الصنف
- من بين الصفوف التي تنتمي فعلا إلى هذا الصنف، نسبة ما وجدناه منها.
الجزء 3
اختيار K
طريقة الكوع
حلقة الكوع
error_rate = []
for i in range(1, 60):
knn = KNeighborsClassifier(n_neighbors=i)
knn.fit(X_train, y_train)
pred_i = knn.predict(X_test)
error_rate.append(np.mean(pred_i != y_test))- ▸درب نموذجا لكل قيمة K، من 1 إلى 59
- ▸سجل نسبة الخطأ (error rate) على بيانات الاختبار لكل نموذج
- ▸ارسم الخطأ مقابل K وابحث عن الانحناءة التي يستوي بعدها المنحنى
ما تجده الحلقة
نسبة الخطأ على 500 صف اختبار
| K | نسبة الخطأ | الصفوف الخاطئة |
|---|---|---|
| 1 | 0.082 | 41 |
| 2 | 0.094 | 47 |
| 5 | 0.054 | 27 |
| 11 | 0.048 | 24 |
| 24 | 0.046 | 23 |
جرب بنفسك: شغل حلقة الكوع
الجزء 4
الدفتر 2: أزهار iris
150 عينة، وثلاثة أنواع
تحميل iris في DataFrame
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['class'] = iris.target
df['class name'] = iris.target_names[iris['target']]
df.head()
sns.pairplot(df)- ▸150 زهرة، و50 من كل نوع
- ▸4 خصائص، كلها بوحدة سم
- ▸مضمنة في scikit-learn: لا حاجة إلى تنزيل شيء
- ▸يبين مخطط الأزواج (pair plot) أن خاصيتي البتلة تفصلان بين الأنواع أفضل من غيرهما
التقسيم والتدريب وحساب النتيجة
x_train, x_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.2, random_state=0)
model = KNeighborsClassifier()
model.fit(x_train, y_train)
model.score(x_test, y_test)التنبؤ بزهرة لم يرها النموذج من قبل
predicted_class = model.predict([[5.6, 4.4, 1.2, 0.4]])
print(predicted_class)
print(iris.target_names[predicted_class[0]])لماذا setosa؟ الجيران الخمسة
يسردهم model.kneighbors: الخمسة كلهم من setosa، والتصويت 5 مقابل 0
| الجار | النوع | المسافة |
|---|---|---|
| (5.7, 4.4, 1.5, 0.4) | setosa | 0.3162 |
| (5.8, 4, 1.2, 0.2) | setosa | 0.4899 |
| (5.2, 4.1, 1.5, 0.1) | setosa | 0.6557 |
| (5.4, 3.9, 1.7, 0.4) | setosa | 0.7348 |
| (5.7, 3.8, 1.7, 0.3) | setosa | 0.7937 |
أين يخطئ نموذج iris
confusion_matrix(y_test, model.predict(x_test))
| التنبؤ setosa | التنبؤ versicolor | التنبؤ virginica | |
|---|---|---|---|
| setosa | 11 | 0 | 0 |
| versicolor | 0 | 12 | 1 |
| virginica | 0 | 0 | 6 |
استكشف: أزهار iris الـ150 كلها
قبل التمارين
الأخطاء الشائعة
- ▸نسيان التحجيم قبل نموذج يعتمد على المسافة
- ▸تمرير قائمة مسطحة واحدة إلى
predict: فهي تحتاج إلى[[...]] - ▸قراءة
"Classified Data"في Colab من مجلد لا يحتويه - ▸الحكم على النموذج بصفوف التدريب بدلا من صفوف الاختبار
- ▸تتويج قيمة K بسبب فرق صف أو صفين من صفوف الاختبار
- ▸استخدام قيمة K زوجية مع صنفين والوقوع في التعادل
مشروع فريقك
مرحلة المشروع: تنفيذ النموذج
- 1خذ الخصائص والهدف (target) اللذين اخترتهما في الأسبوع 4
- 2حجم الخصائص، ثم قسمها إلى مجموعتي تدريب واختبار
- 3درب
KNeighborsClassifierوتنبأ بمجموعة الاختبار - 4اعرض مصفوفة الالتباس و
classification_report - 5شغل حلقة الكوع، واختر K، واكتب سبب اختيارك
الجزء 5
التمارين: دورك
نحو 30 دقيقة، والإجابات تلي كل مهمة
نحو 10 دقائق
التمرين 1: زهرة جديدة ثانية
- ▸استخدم الأزهار التسع نفسها من F1 إلى F9 (طول البتلة، عرض البتلة)
- ▸الزهرة الجديدة هي (5.1, 1.75)
- ▸احسب مربع المسافة إلى كل زهرة ورتب الأزهار
- ▸تنبأ بالنوع عند K = 1 وK = 3 وK = 5
الإجابات
التمرين 1: الإجابة، الترتيب
| الترتيب | الزهرة | النوع | مربع المسافة |
|---|---|---|---|
| 1 | F9 | virginica | 0.0025 |
| 2 | F3 | versicolor | 0.0125 |
| 3 | F4 | versicolor | 0.0225 |
| 4 | F6 | virginica | 0.0425 |
| 5 | F8 | virginica | 0.0725 |
الإجابات
التمرين 1: الإجابة، الأصوات
نحو 5 دقائق
التمرين 2: قراءة مصفوفة الالتباس
| التنبؤ 0 | التنبؤ 1 | |
|---|---|---|
| الفعلي 0 | 238 | 12 |
| الفعلي 1 | 12 | 238 |
نحو 5 دقائق
التمرين 3: التقييس (standardization) يدويا
لخاصية واحدة القيم الخمس 4, 6, 8, 10, 12
نحو 10 دقائق
التمرين 4: في Colab، على iris
- 1شغل الدفتر 2 حتى
model.score(x_test, y_test) - 2تنبأ بالزهرة
[[6.0, 2.9, 4.5, 1.5]]واطبع اسم نوعها - 3استدع
model.kneighborsعليها: كيف صوت جيرانها الخمسة؟ - 4مر على قيم K من 1 إلى 15 في حلقة على التقسيم نفسه، واطبع كل نتيجة
الإجابات
التمرين 4: الإجابة
| السؤال | الإجابة |
|---|---|
نوع [6.0, 2.9, 4.5, 1.5] | versicolor |
| الجيران الخمسة | 4 versicolor، و1 virginica |
| أقرب جار | (6.1, 3, 4.6, 1.4)، والمسافة 0.2000 |
| النتيجة 1.0 عند K = | 1 و4، ومن 6 إلى 15 |
| النتيجة 0.9667 عند K = | 2 و3 و5 |
الخلاصة
- 1تتنبأ KNN بالتصويت بالأغلبية بين صفوف التدريب الـK الأقرب إلى نقطة الاستعلام
- 2القرب هو المسافة الإقليدية، لذا يجب أن تكون الخصائص على المقياس نفسه
- 3قد يتغير صنف نقطة الاستعلام نفسها مع تغير K: فقيمة K إعداد تختاره أنت
- 4قيم النموذج على بيانات الاختبار بمصفوفة الالتباس والدقة والضبط والاستدعاء
- 5اختر K بطريقة الكوع، ولا تلاحق فروقا من صف أو صفين
افتح هذا الدرس
Mahmoud Abas|التصنيف بخوارزمية أقرب الجيران (KNN)