Machine Learning: التعلم الجماعي
آخر تحديث: 2026-08-26
ثلاثة صنّاع أحذية مجتمعين بذكائهم يساوون Zhuge Liang العقل العبقري — Boosting يسلسل المتعلمين الضعفاء لجعلهم أقوياء، و XGBoost/LightGBM هما النسختان المعززتان من الدرجة الصناعية.
1. ما ستتعلمه
- أساسيات Boosting: مسار التطور من AdaBoost → Gradient Boosting → XGBoost/LightGBM
- XGBoost: دالة الهدف المنتظمة، أخذ عينات الأعمدة، تقسيم الكم التقريبي، تسريع GPU
- LightGBM: ابتكارات GOSS/EFB، التقسيم القائم على المدرج التكراري، دعم الميزات الفئوية الأصلي، مزايا سرعة التدريب
- ضبط المعاملات: learning_rate/n_estimators/max_depth/num_leaves/reg_alpha/reg_lambda
- اختيار النموذج الأساسي لـ Bob: مقارنة أداء XGBoost مقابل LightGBM على بيانات SalesPredict
2. قصة حقيقية من مهندس خوارزميات
(1) نقطة الألم: Random Forest بطيء جدًا على البيانات بمقياس المليون
نمت بيانات SalesPredict لـ Bob إلى مليون صف، ويستغرق تدريب Random Forest بـ 100 شجرة 45 دقيقة. مع 10 تجارب للتشغيل يوميًا، مجرد انتظار التدريب يستهلك 7.5 ساعات. بيانات Alice الأمريكية، بمليوني صف، أبطأ. سرعة التدريب تحد من كفاءة التجريب وتبطئ بشكل غير مباشر تكرار النماذج.
(2) حل XGBoost/LightGBM
من خلال تحسينات مثل التقسيم القائم على المدرج التكراري وأخذ عينات الأعمدة، يقلل XGBoost و LightGBM وقت التدريب بمقدار 5-10 مرات مع تقديم دقة أعلى.
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: تدريب المتعلمين الضعفاء بشكل تسلسلي، مع تركيز كل متعلم جديد على تصحيح أخطاء السابق.
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 يدويًا
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:
# Runs successfully
(2) مقارنة تطور Boosting
| البُعد | AdaBoost | Gradient Boosting | XGBoost | LightGBM |
|---|---|---|---|---|
| طريقة تصحيح الخطأ | ترجيح العينات | ملاءمة التدرجات المتبقية | تدرجات من الدرجة الثانية + تنظيم | تدرجات من الدرجة الثانية + GOSS |
| التنظيم | لا | ضعيف | قوي (L1+L2) | قوي (L1+L2) |
| خوارزمية التقسيم | دقيق | دقيق | كم تقريبي | مدرج تكراري |
| أخذ عينات الأعمدة | لا | لا | نعم | نعم |
| السرعة | بطيء | بطيء | سريع | الأسرع |
4. XGBoost بعمق
(1) الابتكارات الرئيسية في XGBoost
▶ مثال: تدريب انحدار XGBoost
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:
# 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
- GOSS (أخذ العينات من جانب واحد قائم على التدرج): يحتفظ بالعينات ذات التدرج الكبير وأخذ عينات عشوائية من ذات التدرج الصغير
- EFB (تجميع الميزات الحصرية): يجمع الميزات المتفرقة المتبادلة الحصرية لتقليل عدد الميزات
▶ مثال: تدريب انحدار LightGBM
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:
# Runs successfully
(2) دعم LightGBM الأصلي للميزات الفئوية
▶ مثال: تمرير الميزات الفئوية مباشرة إلى LightGBM
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:
# Runs successfully
6. مقارنة أداء XGBoost مع LightGBM
▶ مثال: المقارنة على مجموعة بيانات SalesPredict
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:
# Runs successfully
| البُعد | RandomForest | XGBoost | LightGBM |
|---|---|---|---|
| سرعة التدريب (100k عينة) | 45 ثانية | 8 ثوانٍ | 3 ثوانٍ |
| دقة التنبؤ (R²) | 0.85 | 0.89 | 0.89 |
| استخدام الذاكرة | عالٍ | متوسط | منخفض |
| الميزات الفئوية | يحتاج ترميز | يحتاج ترميز | دعم أصلي |
| دعم GPU | لا | نعم | نعم |
| حجم البيانات المناسب | <500k | أي حجم | أي حجم |
❓ أسئلة شائعة
📖 ملخص
- جوهر Boosting: تدريب المتعلمين الضعفاء بشكل تسلسلي، مع تصحيح كل متعلم جديد لأخطاء السابق
- ابتكارات XGBoost: تحسين التدرج من الدرجة الثانية + تنظيم L1/L2 + أخذ عينات الأعمدة + تقسيم الكم التقريبي
- ابتكارات LightGBM: GOSS (أخذ عينات التدرج) + EFB (تجميع الميزات) + تقسيم المدرج التكراري + الدعم الأصلي للميزات الفئوية
- المعاملات الرئيسية: learning_rate + n_estimators (مع early_stopping)، max_depth/num_leaves، ومعاملات التنظيم
- LightGBM عادةً أسرع من XGBoost بمعامل 2-3 في التدريب، مع دقة مماثلة
- كلاهما إطارا GBDT من الدرجة الصناعية؛ في المشاريع الحقيقية، جرب الاثنين واختر الأنسب لبياناتك
📝 تمارين
- أساسي (الصعوبة ⭐): استخدم XGBRegressor للتنبؤ بـ California Housing مع n_estimators=200، max_depth=5، learning_rate=0.1، واطبع R² و MAE. تلميح: راجع المثال في القسم 4.
- متوسط (الصعوبة ⭐⭐): قارن XGBoost و LightGBM على نفس مجموعة البيانات، وسجل وقت التدريب و R²، واستخدم early_stopping لتجنب فرط التجهيز. تلميح: اضبط eval_set + early_stopping لكل منهما.
- تحدي (الصعوبة ⭐⭐⭐): استخدم GridSearchCV أو Optuna لضبط معاملات LightGBM، وابحث عن أفضل توليفة لـ num_leaves/learning_rate/reg_alpha/reg_lambda لتحسين R² بمقدار 0.02 على الأقل. تلميح: استخدم 5-fold CV وراجع جدول المعاملات في القسم 5 لمعرفة فضاء البحث.
← الدرس السابق: هندسة الميزات | الدرس التالي: تقليل الأبعاد — PCA و t-SNE →