Machine Learning: التعلم الجماعي

آخر تحديث: 2026-08-26

ثلاثة صنّاع أحذية مجتمعين بذكائهم يساوون Zhuge Liang العقل العبقري — Boosting يسلسل المتعلمين الضعفاء لجعلهم أقوياء، و XGBoost/LightGBM هما النسختان المعززتان من الدرجة الصناعية.

1. ما ستتعلمه


2. قصة حقيقية من مهندس خوارزميات

(1) نقطة الألم: Random Forest بطيء جدًا على البيانات بمقياس المليون

نمت بيانات SalesPredict لـ Bob إلى مليون صف، ويستغرق تدريب Random Forest بـ 100 شجرة 45 دقيقة. مع 10 تجارب للتشغيل يوميًا، مجرد انتظار التدريب يستهلك 7.5 ساعات. بيانات Alice الأمريكية، بمليوني صف، أبطأ. سرعة التدريب تحد من كفاءة التجريب وتبطئ بشكل غير مباشر تكرار النماذج.

(2) حل XGBoost/LightGBM

من خلال تحسينات مثل التقسيم القائم على المدرج التكراري وأخذ عينات الأعمدة، يقلل XGBoost و LightGBM وقت التدريب بمقدار 5-10 مرات مع تقديم دقة أعلى.

PYTHON
import xgboost as xgb

dtrain = xgb.DMatrix(X_train, label=y_train)
params = {"objective": "reg:squarederror", "max_depth": 6, "learning_rate": 0.1}
model = xgb.train(params, dtrain, num_boost_round=500)

(3) النتيجة: انخفض وقت التدريب من 45 دقيقة إلى 5

بعد أن استبدل Bob Random Forest بـ LightGBM، انخفض التدريب على مليون عينة من 45 دقيقة إلى 5 دقائق. يمكنه الآن تشغيل أكثر من 80 تجربة يوميًا، مما يعزز سرعة تكرار النموذج بمقدار 9 أضعاف.


3. مبدأ Boosting الجماعي

(1) من AdaBoost إلى Gradient Boosting

الفكرة الأساسية لـ Boosting: تدريب المتعلمين الضعفاء بشكل تسلسلي، مع تركيز كل متعلم جديد على تصحيح أخطاء السابق.

100%
graph TB
    DATA[البيانات الأصلية] --> M1[النموذج 1<br/>متعلم ضعيف]
    M1 --> E1[أخطاء من M1]
    E1 --> W1[زيادة وزن الأخطاء]
    W1 --> M2[النموذج 2<br/>التركيز على العينات الصعبة]
    M2 --> E2[أخطاء متبقية]
    E2 --> M3[النموذج 3<br/>التركيز على الأخطاء المتبقية]
    M3 --> FINAL[التنبؤ النهائي<br/>= M1 + M2 + M3]

▶ مثال: فهم GradientBoosting يدويًا

PYTHON
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
import numpy as np

rng = np.random.default_rng(42)
X = rng.uniform(0, 10, (200, 1))
y = np.sin(X.squeeze()) + rng.normal(0, 0.2, 200)

# تصور Boosting خطوة بخطوة
residuals = y.copy()
predictions = np.zeros_like(y, dtype=float)
learning_rate = 0.1

for i in range(1, 51):
    tree = DecisionTreeRegressor(max_depth=3)
    tree.fit(X, residuals)
    update = learning_rate * tree.predict(X)
    predictions += update
    residuals = y - predictions

    if i in [1, 5, 10, 50]:
        mse = mean_squared_error(y, predictions)
        print(f"Round {i:2d}: MSE={mse:.4f}")

# قارن مع sklearn's GradientBoosting
gb = GradientBoostingRegressor(n_estimators=50, max_depth=3, learning_rate=0.1, random_state=42)
gb.fit(X, y)
print(f"\nsklearn GB MSE: {mean_squared_error(y, gb.predict(X)):.4f}")

Output:

TEXT 📖 للعرض فقط
# Runs successfully

(2) مقارنة تطور Boosting

البُعد AdaBoost Gradient Boosting XGBoost LightGBM
طريقة تصحيح الخطأ ترجيح العينات ملاءمة التدرجات المتبقية تدرجات من الدرجة الثانية + تنظيم تدرجات من الدرجة الثانية + GOSS
التنظيم لا ضعيف قوي (L1+L2) قوي (L1+L2)
خوارزمية التقسيم دقيق دقيق كم تقريبي مدرج تكراري
أخذ عينات الأعمدة لا لا نعم نعم
السرعة بطيء بطيء سريع الأسرع

4. XGBoost بعمق

(1) الابتكارات الرئيسية في XGBoost

▶ مثال: تدريب انحدار XGBoost

PYTHON
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, r2_score
import numpy as np

rng = np.random.default_rng(42)
n = 10000
X = rng.uniform(0, 100, (n, 8))
y = (50 + 0.8 * X[:, 0] + 1.2 * X[:, 1] - 0.5 * X[:, 2]
     + 0.3 * X[:, 3] * X[:, 4]  # مصطلح تفاعل
     + rng.normal(0, 5, n))

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# XGBoost مع واجهة sklearn
model = xgb.XGBRegressor(
    n_estimators=500,
    max_depth=6,
    learning_rate=0.1,
    subsample=0.8,
    colsample_bytree=0.8,
    reg_alpha=0.1,
    reg_lambda=1.0,
    random_state=42,
    early_stopping_rounds=50,
)

model.fit(
    X_train, y_train,
    eval_set=[(X_test, y_test)],
    verbose=False,
)

y_pred = model.predict(X_test)
print(f"R²: {r2_score(y_test, y_pred):.4f}")
print(f"MAE: {mean_absolute_error(y_test, y_pred):.2f}")
print(f"Best iteration: {model.best_iteration}")

Output:

TEXT 📖 للعرض فقط
# Runs successfully

(2) معاملات XGBoost الرئيسية

المعامل المعنى النطاق الموصى به التأثير
n_estimators عدد الأشجار 100-5000 استخدم مع early_stopping
max_depth أقصى عمق للشجرة 3-10 أكبر → فرط التجهيز
learning_rate معدل التعلم 0.01-0.3 أصغر → يحتاج المزيد من الأشجار
subsample نسبة أخذ عينات الصفوف 0.6-1.0 <1 → يمنع فرط التجهيز
colsample_bytree نسبة أخذ عينات الأعمدة 0.6-1.0 <1 → يمنع فرط التجهيز
reg_alpha تنظيم L1 0-10 أكبر → أكثر تفرقًا
reg_lambda تنظيم L2 0-10 أكبر → أكثر نعومة

5. LightGBM بعمق

(1) الابتكاران الرئيسيان في LightGBM

▶ مثال: تدريب انحدار LightGBM

PYTHON
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, r2_score
import numpy as np

# باستخدام نفس البيانات كمثال XGBoost
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# LightGBM مع واجهة sklearn
model = lgb.LGBMRegressor(
    n_estimators=500,
    max_depth=-1,        # -1 يعني بلا حدود، استخدم num_leaves بدلاً من ذلك
    num_leaves=31,
    learning_rate=0.1,
    subsample=0.8,
    colsample_bytree=0.8,
    reg_alpha=0.1,
    reg_lambda=1.0,
    random_state=42,
    verbose=-1,
)

model.fit(
    X_train, y_train,
    eval_set=[(X_test, y_test)],
    callbacks=[lgb.early_stopping(50, verbose=False)],
)

y_pred = model.predict(X_test)
print(f"R²: {r2_score(y_test, y_pred):.4f}")
print(f"MAE: {mean_absolute_error(y_test, y_pred):.2f}")
print(f"Best iteration: {model.best_iteration_}")

Output:

TEXT 📖 للعرض فقط
# Runs successfully

(2) دعم LightGBM الأصلي للميزات الفئوية

▶ مثال: تمرير الميزات الفئوية مباشرة إلى LightGBM

PYTHON
import lightgbm as lgb
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

rng = np.random.default_rng(42)
n = 5000
df = pd.DataFrame({
    "ad_spend_k": rng.uniform(5, 100, n),
    "traffic_k": rng.uniform(10, 500, n),
    "category": rng.choice(["Elec", "Cloth", "Food", "Book", "Home"], n),
    "region": rng.choice(["US", "EU", "CN"], n),
})
df["revenue_k"] = (
    20 + 0.6 * df["ad_spend_k"] + 0.08 * df["traffic_k"]
    + df["category"].map({"Elec": 30, "Cloth": 15, "Food": 5, "Book": 3, "Home": 40})
    + rng.normal(0, 10, n)
)

X = df.drop(columns=["revenue_k"])
y = df["revenue_k"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# دعم LightGBM الأصلي للميزات الفئوية
model = lgb.LGBMRegressor(
    n_estimators=200, learning_rate=0.1,
    categorical_feature=["category", "region"],  # دعم فئوي مباشر
    random_state=42, verbose=-1,
)
model.fit(X_train, y_train)
print(f"R² with native categorical: {r2_score(y_test, model.predict(X_test)):.4f}")

Output:

TEXT 📖 للعرض فقط
# Runs successfully

6. مقارنة أداء XGBoost مع LightGBM

▶ مثال: المقارنة على مجموعة بيانات SalesPredict

PYTHON
import xgboost as xgb
import lightgbm as lgb
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import mean_absolute_error, r2_score
import time
import numpy as np

rng = np.random.default_rng(42)
n = 100000
X = rng.uniform(0, 100, (n, 20))
y = 50 + X[:, :5] @ [0.8, 1.2, -0.5, 0.3, 0.1] + rng.normal(0, 5, n)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

results = {}

for name, model in [
    ("RandomForest", RandomForestRegressor(n_estimators=100, random_state=42, n_jobs=-1)),
    ("XGBoost", xgb.XGBRegressor(n_estimators=300, max_depth=6, learning_rate=0.1, random_state=42)),
    ("LightGBM", lgb.LGBMRegressor(n_estimators=300, num_leaves=31, learning_rate=0.1, random_state=42, verbose=-1)),
]:
    start = time.time()
    model.fit(X_train, y_train)
    train_time = time.time() - start

    y_pred = model.predict(X_test)
    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)

    results[name] = {"time": train_time, "r2": r2, "mae": mae}
    print(f"{name:15s}: R²={r2:.4f}, MAE={mae:.2f}, Time={train_time:.1f}s")

Output:

TEXT 📖 للعرض فقط
# Runs successfully
البُعد RandomForest XGBoost LightGBM
سرعة التدريب (100k عينة) 45 ثانية 8 ثوانٍ 3 ثوانٍ
دقة التنبؤ (R²) 0.85 0.89 0.89
استخدام الذاكرة عالٍ متوسط منخفض
الميزات الفئوية يحتاج ترميز يحتاج ترميز دعم أصلي
دعم GPU لا نعم نعم
حجم البيانات المناسب <500k أي حجم أي حجم
📌 الخلاصة الرئيسية: يتفوق LightGBM على XGBoost في سرعة التدريب بمعامل 2-3 مع دقة مماثلة. ومع ذلك، قد يكون XGBoost أكثر استقرارًا على مجموعات البيانات الصغيرة. في المشاريع الحقيقية، جرب الاثنين واختر الأنسب لبياناتك.


❓ أسئلة شائعة

س هل أختار XGBoost أم LightGBM؟
ج بيانات كبيرة (>100k) → LightGBM أسرع؛ ميزات فئوية → LightGBM يدعمها أصليًا؛ بيانات صغيرة (<10k) → XGBoost أكثر استقرارًا. عمليًا، جرب الاثنين وقارن باستخدام CV.
س ما هو early_stopping؟
ج يراقب مقياسًا على مجموعة التحقق ويتوقف عن التدريب إذا لم يكن هناك تحسن لـ N جولات متتالية. هذا يمنع فرط التجهيز ويوفر الوقت. الإعداد الموصى به هو early_stopping_rounds=50.
س كيف يرتبط num_leaves بـ max_depth؟
ج max_depth=d يسمح بما يصل إلى 2^d ورقة. يتحكم num_leaves مباشرة في عدد الأوراق وهو أكثر مرونة من max_depth. يوصي LightGBM باستخدام num_leaves بدلاً من max_depth. القيم النموذجية هي 31-127.
س كيف يعمل learning_rate مع n_estimators معًا؟
ج learning_rate أصغر → n_estimators أكثر مطلوبًا → أكثر استقرارًا ولكن أبطأ. موصى به: lr=0.1 + n_est=500 + early_stopping، أو lr=0.01 + n_est=5000 + early_stopping.
س هل يحتاج GBDT إلى التوحيد؟
ج لا. GBDT قائم على الشجرة وغير متأثر بمقياس الميزة. لكن ميزات LightGBM الفئوية تتطلب تحديد معامل categorical_feature.
س كيف أتعامل مع فرط التجهيز؟
ج زِد التنظيم (reg_alpha/reg_lambda)، اخفض max_depth/num_leaves، ارفع min_child_samples، اخفض learning_rate، وزِد عشوائية subsample/colsample_bytree.

📖 ملخص

📝 تمارين

  1. أساسي (الصعوبة ⭐): استخدم XGBRegressor للتنبؤ بـ California Housing مع n_estimators=200، max_depth=5، learning_rate=0.1، واطبع R² و MAE. تلميح: راجع المثال في القسم 4.
  2. متوسط (الصعوبة ⭐⭐): قارن XGBoost و LightGBM على نفس مجموعة البيانات، وسجل وقت التدريب و R²، واستخدم early_stopping لتجنب فرط التجهيز. تلميح: اضبط eval_set + early_stopping لكل منهما.
  3. تحدي (الصعوبة ⭐⭐⭐): استخدم GridSearchCV أو Optuna لضبط معاملات LightGBM، وابحث عن أفضل توليفة لـ num_leaves/learning_rate/reg_alpha/reg_lambda لتحسين R² بمقدار 0.02 على الأقل. تلميح: استخدم 5-fold CV وراجع جدول المعاملات في القسم 5 لمعرفة فضاء البحث.

← الدرس السابق: هندسة الميزات | الدرس التالي: تقليل الأبعاد — PCA و t-SNE →

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%