AI: مقدمة في تعلّم الآلة
آخر تحديث: 2026-08-26
التعلم الآلي (ML) هو أكثر الحقول الفرعية الأساسية للذكاء الاصطناعي - فجميع تطبيقات الذكاء الاصطناعي الحديثة تقريبًا (أنظمة التوصية، التعرف على الصوت، القيادة الذاتية) مبنية على التعلم الآلي. ستساعدك هذه الفصل على فهم جوهر التعلم الآلي، وثلاثة أنماطه الرئيسية، وأنواع المهام التي يعالجها، وسيرشدك خلال تنفيذ أول مصنف للتعلم الآلي مكتمل باستخدام مكتبة sklearn.
1. ما ستتعلمه
- الفرق الجوهري بين تعلم الآلة والبرمجة التقليدية
- المناهج الرئيسية الثلاثة: التعلم الخاضع للإشراف، التعلم غير الخاضع للإشراف، والتعلم المعزز
- أنواع المهام: التصنيف مقابل الانحدار مقابل التجميع
- لمحة عامة على سير عمل التعلم الآلي (تحديد المشكلة → البيانات → الخصائص → التدريب → التقييم → النشر)
- تنفيذ أول مصنف خاص بك باستخدام sklearn
2. القصة: عندما تكون هناك قواعد كثيرة لا يمكن حصرها
(1) نقطة الضعف: كلما زادت القواعد المكتوبة، انخفضت الدقة
تحتاج شركة التجارة الإلكترونية الخاصة بـ بوب إلى التنبؤ بما إذا كان المستخدمون سيشترون منتجًا معينًا. بدأ في كتابة القواعد:
IF age > 30 AND browse_count > 3 THEN buy = yes
IF age < 25 AND cart_count > 0 THEN buy = maybe
IF region = "east" AND discount > 20% THEN buy = yes
... (300 قاعدة إضافية لاحقًا) ...
لقد قمنا بتوسيع القواعد من 10 إلى 300، لكن نسبة الدقة ارتفعت من 60% إلى 72% ثم توقفت عن التحسن. في كل مرة يتم فيها تقديم فئة منتج جديدة، يجب علينا إعادة كتابة القواعد من جديد - إنه أمر مستحيل إتمامه.
(2) حلول التعلم الآلي
اقترحت أليس: "دعونا لا نكتب أي قواعد - ودع الخوارزمية تجد الأنماط بنفسها من 100 ألف سجل تاريخي."
▶ مثال: التنبؤ بسلوك الشراء القائم على القواعد مقابل القائم على البيانات (الصعوبة: ⭐)
# Rule-based approach: you write the logic
def will_buy_rules(user):
"""Predict purchase using hand-written rules"""
if user['age'] > 30 and user['browse_count'] > 3:
return True
if user['cart_count'] > 0 and user['discount_pct'] > 20:
return True
return False
# ML approach: algorithm learns from data
# from sklearn.neighbors import KNeighborsClassifier
# model = KNeighborsClassifier(n_neighbors=5)
# model.fit(X_train, y_train) # Learns patterns from 100K records
# prediction = model.predict(new_user_data)
المخرجات: (قم بتشغيل المثال لرؤية المخرجات الفعلية، أو راجع ملاحظة المخرجات المتوقعة في تعليقات الكود أعلاه.)
(3) العوائد: من 72% إلى 89%
درب بوب نموذجًا باستخدام التعلم الآلي، فقفزت الدقة من 72% إلى 89%. علاوة على ذلك، بالنسبة لفئات المنتجات الجديدة، كل ما هو مطلوب هو إضافة المزيد من البيانات وإعادة تدريب النموذج - دون كتابة سطر واحد من القواعد.
3. ما هو التعلم الآلي؟
(1) تعريف آرثر صمويل (1959)
"التعلم الآلي هو مجال الدراسة الذي يمنح أجهزة الكمبيوتر القدرة على التعلم دون برمجتها بشكل صريح."
الفكرة الأساسية: لا يتعلق الأمر بكتابة قواعد يتبعها الكمبيوتر؛ بل يتعلق بتوفير البيانات حتى يتمكن الكمبيوتر من تعلم القواعد بنفسه.
(2) تعريف توم ميتشل (1997)
"يُقال إن برنامج كمبيوتر يتعلم من الخبرة E فيما يتعلق بفئة من المهام T ومقياس الأداء P، إذا تحسنت أداؤه في المهام ضمن T، كما يُقاس بمقياس P، مع المزيد من الخبرة E."
ببساطة: عندما يتحسن أداء البرنامج P على المهمة T مع زيادة خبرته E، يُقال إنه "يتعلم".
لنأخذ سيناريو بوب كمثال:
| الرمز | المعنى | المقابل |
|---|---|---|
| T | المهمة | التنبؤ بما إذا كان المستخدم سيشتري |
| E | الخبرة | 100,000 سجل شراء تاريخي |
| P | الأداء | دقة التنبؤ |
(3) القواعد التقليدية مقابل التعلم الآلي
| البُعد | القواعد التقليدية | التعلم الآلي |
|---|---|---|
| مصدر القاعدة | مكتوبة يدويًا | تم تعلمها بواسطة خوارزمية من البيانات |
| قابلية التوسع | ضعيفة (تتوسع القواعد مع السيناريو) | جيدة (يمكن إعادة التدريب ببيانات جديدة) |
| التكيف مع التغييرات | يتطلب تعديلات يدوية للقواعد | يتكيف تلقائيًا مع التغيرات في توزيع البيانات |
| اكتشاف الأنماط المخفية | صعب (لا يمكن العثور على أنماط لا يستطيع الناس التفكير فيها) | ممكن (يمكن للخوارزميات اكتشاف تركيبات غير خطية) |
| قابلية التفسير | قوية (القواعد واضحة من النظرة الأولى) | ضعيفة (النموذج "صندوق أسود"، ولكن يمكن تفسيره) |
| تكاليف التطوير | منخفضة عندما تكون القواعد بسيطة؛ مرتفعة للغاية عندما تكون معقدة | تتطلب بيانات وقوة حسابية في المراحل المبكرة؛ تكاليف منخفضة لاحقًا |
| المقارنة | أنت تُعلم الطفل كل خطوة بالخطوة | أنت تعرض على الطفل 1,000 مشكلة وتتركه يكتشفها بنفسه |
4. الأنماط الثلاثة الرئيسية: التعلم الخاضع للإشراف / غير الخاضع للإشراف / التعزيزي
ينقسم تعلم الآلة إلى ثلاثة أنماط رئيسية بناءً على "أساليب التعلم":
graph TB
ML[تعلم الآلة] --> SL[التعلم الخاضع للإشراف]
ML --> UL[التعلم غير الخاضع للإشراف]
ML --> RL[التعلم التعزيزي]
SL --> SL1[التصنيف]
SL --> SL2[الانحدار]
UL --> UL1[التجميع]
UL --> UL2[تقليل الأبعاد]
RL --> RL1[الذكاء الاصطناعي للألعاب]
RL --> RL2[التحكم في الروبوتات]
style ML fill:#e8f5e9
style SL fill:#e1f5fe
style UL fill:#fff3e0
style RL fill:#f3e5f5
(1) التعلم الخاضع للإشراف (Supervised Learning)
الميزة الرئيسية: بيانات التدريب مُعلَّمة (مع الإجابات).
تشبه معلمًا يوجه الطلاب خلال مسائل تدريبية - كل مسألة لها إجابة معيارية، ويتعلم الطلاب باتباع عملية "حل المسائل → التحقق من الإجابات → تصحيح الأخطاء".
| العنصر | الوصف |
|---|---|
| المُدخَلات | السمات X + التسمية y |
| عملية التعلم | إيجاد دالة التعيين من X إلى Y |
| المُخرَجَات | نموذج قادر على التنبؤ بالقيمة y لقيم X جديدة |
| المهام النموذجية | التصنيف (تسميات منفصلة)، الانحدار (تسميات مستمرة) |
| أمثلة | التنبؤ بأسعار المنازل بناءً على حجم العقار وموقعه (انحدار)؛ تحديد ما إذا كان البريد الإلكتروني بريدًا غير مرغوب فيه بناءً على محتواه (تصنيف) |
▶ مثال: تحميل مجموعة بيانات الزهرة السوسنية باستخدام sklearn وإجراء التصنيف (الصعوبة: ⭐)
# Load the Iris dataset and inspect its structure
from sklearn.datasets import load_iris
iris = load_iris()
print(f"Feature names: {iris.feature_names}")
print(f"Target names: {list(iris.target_names)}")
print(f"Samples: {iris.data.shape[0]}")
print(f"Features: {iris.data.shape[1]}")
print(f"\nFirst 5 samples:")
for i in range(5):
print(f" {iris.data[i]} → {iris.target_names[iris.target[i]]}")
Feature names: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
Target names: ['setosa', 'versicolor', 'virginica']
Samples: 150
Features: 4
First 5 samples:
[5.1 3.5 1.4 0.2] → setosa
[4.9 3.0 1.4 0.2] → setosa
[4.7 3.2 1.3 0.2] → setosa
[4.6 3.1 1.5 0.2] → setosa
[5.0 3.6 1.4 0.2] → setosa
(2) التعلم غير الخاضع للإشراف (Unsupervised Learning)
الميزة الرئيسية: بيانات التدريب غير مُعلَّمة.
يشبه إعطاء طفلًا كومة من الصور وتركه يرتبها بنفسه بناءً على "شكلها" - دون أن يخبره أحد، "هذه قطة" أو "ذلك كلب".
| العنصر | الوصف |
|---|---|
| المُدخَلات | السمات X فقط، بدون تسمية y |
| عملية التعلم | اكتشاف البنية والأنماط الجوهرية للبيانات |
| المُخرَجَات | تجميع البيانات، بنيتها، وتمثيلها المضغوط |
| المهام النموذجية | التجميع، تقليل الأبعاد، كشف الشذوذ |
| أمثلة | تقسيم العملاء إلى شرائح (عدد الشرائح غير معروف؛ يحددها الخوارزمية تلقائيًا)، توصيات المنتجات (تحديد أنماط الشراء) |
(3) التعلم التعزيزي (Reinforcement Learning)
الميزة الرئيسية: التعلم من خلال التجربة والخطأ وإشارات المكافأة.
يشبه تمامًا تدريب جرو - أعه وجبة خفيفة (مكافأة) عندما يفعل شيئًا صحيحًا، وتجاهله (عقوبة) عندما يفعل شيئًا خاطئًا. يتعلم الجرو تدريجيًا أي السلوكيات تكسبه مكافأة.
| العنصر | الوصف |
|---|---|
| المُدخَلات | حالة البيئة + مساحة الإجراءات |
| عملية التعلم | تجربة وخطأ → تلقي مكافأة/عقوبة → ضبط الاستراتيجية |
| المُخرَجَات | الاستراتيجية التي تُعظم المكافآت التراكمية في البيئة |
| المهام النموذجية | الذكاء الاصطناعي للألعاب، التحكم في الروبوتات، اتخاذ القرارات في القيادة ذاتية التشغيل |
| أمثلة | AlphaGo في لعبة غو، التعلم التعزيزي البشري التوجيهي (RLHF) المستخدم في ChatGPT |
(4) مقارنة بين الأنماط الثلاثة
| البُعد | التعلم الخاضع للإشراف | التعلم غير الخاضع للإشراف | التعلم التعزيزي |
|---|---|---|---|
| البيانات | مُعلَّمة (X + y) | غير مُعلَّمة (X فقط) | حالة + إشارة مكافأة |
| الهدف | التنبؤ بالتسمية | اكتشاف البنية | تعظيم المكافأة |
| التغذية الراجعة | فورية (تخبرك ما إذا كنت مصيبًا أم مخطئًا) | لا يوجد (لا يوجد صواب أو خطأ) | متأخرة (لا تعرف ما إذا كان جيدًا أم سيئًا حتى تتخذ خطوات كثيرة) |
| الخوارزميات النموذجية | KNN، SVM، أشجار القرار | K-Means، PCA، DBSCAN | Q-Learning، PPO، SAC |
| التطبيقات النموذجية | كشف البريد غير المرغوب فيه، التنبؤ بأسعار المنازل | تقسيم العملاء، تقليل الأبعاد | الذكاء الاصطناعي للألعاب، الروبوتات، القيادة ذاتية التشغيل |
| متطلبات البيانات | تكاليف تعليق مرتفعة | البيانات سهلة الوصول | يتطلب بيئة محاكاة |
| التشبيه | معلم يوجه الطلاب في حل المسائل | قراءة كتاب بنفسك لاكتشاف الأنماط | تدريب جرو على أداء حيل |
5. أنواع المهام: التصنيف / الانحدار / التجميع
(1) التصنبف (Classification)
التنبؤ بـعلامات فئات منفصلة. على سبيل المثال: هل البريد الإلكتروني هو بريد مزعج (spam) أم لا؟ هل الصورة هي لقطة أم لكلب؟
| النوع | الوصف | مثال |
|---|---|---|
| التصنيف الثنائي | فئتان فقط | بريد مزعج/عادي، احتيال/مشروع |
| فئات متعددة | 3 فئات أو أكثر | 3 أنواع من زهرة السوسن، الأرقام المكتوبة بخط اليد من 0 إلى 9 |
(2) الانحدار (Regression)
التنبؤ بـقيم مستمرة. على سبيل المثال: ما هو سعر المنزل؟ ما هي درجة الحرارة غداً؟
(3) التجميع (Clustering)
تجميع تلقائي للبيانات بناءً على التشابه، دون فئات محددة مسبقاً. على سبيل المثال: تقسيم العملاء تلقائياً إلى 3 مجموعات.
(4) مقارنة بين التصنيف والانحدار والتجميع
| البُعد | التصنيف | الانحدار | التجميع |
|---|---|---|---|
| نوع المخرجات | فئات منفصلة | قيم مستمرة | علامات مجموعات |
| هل تتطلب تسميات؟ | نعم (تعلم خاضع للإشراف) | نعم (تعلم خاضع للإشراف) | لا (تعلم غير خاضع للإشراف) |
| الهدف | التنبؤ بالفئة التي ينتمي إليها العينة | التنبؤ بقيمة محددة | تحديد التجميعات الطبيعية في البيانات |
| مقياس التقييم | الدقة / F1 | MAE / RMSE / R² | معامل ظلوي / القصور الذاتي |
| مثال | تحديد ما إذا كان مستخدم قد قام بعملية شراء أم لا | التنبؤ بمبلغ إنفاق المستخدم | تقسيم المستخدمين تلقائياً إلى عدة مجموعات |
| مقياس تشبيهي | تحديد ما إذا كانت قطعة فاكهة هي تفاحة أم برتقالة | تقدير وزن قطعة فاكهة | ترتيب سلة من الفواكه المتنوعة إلى أكوام عدة بناءً على مظهرها |
6. نظرة عامة على سير عمل التعلم الآلي
يتكون مشروع التعلم الآلي الكامل من ست خطوات، لا يمكن تخطي أي منها:
graph TB
A[1. تحديد المشكلة] --> B[2. جمع البيانات]
B --> C[3. هندسة الميزات]
C --> D[4. تدريب النموذج]
D --> E[5. التقييم]
E --> F{جيد بما يكفي؟}
F -->|لا| C
F -->|نعم| G[6. النشر]
G --> H[المراقبة وإعادة التدريب]
style A fill:#e1f5fe
style B fill:#e8f5e9
style C fill:#fff3e0
style D fill:#f3e5f5
style E fill:#fce4ec
style G fill:#e0f2f1
style H fill:#f1f8e9
(1) تحديد المشكلة
حدد المشكلة المراد حلها بوضوح، سواء كانت المهمة تتعلق بالتصنيف أو الانحدار، وما هي معايير النجاح.
| تعريف جيد للمشكلة | تعريف ضعيف للمشكلة |
|---|---|
| "التنبؤ بأن المستخدمين سيشترون منتجًا خلال 7 أيام" | "دع الذكاء الاصطناعي يساعدنا في بيع المزيد" |
| "كشف المعاملات الاحتيالية ببطاقات الائتمان (F1 ≥ 0.9)" | "كشف المعاملات غير الطبيعية" |
(2) جمع البيانات
البيانات هي حجر الأساس في التعلم الآلي. تحدد جودة البيانات بشكل مباشر الحد الأقصى لأداء النموذج.
| بُعد البيانات | بيانات جيدة | بيانات ضعيفة |
|---|---|---|
| الحجم | كافٍ (بآلاف السجلات على الأقل) | قليل جدًا (بضع عشرات السجلات) |
| الجودة | تسميات دقيقة، ميزات كاملة | تسميات خاطئة، قيم مفقودة كثيرة |
| التنوع | تغطي مجموعة متنوعة من السيناريوهات | تغطي سيناريو واحدًا فقط |
(3) هندسة الميزات
تحويل البيانات الأولية إلى ميزات رقمية يمكن للنموذج فهمها:
بيانات أولية ← هندسة الميزات ← ميزات
"ذكر من بكين يبلغ من العمر 25 عامًا" ← [25, 1, 39] (العمر، رمز_الجنس، رمز_المدينة)
(4) تدريب النموذج
اختر خوارزمية، حدد المعاملات الفوقية، وقم بتدريب النموذج على بيانات التدريب.
(5) تقييم النموذج
قم بتقييم الأداء على مجموعة الاختبار (بيانات لم يرها النموذج من قبل) لضمان قدرة النموذج على التعميم.
(6) النشر والإطلاق
انشر النموذج كواجهة برمجة تطبيقات (API) أو قم بتضمينه في تطبيق، وراقب أستمرار أداءه، وأعد تدريبه بشكل دوري.
7. النموذج الموحد لواجهة sklearn
مكتبة scikit-learn (sklearn) هي مكتبة التعلم الآلي الأكثر شعبية لـ Python، وتصميم واجهتها التطبيقية (API) متسق تمامًا — جميع النماذج تتبع نفس مجموعة من الواجهات:
model = SomeClassifier(params) # 1. إنشاء النموذج
model.fit(X_train, y_train) # 2. تدريب النموذج
model.predict(X_new) # 3. التنبؤ
model.score(X_test, y_test) # 4. التقييم
▶ مثال: التدريب والتنبؤ باستخدام مصنف KNN (الصعوبة: ⭐⭐)
# مصنف KNN: التدريب والتنبؤ
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# تحميل البيانات وتقسيمها
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# إنشاء النموذج وتدريبه
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# التنبؤ
y_pred = knn.predict(X_test)
# التقييم
train_acc = knn.score(X_train, y_train)
test_acc = knn.score(X_test, y_test)
print(f"دقة التدريب: {train_acc:.3f}")
print(f"دقة الاختبار: {test_acc:.3f}")
# التنبؤ بعينة جديدة
import numpy as np
new_sample = np.array([[5.0, 3.4, 1.5, 0.2]])
pred = knn.predict(new_sample)
print(f"الفئة المتوقعة للعينة الجديدة: {load_iris().target_names[pred[0]]}")
Train accuracy: 0.971
Test accuracy: 0.978
New sample predicted class: setosa
(1) مرجع سريع لمشتقات sklearn الشائعة
| المصنف | اسم الفئة | المعلمات الرئيسية | الميزات |
|---|---|---|---|
| KNN | KNeighborsClassifier |
n_neighbors |
بديهي وبسيط، مناسب لمجموعات البيانات الصغيرة |
| شجرة القرار | DecisionTreeClassifier |
max_depth |
قابلية عالية للتفسير، معرّض للإفراط في التجهيز |
| الغابة العشوائية | RandomForestClassifier |
n_estimators |
طريقة تجميعية، شديدة الصلابة |
| SVM | SVC |
C, kernel |
دقة عالية مع مجموعات البيانات الصغيرة |
| الانحدار اللوجستي | LogisticRegression |
C |
خط أساس خطي، مخرجات احتمالية |
| نايف بايز | GaussianNB |
— | يُستخدم بشكل شائع في تصنيف النصوص؛ سريع للغاية |
fit() / predict() / score() — للتبديل بين الخوارزميات، كل ما عليك تغيير اسم الفئة في سطر واحد فقط.
8. مثال كامل: استخدام KNN لإكمال تدفق عمل التعلم الآلي بالكامل على مجموعة بيانات آيريس
فيما يلي مثال كامل يشرح تدفق عمل التعلم الآلي بالكامل، من تحميل البيانات إلى حدود القرار للتصور:
▶ مثال: مقارنة دقة الأداء لقيم k المختلفة (الصعوبة: ⭐⭐)
# Compare KNN with different k values
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
print("=== KNN: Effect of k value ===")
for k in [1, 3, 5, 7, 9, 15, 30]:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
train_acc = knn.score(X_train, y_train)
test_acc = knn.score(X_test, y_test)
print(f"k={k:2d} | Train: {train_acc:.3f} | Test: {test_acc:.3f}")
=== KNN: Effect of k value ===
k= 1 | Train: 1.000 | Test: 0.956
k= 3 | Train: 0.971 | Test: 0.978
k= 5 | Train: 0.971 | Test: 0.978
k= 7 | Train: 0.971 | Test: 0.978
k= 9 | Train: 0.971 | Test: 0.978
k=15 | Train: 0.971 | Test: 0.978
k=30 | Train: 0.952 | Test: 0.956
▶ مثال: تفسير تقرير التصنيف (الصعوبة: ⭐⭐)
# Detailed classification report
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print("=== Classification Report ===")
print(classification_report(y_test, y_pred, target_names=load_iris().target_names))
=== Classification Report ===
precision recall f1-score support
setosa 1.00 1.00 1.00 15
versicolor 1.00 0.93 0.97 15
virginica 0.94 1.00 0.97 15
accuracy 0.98 45
macro avg 0.98 0.98 0.98 45
weighted avg 0.98 0.98 0.98 45
كيفية تفسير تقرير التصنيف:
| المقياس | المعنى | التفسير |
|---|---|---|
| precision (الدقة) | نسبة العينات التي تم التنبؤ بأنها تنتمي إلى هذه الفئة وأنها فعليًا تنتمي إليها | دقة versicolor = 1.00 = جميع العينات التي تم التنبؤ بأنها versicolor صحيحة |
| recall (الاستدعاء) | نسبة العينات الحقيقية من تلك الفئة التي تم التنبؤ بها بشكل صحيح | استدعاء versicolor = 0.93 = تم تصنيف عينة versicolor واحدة بشكل خاطئ |
| f1-score (درجة F1) | المتوسط التوافقي للدقة والاستدعاء | مقياس مركب؛ كلما اقترب من 1 كان أفضل |
| support (الدعم) | عدد العينات الحقيقية في هذه الفئة | 15 عينة اختبار لكل فئة |
▶ مثال: تصور حدود القرار (الصعوبة: ⭐⭐⭐)
# Visualize KNN decision boundaries on Iris (2 features)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
iris = load_iris()
X = iris.data[:, :2] # Use only first 2 features for 2D plot
y = iris.target
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X, y)
# Create mesh grid for decision boundary
h = 0.02
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
# Plot
plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Set1)
scatter = plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, edgecolors='black')
plt.xlabel('Sepal length (cm)')
plt.ylabel('Sepal width (cm)')
plt.title('KNN (k=5) Decision Boundary on Iris')
plt.legend(handles=scatter.legend_elements()[0], labels=list(iris.target_names))
plt.savefig('knn_decision_boundary.png', dpi=150, bbox_inches='tight')
plt.show()
print("Decision boundary plot saved.")
المخرجات: (قم بتشغيل المثال لرؤية المخرجات الفعلية، أو راجع ملاحظة المخرجات المتوقعة في تعليقات الكود أعلاه.)
▶ مثال: شامل—تدفق عمل التعلم الآلي الكامل باستخدام KNN على مجموعة بيانات آيريس (الصعوبة: ⭐⭐⭐)
# ============================================
# Complete ML Workflow: KNN on Iris Dataset
# Step 1-6: Full pipeline with evaluation
# ============================================
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import (accuracy_score, classification_report,
confusion_matrix)
# Step 1: Load data
iris = load_iris()
X, y = iris.data, iris.target
print(f"Step 1 - Data loaded: {X.shape[0]} samples, {X.shape[1]} features")
print(f" Classes: {list(iris.target_names)}")
print(f" Class distribution: {np.bincount(y)}")
# Step 2: Split data (70% train, 30% test)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
print(f"\nStep 2 - Data split: Train={len(X_train)}, Test={len(X_test)}")
# Step 3: Feature scaling (important for KNN!)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print(f"\nStep 3 - Features scaled (mean≈0, std≈1)")
print(f" Before scaling - mean: {X_train.mean(axis=0).round(2)}")
print(f" After scaling - mean: {X_train_scaled.mean(axis=0).round(2)}")
# Step 4: Train model
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train_scaled, y_train)
print(f"\nStep 4 - Model trained: KNN (k=5)")
# Step 5: Evaluate
y_pred = knn.predict(X_test_scaled)
test_acc = accuracy_score(y_test, y_pred)
print(f"\nStep 5 - Evaluation:")
print(f" Test accuracy: {test_acc:.3f}")
print(f"\n{classification_report(y_test, y_pred, target_names=iris.target_names)}")
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
# Step 6: Predict new samples
new_data = np.array([
[5.1, 3.5, 1.4, 0.2], # Likely setosa
[6.7, 3.0, 5.2, 2.3], # Likely virginica
[5.9, 3.0, 4.2, 1.5], # Likely versicolor
])
new_data_scaled = scaler.transform(new_data)
predictions = knn.predict(new_data_scaled)
print("\nStep 6 - New predictions:")
for i, pred in enumerate(predictions):
print(f" Sample {i+1} → {iris.target_names[pred]}")
Step 1 - Data loaded: 150 samples, 4 features
Classes: ['setosa', 'versicolor', 'virginica']
Class distribution: [50 50 50]
Step 2 - Data split: Train=105, Test=45
Step 3 - Features scaled (mean≈0, std≈1)
Before scaling - mean: [5.86 3.06 3.78 1.2 ]
After scaling - mean: [ 0. -0. 0. -0.]
Step 4 - Model trained: KNN (k=5)
Step 5 - Evaluation:
Test accuracy: 1.000
precision recall f1-score support
setosa 1.00 1.00 1.00 15
versicolor 1.00 1.00 1.00 15
virginica 1.00 1.00 1.00 15
accuracy 1.00 45
macro avg 1.00 1.00 1.00 45
weighted avg 1.00 1.00 1.00 45
Confusion Matrix:
[[15 0 0]
[ 0 15 0]
[ 0 0 15]]
Step 6 - New predictions:
Sample 1 → setosa
Sample 2 → virginica
Sample 3 → versicolor
StandardScaler يقوم بقياس جميع الميزات بحيث يكون متوسطها 0 وانحرافها المعياري 1 لضمان أن كل ميزة تساهم بشكل متساوٍ.
❓ أسئلة شائعة
pip install scikit-learn.📖 ملخص
- جوهر التعلم الآلي هو "السماح للخوارزميات بتعلم القواعد من البيانات، بدلاً من أن يكتبها البشر" — وهو تحول من النهج القائم على القواعد إلى النهج القائم على البيانات
- ثلاثة نماذج رئيسية: التعلم الخاضع للإشراف (بيانات مُعلَّمة، التنبؤ)، والتعلم غير الخاضع للإشراف (بيانات غير مُعلَّمة، اكتشاف الأنماط)، والتعلم المعزز (المحاولة والخطأ + المكافآت)
- أنواع المهام: التصنيف (تسميات منفصلة)، الانحدار (قيم مستمرة)، التجميع (تجميع تلقائي) — يعتمد الاختيار على المشكلة والبيانات
- خطوات سير عمل التعلم الآلي الست — تحديد المشكلة ← جمع البيانات ← هندسة الميزات ← التدريب ← التقييم ← النشر — تشكل عملية تكرارية.
- نمذجة واجهة برمجة التطبيقات الموحدة لـ sklearn:
fit()للتدريب ←predict()للتنبؤ ←score()للتقييم؛ عند تغيير الخوارزميات، يلزم فقط تعديل أسماء الفئات - KNN هو المصنف الأكثر سهولة في الفهم: فئة العينة الجديدة = الفئة الأكثر تكراراً بين جيرانها الأقرب الـ k
📝 تمارين
- المشكلة الأساسية (الصعوبة ⭐): استخدم sklearn لتدريب
KNeighborsClassifier(k=5) على مجموعة بيانات Wine (load_wine())، واطبع دقة التدريب والاختبار. مجموعة بيانات Wine تحتوي على 13 سمة و3 فئات. - المشكلة المتقدمة (الصعوبة ⭐⭐): قارن بين دقة KNN وأشجار القرار (
DecisionTreeClassifier) على مجموعة بيانات Wine. جرب قيمًا مختلفة لـ k (1، 3، 5، 7، 9) وأعماق مختلفة للأشجار (2، 3، 5، None) لإيجاد المعلمات المثلى لكل خوارزمية. - السؤال التحدي (الصعوبة ⭐⭐⭐): ارسم منحنى الدقة لقيم مختلفة لـ k—مع k (1-30) على المحور x ودقة الاختبار على المحور y—وتحلل النقطة الأعلى. تلميح: استخدم
matplotlib.pyplot.plot()، ولاحظ اتجاه المنحنى، واشرح لماذا يكون k كبيرًا جدًا أو صغيرًا جدًا غير مرغوب فيه.