الذكاء الاصطناعي

مقدمة عملية في تعلم الآلة باستخدام Python: من المفاهيم الأساسية إلى بناء أول نموذج ذكاء اصطناعي

3 min de lecture

تعلم الآلة (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 »

للمزيد

مقالات ذات صلة

Service ITSkillsCenter

Application mobile Android et iOS

Création d'application mobile Android et iOS. À partir de 350 000 FCFA.

Démarrer mon projet
Publicité