تعلم الآلة (Machine Learning) في 2026 لم يعد حصرياً على باحثي MIT. مكتبات Python مثل scikit-learn جعلت بناء نموذج تنبؤي ممكناً في 30 سطراً من الكود. هذا الدرس يقدم مقدمة عملية: من تثبيت المكتبات إلى بناء أول نموذج تصنيف وتقييمه. الهدف ليس الإلمام النظري الكامل، بل القدرة على تطبيق ML على بيانات حقيقية.
المتطلبات
- Python 3.10+ (3.13 موصى)
- أساسيات Python (متغيرات، حلقات، وظائف)
- رياضيات أساسية (لا حاجة لـ calculus متقدم)
- الوقت المقدر: 4 ساعات
الخطوة 1 — تثبيت البيئة
scikit-learn هو أساس ML في Python. نضيف pandas (للبيانات) و matplotlib (للرسوم) و jupyter (للتجربة التفاعلية).
python -m venv .venv
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows
pip install scikit-learn pandas numpy matplotlib jupyter
jupyter notebook # يفتح المتصفح على notebook
Jupyter Notebook هو البيئة المثالية للتعلم: تكتب كود، تشغّله، ترى النتيجة فوراً، تعدّل وتعيد. المحترفون ينتقلون لاحقاً إلى VS Code مع جoupyter extension. للبدء، Notebook في المتصفح أبسط بكثير.
الخطوة 2 — أول dataset
scikit-learn يأتي مع datasets جاهزة للتعلم. الأشهر: Iris (تصنيف زهور)، Boston Housing (تنبؤ بأسعار). نبدأ بـ Iris لبساطته.
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df["species"] = [iris.target_names[i] for i in iris.target]
print(df.head())
print(df.describe())
# sepal length (cm) ... species
# 0 5.1 ... setosa
# 1 4.9 ... setosa
# ...
print(df["species"].value_counts())
# setosa 50
# versicolor 50
# virginica 50
الـ dataset يحتوي 150 زهرة من 3 أنواع، 4 خصائص لكل واحدة (طول وعرض السبلة والتويج). الهدف: بناء نموذج يتنبأ بنوع الزهرة من خصائصها. هذه مشكلة « تصنيف » (classification) كلاسيكية، الأفضل لتعلم المفاهيم الأساسية.
الخطوة 3 — تقسيم Train / Test
قاعدة ذهبية في ML: لا تختبر على نفس البيانات التي درّبت بها. تقسيم 80/20 (80% تدريب، 20% اختبار) هو المعيار.
from sklearn.model_selection import train_test_split
X = iris.data # المتغيرات (4 خصائص)
y = iris.target # الهدف (نوع الزهرة 0/1/2)
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2, # 20% للاختبار
random_state=42, # لإعادة إنتاج النتائج
stratify=y # حفظ توزيع الأنواع
)
print(f"تدريب: {X_train.shape}, اختبار: {X_test.shape}")
# تدريب: (120, 4), اختبار: (30, 4)
random_state=42 يضمن نفس التقسيم كل مرة — مهم للتجارب القابلة للتكرار. stratify=y يضمن أن كل نوع زهرة موجود بنفس النسبة في التدريب والاختبار. بدون stratify، قد يكون لديك 30 زهرة اختبار كلها من نوع واحد بالصدفة، مما يفسد التقييم.
الخطوة 4 — أول نموذج: Decision Tree
Decision Tree هو نموذج سهل الفهم: يبني سلسلة شروط (if/else) لاتخاذ قرار. مناسب جداً لبدء فهم ML.
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train)
# تنبؤ على بيانات الاختبار
y_pred = model.predict(X_test)
# أول 5 تنبؤات
print("تنبؤات :", y_pred[:5])
print("الحقيقة:", y_test[:5])
max_depth=3 يحدد أقصى عمق للشجرة. أعمق = نموذج أكثر تعقيداً، يحفظ التدريب لكن يفشل على بيانات جديدة (overfitting). أقل = نموذج أبسط، قد يفوّت أنماطاً (underfitting). 3-5 يبقى نقطة بداية جيدة. لرؤية الشجرة بصرياً: from sklearn.tree import plot_tree; plot_tree(model).
الخطوة 5 — تقييم الأداء
المقاييس الأساسية للتصنيف: Accuracy (نسبة التنبؤات الصحيحة)، Precision (دقة)، Recall (شمولية). كل واحد يحكي قصة مختلفة.
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
acc = accuracy_score(y_test, y_pred)
print(f"Accuracy: {acc:.2%}") # 96.67%
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# precision recall f1-score support
# setosa 1.00 1.00 1.00 10
# versicolor 1.00 0.90 0.95 10
# virginica 0.91 1.00 0.95 10
النتيجة 96.67% accuracy على Iris ممتازة (الـ dataset سهل). على بيانات حقيقية، 80-85% ممتاز، 90%+ مشبوه (قد يكون overfitting أو data leakage). Precision = من بين التي قال عنها « نوع X »، كم كانت فعلاً X. Recall = من بين كل الـ X الحقيقية، كم اكتشف. F1-score هو وسط هاراميني بين الاثنين.
الخطوة 6 — Cross-Validation
تقسيم واحد 80/20 قد يكون محظوظاً أو غير محظوظ. Cross-validation يقسم البيانات k مرات (عادة 5)، يدرّب ويختبر على كل تقسيم، يعطي متوسط الأداء + الانحراف المعياري.
from sklearn.model_selection import cross_val_score
import numpy as np
scores = cross_val_score(model, X, y, cv=5, scoring="accuracy")
print(f"Accuracy: {scores.mean():.2%} ± {scores.std():.2%}")
# Accuracy: 95.33% ± 3.27%
# يعني المتوسط 95.33%، وانحراف 3.27% من تقسيم لآخر
الانحراف المنخفض (< 5%) يدل على نموذج مستقر. الانحراف العالي (> 10%) يعني أن النموذج حساس جداً للتقسيم — علامة overfitting أو dataset صغير. القاعدة: استخدم cross-validation للقرارات المهمة (اختيار نموذج)، استخدم تقسيم بسيط للتجربة السريعة.
الخطوة 7 — مقارنة عدة نماذج
نادراً ما يكون أول نموذج هو الأفضل. جرّب 3-5 خوارزميات، اختر الأفضل بناءً على cross-validation.
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
models = {
"Logistic Regression": LogisticRegression(max_iter=200),
"Decision Tree": DecisionTreeClassifier(max_depth=3),
"Random Forest": RandomForestClassifier(n_estimators=100),
"SVM": SVC(),
"KNN": KNeighborsClassifier(n_neighbors=5),
}
for name, m in models.items():
scores = cross_val_score(m, X, y, cv=5)
print(f"{name:20s}: {scores.mean():.2%} ± {scores.std():.2%}")
# Logistic Regression : 96.67% ± 2.49%
# Random Forest : 96.00% ± 2.49%
# SVM : 96.67% ± 2.49%
# Decision Tree : 95.33% ± 3.27%
# KNN : 96.67% ± 2.49%
على Iris، معظم النماذج متشابهة لأن المشكلة سهلة. على بيانات حقيقية معقدة، الفرق بين أبسط نموذج (Logistic) وأقوى نموذج (Random Forest، XGBoost) قد يصل إلى 10-20%. ابدأ بالأبسط، اصعد للأعقد إذا لزم الأمر.
الخطوة 8 — استخدام النموذج في الإنتاج
بعد التدريب والتقييم، احفظ النموذج لاستخدامه في تطبيقك. joblib هو الطريقة الموصى بها.
import joblib
# حفظ
joblib.dump(model, "iris_model.joblib")
# تحميل في تطبيق آخر (Flask، FastAPI...)
model = joblib.load("iris_model.joblib")
# تنبؤ
new_flower = [[5.1, 3.5, 1.4, 0.2]]
prediction = model.predict(new_flower)
print(iris.target_names[prediction[0]]) # setosa
لـ API بسيط، FastAPI + joblib كافٍ. للإنتاج الجاد، أدوات MLOps مثل MLflow (تتبع التجارب)، DVC (versioning للنماذج)، BentoML (deployment) ضرورية. لكن لا تستعجل — ابدأ بـ joblib + FastAPI، ارفع التعقيد فقط حين تحتاج فعلاً.
أخطاء شائعة
| المشكلة | السبب | الحل |
|---|---|---|
| Accuracy 100% على التدريب | overfitting | قلّل max_depth، أضف regularization |
| Accuracy منخفض على الاختبار | underfitting أو features ضعيفة | نموذج أقوى، feature engineering |
| تقييم على بيانات التدريب | ُلم تستخدم train_test_split | استخدم cross-validation |
| features بمقاييس مختلفة | عمر/راتب/طول | StandardScaler قبل التدريب |
| data leakage | معلومة من المستقبل في التدريب | افحص كل feature: هل متاحة وقت التنبؤ؟ |
| imbalanced dataset | 99% فئة واحدة | SMOTE، class_weight= »balanced » |
للمزيد
- scikit-learn docs scikit-learn.org
- Hands-On ML (كتاب Aurélien Géron) oreilly.com
- Kaggle Learn (دورات مجانية) kaggle.com/learn
- Fast.ai fast.ai
- Coursera ML (Andrew Ng) coursera.org