Machine Learning: دليل عملي لعام
١٦ أبريل ٢٠٢٦
ملخص
يغطي هذا الدليل كل ما تحتاجه لبدء بناء نماذج تعلم الآلة (machine learning) باستخدام Python اعتبارًا من عام 2026. ستتعلم كيفية إعداد بيئة التطوير الخاصة بك، وإتقان معالجة البيانات مسبقًا، وتنفيذ الخوارزميات الأساسية (الانحدار الخطي، والانحدار اللوجستي، وأشجار القرار، وSVMs، والشبكات العصبية)، وتقييم النماذج باستخدام التحقق المتقاطع (cross-validation)، والعمل على دراسات حالة من العالم الحقيقي. يتضمن الدليل أمثلة برمجية قابلة للتنفيذ، ورسومًا بيانية، وقسمًا حول الاعتبارات الأخلاقية في تطوير الذكاء الاصطناعي — لأن إطلاق نموذج يعمل هو نصف المهمة فقط.
ما ستتعلمه
- كيفية إعداد بيئة Python حديثة لتعلم الآلة باستخدام scikit-learn وPyTorch وTensorFlow
- أساسيات معالجة البيانات مسبقًا: التعامل مع القيم المفقودة، وتوسيع الميزات (feature scaling)، والترميز (encoding)
- الخوارزميات الأساسية من الانحدار الخطي إلى الشبكات العصبية، مع كود قابل للتنفيذ
- تقنيات تقييم النماذج بما في ذلك التحقق المتقاطع والمقايضة بين الانحياز والتباين (bias-variance tradeoff)
- دراسات حالة من العالم الحقيقي: اكتشاف الاحتيال، وتصنيف الصور، وأنظمة التوصية
- الاعتبارات الأخلاقية: اكتشاف الانحياز، وقياس العدالة، والبناء بمسؤولية
مقدمة في تعلم الآلة
تعلم الآلة (ML) هو فرع من فروع الذكاء الاصطناعي (AI) يُمكّن الأنظمة من التعلم والتحسن تلقائيًا من الخبرة دون أن يتم برمجتها بشكل صريح. بينما يشمل الذكاء الاصطناعي المفهوم الأوسع للآلات التي تؤدي مهامًا تتطلب عادةً ذكاءً بشريًا، يركز تعلم الآلة تحديدًا على تطوير خوارزميات يمكنها التعلم من البيانات وإجراء تنبؤات أو قرارات بناءً عليها.
التعلم العميق (Deep learning)، وهو فرع متخصص من تعلم الآلة، يستخدم شبكات عصبية ذات طبقات متعددة (ومن هنا جاء وصف "عميق") لنمذجة أنماط معقدة في كميات كبيرة من البيانات. وقد قاد هذا النوع من التعلم الاختراقات الأخيرة في مجالات مثل الرؤية الحاسوبية (computer vision) ومعالجة اللغات الطبيعية (natural language processing).
أنواع تعلم الآلة
-
التعلم الخاضع للإشراف (Supervised Learning): تتعلم الخوارزمية من بيانات تدريب مصنفة، وتجري تنبؤات بناءً على أزواج المدخلات والمخرجات. تشمل المهام الشائعة:
- التصنيف (Classification) (التنبؤ بالفئات)
- الانحدار (Regression) (التنبؤ بالقيم المستمرة)
-
التعلم غير الخاضع للإشراف (Unsupervised Learning): تجد الخوارزمية أنماطًا في بيانات غير مصنفة دون توجيه صريح. تشمل التطبيقات النموذجية:
- التجميع (Clustering) (تجميع نقاط بيانات متشابهة)
- تقليل الأبعاد (Dimensionality reduction) (تبسيط البيانات مع الحفاظ على الهيكل)
-
التعلم التعزيزي (Reinforcement Learning): يتعلم الوكيل (agent) اتخاذ القرارات من خلال أداء إجراءات وتلقي مكافآت أو عقوبات. يُستخدم هذا النهج في:
- لعب الألعاب (مثل AlphaGo)
- الروبوتات
- المركبات ذاتية القيادة
سير عمل تعلم الآلة
يتبع مشروع تعلم الآلة النموذجي هذه الخطوات:
- تعريف المشكلة وجمع البيانات
- معالجة البيانات مسبقًا واستكشافها
- اختيار النموذج وتدريبه
- تقييم النموذج وتحسينه
- النشر والمراقبة
إعداد بيئتك
لنقم بإعداد بيئة Python قوية لتعلم الآلة:
الخيار 1: التثبيت المحلي باستخدام Anaconda
# Download and install Anaconda from https://www.anaconda.com/download
# Create a new environment
conda create -n ml-env python=3.12
conda activate ml-env
# Install core packages
conda install numpy pandas matplotlib scikit-learn jupyter
conda install -c conda-forge xgboost lightgbm imbalanced-learn
conda install pytorch torchvision torchaudio -c pytorch
conda install tensorflow
الخيار 2: Google Colab
يوفر Google Colab بيئة مجانية قائمة على السحابة مع دعم لوحدات معالجة الرسومات (GPU):
- انتقل إلى https://colab.research.google.com/
- أنشئ دفتر ملاحظات (notebook) جديدًا
- ثبّت الحزم المطلوبة:
!pip install numpy pandas matplotlib scikit-learn xgboost lightgbm imbalanced-learn tensorflow torch torchvision
المكتبات الأساسية
# Core data handling and visualization
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Machine learning
from sklearn import datasets, model_selection, preprocessing, metrics
import xgboost as xgb
import lightgbm as lgb
import tensorflow as tf
import torch
import torch.nn as nn
معالجة البيانات مسبقًا: أساس تعلم الآلة
تعد المعالجة المسبقة عالية الجودة للبيانات أمرًا بالغ الأهمية لنجاح تعلم الآلة. لنستكشف التقنيات الأساسية:
التعامل مع القيم المفقودة
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer, KNNImputer
# Create sample data with missing values
data = pd.DataFrame({
'age': [25, 30, np.nan, 35, 40, 45, np.nan, 50],
'income': [50000, np.nan, 75000, 80000, np.nan, 110000, 120000, 130000],
'department': ['HR', 'IT', 'IT', np.nan, 'Finance', 'Finance', 'HR', 'IT']
})
# 1. Simple imputation
# For numerical features
num_imputer = SimpleImputer(strategy='mean')
data[['age', 'income']] = num_imputer.fit_transform(data[['age', 'income']])
# For categorical features
cat_imputer = SimpleImputer(strategy='most_frequent')
data['department'] = cat_imputer.fit_transform(data[['department']]).ravel()
# 2. KNN imputation for more sophisticated handling
knn_imputer = KNNImputer(n_neighbors=2)
data_imputed = knn_imputer.fit_transform(data[['age', 'income']])
توسيع الميزات (Feature Scaling)
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# Sample data
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
# Standardization (Z-score normalization)
scaler = StandardScaler()
X_standardized = scaler.fit_transform(X)
# Min-Max scaling
minmax_scaler = MinMaxScaler()
X_minmax = minmax_scaler.fit_transform(X)
# Robust scaling (less sensitive to outliers)
robust_scaler = RobustScaler()
X_robust = robust_scaler.fit_transform(X)
ترميز المتغيرات الفئوية
from sklearn.preprocessing import OneHotEncoder, LabelEncoder, OrdinalEncoder
# Sample data
categories = ['red', 'blue', 'green', 'red', 'blue']
# One-hot encoding
onehot_encoder = OneHotEncoder(sparse_output=False)
onehot_encoded = onehot_encoder.fit_transform(np.array(categories).reshape(-1, 1))
# Label encoding
label_encoder = LabelEncoder()
label_encoded = label_encoder.fit_transform(categories)
# Ordinal encoding for ordered categories
size_categories = ['S', 'M', 'L', 'XL', 'XXL']
ordinal_encoder = OrdinalEncoder(categories=[['S', 'M', 'L', 'XL', 'XXL']])
ordinal_encoded = ordinal_encoder.fit_transform(np.array(size_categories).reshape(-1, 1))
تقسيم البيانات
from sklearn.model_selection import train_test_split
# Load sample dataset
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
# Basic train-test split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# For time-series data, use TimeSeriesSplit
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
خوارزميات تعلم الآلة الأساسية
الانحدار الخطي (Linear Regression)
يصيغ الانحدار الخطي العلاقة بين متغير تابع ومتغير مستقل واحد أو أكثر باستخدام معادلة خطية.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Generate sample data
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# Create and train the model
lin_reg = LinearRegression()
lin_reg.fit(X, y)
# Make predictions
X_new = np.array([[0], [2]])
y_pred = lin_reg.predict(X_new)
# Plot the results
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.5, label='Data')
plt.plot(X_new, y_pred, 'r-', linewidth=2, label='Linear Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Linear Regression Example')
plt.legend()
plt.grid(True)
plt.show()
# Model evaluation
y_pred_all = lin_reg.predict(X)
mse = mean_squared_error(y, y_pred_all)
r2 = r2_score(y, y_pred_all)
print(f"Mean Squared Error: {mse:.2f}")
print(f"R² Score: {r2:.2f}")
print(f"Intercept: {lin_reg.intercept_[0]:.2f}")
print(f"Coefficient: {lin_reg.coef_[0][0]:.2f}")
الانحدار اللوجستي (Logistic Regression)
يُستخدم الانحدار اللوجستي لمشاكل التصنيف الثنائي، حيث يصيغ احتمالية انتماء مثيل معين إلى فئة معينة.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.metrics import confusion_matrix, classification_report, roc_curve, auc
# Generate sample data
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0,
n_informative=2, random_state=42, n_clusters_per_class=1)
# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Create and train the model
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
# Make predictions
y_pred = log_reg.predict(X_test)
y_pred_proba = log_reg.predict_proba(X_test)[:, 1]
# Plot decision boundary
def plot_decision_boundary(X, y, model):
h = 0.02 # Step size in the mesh
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:0], X[:1], c=y, alpha=0.8)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression Decision Boundary')
plt.figure(figsize=(10, 6))
plot_decision_boundary(X_test, y_test, log_reg)
plt.show()
# Model evaluation
print("Classification Report:")
print(classification_report(y_test, y_pred))
# ROC Curve
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()
أشجار القرار والغابات العشوائية
أشجار القرار (Decision trees) هي خوارزميات متعددة الاستخدامات يمكنها أداء مهام التصنيف والانحدار. تجمع الغابات العشوائية (Random forests) بين أشجار قرار متعددة لتحسين الأداء وتقليل فرط التخصيص (overfitting).
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
# Load dataset
iris = load_iris()
X, y = iris.data, iris.target
feature_names = iris.feature_names
class_names = iris.target_names
# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Decision Tree
dt_clf = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_clf.fit(X_train, y_train)
# Visualize the decision tree
plt.figure(figsize=(2010))
plot_tree(dt_clf, feature_names=feature_names, class_names=class_names,
filled=True, rounded=True, fontsize=10)
plt.title("Decision Tree Visualization")
plt.show()
# Random Forest
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_clf.fit(X_train, y_train)
# Feature importance
importances = rf_clf.feature_importances_
indices = np.argsort(importances)[::-1]
plt.figure(figsize=(106))
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), [feature_names[i] for i in indices])
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Model evaluation
dt_pred = dt_clf.predict(X_test)
rf_pred = rf_clf.predict(X_test)
print("Decision Tree Accuracy:", accuracy_score(y_test))
print("Random Forest Accuracy:", accuracy_score(y_test))
# Compare performance with different number of trees
n_estimators = [151050100200500]
train_scores = []
test_scores = []
for n in n_estimators:
rf = RandomForestClassifier(n_estimators=n=42)
rf.fit(X_train)
train_scores.append(rf.score(X_train))
test_scores.append(rf.score(X_test))
plt.figure(figsize=(106))
plt.plot(n_estimators label='Train Score')
plt.plot(n_estimators label='Test Score')
plt.xlabel(يمكن لنماذج تعلم الآلة (Machine learning) أن تكرس أو حتى تضخم التحيزات الموجودة في بيانات التدريب. تشمل المصادر الشائعة للتحيز ما يلي:
- تحيز العينات (Sampling Bias): عندما لا تمثل بيانات التدريب المجتمع المستهدف بشكل صحيح.
- تحيز القياس (Measurement Bias): عندما تؤدي طريقة جمع البيانات إلى أخطاء منهجية.
- التحيز التاريخي (Historical Bias): عندما تنعكس عدم المساواة التاريخية في البيانات.
# Example: Detecting bias in a dataset
import pandas as pd
import matplotlib.pyplot as plt
# Simulate a biased hiring dataset
np.random.seed(42)
n_samples = 1000
# Generate synthetic data with bias
data = pd.DataFrame({
'age': np.random.normal(35, 10, n_samples).astype(int),
'gender': np.random.choice(['M', 'F'], n_samples, p=[0.7, 0.3]),
'experience': np.random.normal(10, 5, n_samples).clip(0, 30),
'education': np.random.choice(['High School', 'Bachelor', 'Master', 'PhD'],
n_samples, p=[0.2, 0.5, 0.2, 0.1]),
'hired': np.zeros(n_samples)
})
# Introduce bias in hiring decisions
for i in range(n_samples):
hire_prob = 0.3 # Base probability
if data.loc[i, 'gender'] == 'F':
hire_prob *= 0.7 # Gender bias
if data.loc[i, 'age'] > 40:
hire_prob *= 0.6 # Age bias
if data.loc[i, 'education'] in ['Master', 'PhD']:
hire_prob *= 1.3 # Education bias
data.loc[i, 'hired'] = np.random.binomial(1, hire_prob)
# Analyze bias
print("Hiring Rates by Gender:")
print(data.groupby('gender')['hired'].mean())
print("\nHiring Rates by Age Group:")
data['age_group'] = pd.cut(data['age'], bins=[0, 30, 40, 50, 100])
print(data.groupby('age_group')['hired'].mean())
# Visualize bias
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
data.groupby('gender')['hired'].mean().plot(kind='bar')
plt.title('Hiring Rate by Gender')
plt.ylabel('Hiring Rate')
plt.subplot(1, 2, 2)
data.groupby('education')['hired'].mean().sort_values().plot(kind='bar')
plt.title('Hiring Rate by Education Level')
plt.xticks(rotation=45)
})
plt.tight_layout()
plt.show()
العدالة والمساءلة
يتطلب ضمان العدالة في نماذج تعلم الآلة دراسة متأنية لمقاييس العدالة المختلفة والمقايضات بينها:
- التكافؤ الديموغرافي (Demographic Parity): معدلات اختيار متساوية عبر المجموعات.
- تساوي الفرص (Equal Opportunity): معدلات إيجابية حقيقية (True positive rates) متساوية عبر المجموعات.
- الاحتمالات المتساوية (Equalized Odds): معدلات إيجابية حقيقية وسلبية خاطئة متساوية عبر المجموعات.
# Example: Evaluating model fairness
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
# Train a model on the biased data
X = data[['age', 'experience']]
y = data['hired']
# Add gender as a feature (to demonstrate bias)
X['is_female'] = (data['gender'] == 'F').astype(int)
# Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Train model
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# Make predictions
y_pred = model.predict(X_test)
# Evaluate fairness
def evaluate_fairness(y_true, y_pred, sensitive_feature, feature_name):
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
tpr = tp / (tp + fn) # True Positive Rate
fpr = fp / (fp + tn) # False Positive Rate
# Calculate metrics by group
groups = np.unique(sensitive_feature)
group_metrics = {}
for group in groups:
mask = (sensitive_feature == group)
group_tn, group_fp, group_fn, group_tp = confusion_matrix(
y_true[mask], y_pred[mask]
).ravel()
group_tpr = group_tp / (group_tp + group_fn)
group_fpr = group_fp / (group_fp + group_tn)
group_metrics[group] = {
'tpr': group_tpr,
'fpr': group_fpr,
'selection_rate': (group_tp + group_fp) / len(y_true[mask])
}
# Print fairness metrics
print(f"\nFairness Metrics for {feature_name}:")
for group, metrics in group_metrics.items():
print(f"\nGroup {group}:")
print(f" True Positive Rate: {metrics['tpr']:.3f}")
print(f" False Positive Rate: {metrics['fpr']:.3f}")
print(f" Selection Rate: {metrics['selection_rate']:.3f}")
# Calculate disparate impact ratio
selection_rates = [m['selection_rate'] for m in group_metrics.values()]
disparate_impact = min(selection_rates) / max(selection_rates)
print(f"\nDisparate Impact Ratio: {disparate_impact:.3f}")
print(f"(Values below 0.8 may indicate adverse impact)")
return group_metrics
# Evaluate fairness across gender
gender_test = X_test['is_female'].values
evaluate_fairness(y_test.values, y_pred, gender_test, "Gender")
خطوات عملية نحو تعلم آلة مسؤول
إن بناء أنظمة تعلم آلة عادلة ومسؤولة لا يقتصر فقط على المقاييس، بل يتطلب قرارات مدروسة في العمليات طوال دورة حياة المشروع:
- تدقيق بيانات التدريب قبل البدء بالنمذجة. ابحث عن عدم التوازن الديموغرافي، وجودة التصنيفات (labels)، والأنماط التاريخية التي قد تشفر التمييز.
- اختيار قيود العدالة التي تناسب مجالك. التكافؤ الديموغرافي يصلح لبعض السياقات، بينما يصلح تساوي الفرص لسياقات أخرى. لا يوجد حد "عادل" عالمي.
- توثيق قرارات النموذج باستخدام بطاقات النماذج (model cards) أو أوراق البيانات (datasheets). سجل البيانات التي تدرب عليها النموذج، وما الذي يحسنه، ومن تم اختباره ضدهم، وأين لا ينبغي نشره.
- المراقبة بعد النشر. يمكن أن تتغير مقاييس العدالة مع تغير المجتمع. قم بإعداد مراقبة تلقائية لاكتشاف الانحراف (drift) في معدلات الاختيار عبر المجموعات.
توفر مكتبات مثل Fairlearn و AI Fairness 360 أدوات إضافية لقياس وتخفيف التحيز في الأنظمة الإنتاجية.
إلى أين تذهب من هنا
غطى هذا الدليل سير العمل الأساسي — المعالجة المسبقة، الخوارزميات، التقييم، والأخلاقيات. إذا كنت ترغب في التعمق في مجالات محددة، فإليك بعض الخطوات التالية التي تستحق الاستكشاف:
- بنيات التعلم العميق (Deep learning architectures): الشبكات التلافيفية (convolutional networks) للصور، والشبكات المتكررة (recurrent networks) والمحولات (transformers) للتسلسلات. يشرح دليلنا حول أساسيات التعلم العميق المفاهيم الجوهرية مع الكود.
- بناء الشبكات العصبية من الصفر: إذا كنت تريد فهم ما يحدث داخل
model.fit()، فإن دليل الشبكات العصبية من الصفر ينفذ عمليات التمرير الأمامي والخلفي يدويًا.
- هيكل المشروع المتكامل: المعالجة المسبقة والنمذجة هما جزء فقط من خط الأنابيب (pipeline). يغطي دليل مشروع علوم البيانات التغليف والنشر والمراقبة.
- الذكاء الاصطناعي المحلي وأنظمة RAG: إذا كنت مهتمًا بتشغيل النماذج على أجهزتك الخاصة، فإن دليل الذاء الاصطناعي المحلي يغطي Ollama، والتوليد المعزز بالاسترجاع (RAG)، وسير عمل الوكلاء (agents).
يتحرك تعلم الآلة بسرعة — تعكس المكتبات وأفضل الممارسات في هذا الدليل حالة الأمور في أوائل عام 2026. الأساسيات (الجبر الخطي، الاحتمالات، التحسين، منهجية التقييم) تتغير ببطء أكبر بكثير من أطر العمل. استثمر في فهم الرياضيات، وستبدو الانتقالات بين الأدوات طبيعية.