AI: الخوارزميات والنماذج
آخر تحديث: 2026-08-26
الخوارزميات هي الأساليب التي تتعلم بها الذكاء الاصطناعي، والنماذج هي نتائج ذلك التعلم. ستساعدك هذه الفصل على فهم عمليات التدريب والاستدلال، ودوال الخسائر والمُحسِّنات، والزيادة في التخصيص (overfitting) والنقص في التخصيص (underfitting)، وسيرشدك خلال بناء نموذج التعلم الآلي الأول الخاص بك باستخدام مكتبة sklearn.
1. ما ستتعلمه
- الفرق بين الخوارزميات والنماذج
- التدريب مقابل الاستدلال
- معنى دالة الخسارة
- المواءمة الزائدة والمواءمة الناقصة
- مقاييس تقييم النموذج (الدقة / الدقة الاسترجاعية / الاستدعاء)
2. قصة حقيقية عن المبالغة في التدريب (Overfitting)
(1) نقطة الألم: 99% في التدريب، 65% في الاختبار
درّبت أليس نموذجاً للتنبؤ بأسعار المنازل باستخدام sklearn. وصلت قيمة R² لمجموعة التدريب إلى 0.99، لكنها كانت 0.65 فقط لمجموعة الاختبار. ظنّت أنها وجدت النموذج المثالي — إلى أن قامت بالتنبؤات على بيانات العالم الحقيقي، والتي كشفت عن تناقض كبير.
(2) تشخيص المبالغة في التدريب (Overfitting)
شرح تشارلي: "لقد 'حفظ' نموذجك بيانات التدريب. هذا ليس تعلماً — إنه مبالغة في التدريب (Overfitting). إنه كطالب يحفظ الإجابات لكنه لا يعرف كيفية حل المشاكل — لن يتمكن من التعامل مع مشكلة جديدة."
▶ مثال: توضيح المبالغة في التدريب باستخدام عمق شجرة القرار (الصعوبة: ⭐⭐)
# Demonstrate overfitting with decision tree depth
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
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)
# Overfitted model: very deep tree
deep_tree = DecisionTreeClassifier(max_depth=None, random_state=42)
deep_tree.fit(X_train, y_train)
# Regularized model: shallow tree
shallow_tree = DecisionTreeClassifier(max_depth=3, random_state=42)
shallow_tree.fit(X_train, y_train)
print("=== Overfitting Demo ===")
print(f"Deep tree (no limit): Train={deep_tree.score(X_train, y_train):.3f} Test={deep_tree.score(X_test, y_test):.3f}")
print(f"Shallow tree (depth=3): Train={shallow_tree.score(X_train, y_train):.3f} Test={shallow_tree.score(X_test, y_test):.3f}")
=== Overfitting Demo ===
Deep tree (no limit): Train=1.000 Test=1.000
Shallow tree (depth=3): Train=1.000 Test=1.000
(3) الفوائد: فهم قدرة التعميم (Generalization)
تعلمت أليس مبدأً أساسياً: قيمة النموذج لا تكمن في أدائه على مجموعة التدريب، بل في أدائه على مجموعة الاختبار — هذا ما يُعرف بـ "قدرة التعميم" (Generalization Ability).
3. الخوارزميات مقابل النماذج مقابل البرامج
هذه المفاهيم الثلاثة يسهل الخلط بينها ويجب التمييز بينها بوضوح:
| المفهوم | التعريف | التشبيه | دورة الحياة |
|---|---|---|---|
| الخوارزمية | طريقة رياضية للتعلم | وصفة طبخ (طريقة للطهي) | تبقى ثابتة؛ لا تتغير مع البيانات |
| النموذج | نتيجة تدريب خوارزمية على بيانات | طبق تم تحضيره وفقًا لوصفة | يمكن إعادة تدريبه مع تغير البيانات |
| البرنامج | تسلسل ثابت من التعليمات | خط تجميع مصنّع | تعديل الكود يدويًا |
▶ مثال: العملية من خوارزمية + بيانات ← نموذج (الصعوبة: ⭐)
Algorithm + Data → Training → Model
Example:
Linear Regression Algorithm + House Price Data → Training → Price Prediction Model
(model contains learned weights: price = 2500 * area + 15000 * rooms - 5000)
4. التدريب والاستدلال
(1) التدريب
التدريب هو العملية التي يتعلم من خلالها النموذج المعلمات من البيانات:
graph TB
A[بيانات التدريب<br/>X: السمات، y: العلامات] --> B[الخوارزمية<br/>مثال: الانحدار الخطي]
B --> C[المواجهة الأمامية<br/>إجراء التنبؤ]
C --> D[حساب الخسارة<br/>ما مدى خطأ التنبؤ؟]
D --> E[المواجهة الخلفية<br/>حساب التدرجات]
E --> F[تحديث الأوزان<br/>تعديل المعلمات]
F --> C
G{هل الخسارة منخفضة بما يكفي؟} -->|لا| C
G -->|نعم| H[النموذج المدرب]
(2) الاستدلال
يتعلق الاستدلال باستخدام نموذج مدرب لإجراء تنبؤات على بيانات جديدة:
# التدريب: يتعلم النموذج من البيانات
# model.fit(X_train, y_train)
# الاستدلال: يتنبأ النموذج على بيانات جديدة
# predictions = model.predict(X_new)
| البُعد | التدريب | الاستدلال |
|---|---|---|
| الغرض | تدريب المعلمات | استخدام المعلمات للتنبؤات |
| المُدخل | السمات + العلامات | السمات فقط |
| المُخرج | النموذج المدرب | نتائج التنبؤ |
| التعقيد الحسابي | مرتفع (تكرارات متعددة) | منخفض (مرة أمامية واحدة) |
| التكرار | من حين لآخر (أثناء إعادة التدريب) | بشكل متكرر (مع كل طلب) |
| التشبيه | طلاب يدرسون للامتحانات | طلاب يؤدون الامتحانات |
5. دوال الخسارة والمُحسِّنات
(1) دالة الخسارة - قياس "مدى خطأك"
تقيس دالة الخسارة التباين بين تنبؤات القيم الفعلية للنموذج ؛ كلما كانت الخسارة أقل، كان ذلك أفضل:
| دالة الخسارة | الحدس خلف الصيغة | المهام المناسبة |
|---|---|---|
| MSE (متوسط مربع الخطأ) | متوسط مربعات الفروق بين القيم المتوقعة والقيم الفعلية | الانحدار |
| MAE (متوسط القيمة المطلقة للخطأ) | متوسط القيم المطلقة للفروق بين القيم المتوقعة والقيم الفعلية | الانحدار |
| الإنتروبيا المتقاطعة | الفرق بين توزيع الاحتمال المتوقع والتوزيع الحقيقي | التصنيف |
▶ مثال: حساب يدوي لدوال خسارة MSE و MAE و RMSE (الصعوبة: ⭐⭐)
# Calculate different loss functions manually
import numpy as np
y_true = np.array([200000, 300000, 250000]) # Actual prices
y_pred = np.array([210000, 280000, 260000]) # Predicted prices
# Mean Squared Error
mse = np.mean((y_true - y_pred) ** 2)
print(f"MSE: {mse:,.0f}")
# Mean Absolute Error
mae = np.mean(np.abs(y_true - y_pred))
print(f"MAE: {mae:,.0f}")
# Root Mean Squared Error (easier to interpret — same unit as y)
rmse = np.sqrt(mse)
print(f"RMSE: {rmse:,.0f}")
MSE: 200,000,000
MAE: 10,000
RMSE: 14,142
(2) المُحسِّن - يحدد "كيفية الضبط"
يُحدّث المُحسِّن معلمات النموذج بناءً على الانحدار (الاتجاه) لدالة الخسارة:
| المُحسِّن | الميزات | حالات الاستخدام |
|---|---|---|
| SGD | الطريقة الأساسية ؛ تخطو خطوة واحدة في اتجاه الانحدار | المهام البسيطة، العروض التوضيحية التعليمية |
| SGD + الزخم | يُضيف الزخم، ويُقلل من التذبذب | المهام المتوسطة |
| Adam | معدل تعلم تكيّفي، الأكثر استخدامًا | معظم مهام التعلم العميق |
| AdamW | Adam + انحلال الوزن لمنع الإفراط في التوافق | تدريب نماذج المحول |
6. الملاءمة الزائدة والملاءمة الناقصة
| الحالة | أداء مجموعة التدريب | أداء مجموعة الاختبار | المقارنة | السبب |
|---|---|---|---|---|
| الملاءمة الناقصة | ضعيف | ضعيف | الطلاب لم يتعلموا جيدًا؛ لا يعرفون شيئًا | النموذج بسيط جدًا / التدريب غير كافٍ |
| الملاءمة الطبيعية | جيد | جيد | الطلاب أتقنوا المفهوم ويمكنهم تطبيقه على مواقف مشابهة | للنموذج مستوى مناسب من التعقيد |
| الملاءمة الزائدة | ممتاز | ضعيف | الطلاب حفظوا الإجابات لكنهم لا يستطيعون حل المسائل | النموذج معقد جدًا / البيانات قليلة جدًا |
(1) الأسباب الشائعة للملاءمة الزائدة والحلول المضادة
| السبب | الحل |
|---|---|
| النموذج معقد جدًا (عدد كبير جدًا من المعلمات) | تقليل عدد الطبقات/العُقد، تطبيق التنظيم (L1/L2) |
| بيانات التدريب غير كافية | جمع المزيد من البيانات، زيادة البيانات |
| عدد كبير جدًا من تكرارات التدريب | الإيقاف المبكر |
| عدد كبير جدًا من الميزات | اختيار الميزات، تقليل الأبعاد |
(2) المفاضلة بين التحيُّز والتباين
الملاءمة الناقصة ←─────────────────────→ الملاءمة الزائدة
تحيُّز عالٍ توازن جيد تباين عالٍ
(نموذج بسيط) (التعقيد المناسب) (نموذج معقد)
الهدف: إيجاد النقطة المثلى بين التحيُّز والتباين
7. مقياسات تقييم النموذج
(1) مؤشرات التقييم المصنفة
▶ مثال: حساب مقيمات تقييم التصنيف — الدقة، الاستدعاء، الدقة (Precision)، و F1 (الصعوبة: ⭐⭐)
# Classification metrics demo
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
y_pred = [1, 0, 1, 0, 0, 1, 1, 0, 1, 0]
acc = accuracy_score(y_true, y_pred)
prec = precision_score(y_true, y_pred)
rec = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print("=== Classification Metrics ===")
print(f"Accuracy: {acc:.3f} — Overall correctness")
print(f"Precision: {prec:.3f} — Of predicted positives, how many correct?")
print(f"Recall: {rec:.3f} — Of actual positives, how many found?")
print(f"F1 Score: {f1:.3f} — Harmonic mean of precision & recall")
=== Classification Metrics ===
Accuracy: 0.800 — Overall correctness
Precision: 0.800 — Of predicted positives, how many correct?
Recall: 0.800 — Of actual positives, how many found?
F1 Score: 0.800 — Harmonic mean of precision & recall
| المقياس | المعنى البديهي للصيغة | متى يكون مهماً |
|---|---|---|
| الدقة (Accuracy) | التنبؤات الصحيحة / إجمالي التنبؤات | عندما تكون الفئات متوازنة |
| الدقة (Precision) | الإيجابيات الحقيقية / (الإيجابيات الحقيقية + الإيجابيات الكاذبة) | تكلفة عالية للإيجابيات الكاذبة (مثلًا، تصفية البريد المزعج) |
| الاستدعاء (Recall) | الإيجابيات الحقيقية / (الإيجابيات الحقيقية + السلبيات الكاذبة) | تكلفة عالية للسلبيات الكاذبة (مثلًا، فحص السرطان) |
| F1 | الوسط التوافقي بين الدقة (Precision) والاستدعاء | يتطلب توازناً بين الدقة والاستدعاء |
▶ مثال: تصور المفاضلة بين التحيز والتباين (الصعوبة: ⭐)
(2) مقيمات تقييم الانحدار
| المقياس | المعنى | نطاق القيمة | جيد/سيئ |
|---|---|---|---|
| MAE | الخطأ المطلق المتوسط | [0, +∞) | كلما قل، كان أفضل |
| MSE | متوسط مربع الخطأ | [0, +∞) | كلما قل، كان أفضل |
| RMSE | جذر متوسط مربع الخطأ (بنفس وحدات y) | [0, +∞) | كلما قل، كان أفضل |
| R² | معامل التحديد (نسبة التباين المفسر) | (-∞, 1] | كلما اقترب من 1، كان أفضل |
8. مثال كامل: العملية الكاملة لبناء نموذج التعلم الآلي الأول الخاص بك
قم بتدريب مصنف شجرة القرار على مجموعة بيانات Iris باستخدام sklearn للحصول على تجربة كاملة في "تدريب نموذج الذكاء الاصطناعي وتقييمه":
▶ مثال: نموذج التعلم الآلي الأول من البداية إلى النهاية—Iris تصنيف شجرة القرار (الصعوبة: ⭐⭐⭐)
# ============================================
# First ML Model: Complete Workflow
# Dataset: Iris (flower classification)
# Algorithm: Decision Tree
# ============================================
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix
import numpy as np
# Step 1: Load data
iris = load_iris()
X, y = iris.data, iris.target
print(f"Dataset: {X.shape[0]} samples, {X.shape[1]} features")
print(f"Features: {iris.feature_names}")
print(f"Classes: {list(iris.target_names)}")
# Step 2: Split data
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
print(f"\nTrain: {len(X_train)} samples | Test: {len(X_test)} samples")
# Step 3: Train model
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train)
print(f"\nModel trained: Decision Tree (max_depth=3)")
# Step 4: Predict
y_pred = model.predict(X_test)
# Step 5: Evaluate
train_acc = model.score(X_train, y_train)
test_acc = model.score(X_test, y_test)
print(f"\nTraining accuracy: {train_acc:.3f}")
print(f"Test accuracy: {test_acc:.3f}")
print("\n=== Classification Report ===")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
print("=== Confusion Matrix ===")
print(confusion_matrix(y_test, y_pred))
# Step 6: Predict on new data
new_sample = np.array([[5.1, 3.5, 1.4, 0.2]]) # A likely setosa
prediction = model.predict(new_sample)
print(f"\nNew sample prediction: {iris.target_names[prediction[0]]}")
Dataset: 150 samples, 4 features
Features: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
Classes: ['setosa', 'versicolor', 'virginica']
Train: 105 samples | Test: 45 samples
Model trained: Decision Tree (max_depth=3)
Training accuracy: 1.000
Test accuracy: 1.000
=== Classification Report ===
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]]
New sample prediction: setosa
❓ أسئلة شائعة
📖 ملخص
- الخوارزمية هي طريقة التعلم (وصفة)، والنموذج هو نتيجة ذلك التعلم (الطبق الجاهز)، والبرنامج هو مجموعة من التعليمات الثابتة (خط إنتاج).
- التدريب = تعلم المعلمات من البيانات؛ الاستدلال = إجراء تنبؤات باستخدام تلك المعلمات؛ يختلف الاثنان بشكل كبير في الغرض والتعقيد الحسابي.
- دالة الخسارة تقيس "مدى انحراف النموذج"، بينما يحدد المُحسِّن "كيفية ضبط المعلمات"؛ معًا، يقودان عملية التدريب.
- التجهيل = حفظ الإجابات دون معرفة كيفية حل المشاكل؛ نقص التجهيل = عدم تعلُّم أي شيء وعدم القدرة على فعل أي شيء؛ الهدف هو إيجاد نقطة "التعميم" بينهما.
- لمهام التصنيف، استخدم في التقييم الدقة (Accuracy)، وال精确 (Precision)، والاستدعاء (Recall)، و F1؛ وللمهام الانحدارية، استخدم في التقييم MAE، و MSE، و R²
- درِّب نموذجك الأول بخمسة أسطر فقط من الشفرة باستخدام sklearn:
load → split → fit → predict → score
📝 تمارين
- مشكلة أساسية (الصعوبة ⭐): استخدم مكتبة sklearn لتدريب
DecisionTreeClassifierعلى مجموعة بيانات Iris، واطبع دقة التدريب والاختبار. - مشكلة متقدمة (الصعوبة ⭐⭐): احسب Precision و Recall للنموذج (تلميح:
classification_report)، واشرح معنى كل مقياس. - تحدي (الصعوبة: ⭐⭐⭐): تسبب عمدًا في overfitting—قم بتدريب شجرة عميقة بلا حدود (
max_depth=None)، ثم قارن الاختلافات في دقة التدريب والاختبار بين الأشجار الضحلة والعميقة على مجموعة بيانات أكثر تعقيدًا (مثلload_wine).