بناء نموذج Random Forest لتحديد أهم العوامل المؤثرة في انسحاب العملاء
مقدمة
يُعد بناء نموذج Random Forest لتحديد أهم العوامل المؤثرة في انسحاب العملاء من التطبيقات المهمة لتعلم الآلة في قطاعات الاتصالات، والتجارة الإلكترونية، والخدمات المالية، والمنصات الرقمية. فانسحاب العميل لا يعني خسارة إيراد حالي فقط، بل قد يشير إلى خلل في تجربة الاستخدام أو التسعير أو جودة الدعم أو ملاءمة الخدمة لاحتياجات شريحة معينة من العملاء.
يهدف نموذج التنبؤ بالانسحاب إلى الإجابة عن سؤالين مترابطين: من هم العملاء الأكثر احتمالاً لترك الخدمة؟ وما العوامل التي ترفع هذا الاحتمال؟ هنا تظهر قيمة خوارزمية Random Forest، إذ تجمع نتائج عدد كبير من أشجار القرار لتقديم تصنيف أكثر استقراراً من شجرة قرار واحدة، كما تسمح باستخراج مؤشرات أولية عن أهمية المتغيرات المؤثرة في القرار.
في هذا المقال سنبني منهجاً عملياً يبدأ من فهم البيانات وتجهيزها، ثم تدريب النموذج وضبطه، وصولاً إلى تقييمه وتفسير أهم العوامل وتحويل النتائج إلى إجراءات عملية للاحتفاظ بالعملاء.
فهم مشكلة انسحاب العملاء وتحديد المتغير المستهدف
انسحاب العملاء، أو ما يسمى بالإنجليزية Customer Churn، هو توقف العميل عن استخدام منتج أو خدمة خلال فترة زمنية محددة. تختلف دلالة الانسحاب حسب المجال؛ ففي شركة اتصالات قد يعني إلغاء الخط أو عدم تجديد الاشتراك، وفي منصة بث رقمي قد يعني إيقاف الاشتراك الشهري، بينما قد يُعرّف في متجر إلكتروني بأنه عدم الشراء خلال عدد معين من الأيام.
قبل تدريب أي نموذج، يجب تعريف المتغير المستهدف بوضوح. غالباً يكون عموداً ثنائياً يسمى مثلاً Churn، حيث تمثل القيمة 1 عميلاً منسحباً، وتمثل القيمة 0 عميلاً مستمراً. وتؤثر جودة هذا التعريف مباشرة في جدوى النموذج؛ فإذا كانت نافذة المراقبة قصيرة جداً فقد نعد بعض العملاء غير النشطين منسحبين بالخطأ، وإذا كانت طويلة جداً فقد تتأخر المؤسسة في التدخل.
تشمل المتغيرات التفسيرية الشائعة مدة اشتراك العميل، وقيمة الفاتورة الشهرية، وإجمالي الإنفاق، ونوع العقد، وطريقة الدفع، وعدد تذاكر الدعم، وعدد الشكاوى، واستخدام الخدمات الإضافية، ومؤشرات التفاعل مثل عدد مرات الدخول أو الاستهلاك الشهري. ولا ينبغي استخدام بيانات لا تكون متاحة لحظة اتخاذ القرار، مثل تاريخ الإلغاء الفعلي أو ملاحظات كُتبت بعد انسحاب العميل، لأن ذلك يؤدي إلى تسرب البيانات ويعطي النموذج أداءً مضللاً.
مثلاً، إذا كانت الشركة تريد استهداف العملاء المعرضين للانسحاب في الشهر المقبل، فيجب أن تكون جميع المتغيرات مستخرجة من تاريخ سابق لبداية ذلك الشهر. هذه القاعدة تجعل النموذج قابلاً للاستخدام الحقيقي، لا مجرد تجربة ناجحة على بيانات تاريخية.
لماذا تعد Random Forest مناسبة لتصنيف العملاء المعرضين للانسحاب؟
Random Forest هي خوارزمية تعلم تجميعي تعتمد على إنشاء عدد كبير من أشجار القرار. تتعلم كل شجرة من عينة عشوائية من السجلات، وتختار عند كل نقطة انقسام مجموعة عشوائية فرعية من الخصائص بدلاً من فحص جميع الخصائص المتاحة. وفي التصنيف، يكون قرار النموذج النهائي مبنياً على تصويت الأغلبية بين الأشجار.
الفكرة الأساسية هنا هي تقليل مشكلة التباين المرتفع التي قد تظهر في شجرة القرار المفردة. شجرة واحدة قد تتأثر بشدة بتفاصيل عينة التدريب، فتتعلم أنماطاً خاصة لا تتكرر في بيانات جديدة. أما الغابة العشوائية فتجمع أشجاراً متعددة، ويؤدي تنويع البيانات والخصائص المستخدمة في كل شجرة إلى تقليل الترابط بين تنبؤاتها. عند تجميع النتائج، يصبح النموذج أكثر قدرة على التعميم.
تتميز Random Forest بعدة خصائص مفيدة في مشكلات الانسحاب: تستطيع التعامل مع علاقات غير خطية، وتلتقط التفاعلات بين المتغيرات، ولا تتطلب عادةً توحيد المقاييس العددية كما في بعض الخوارزميات الأخرى. على سبيل المثال، قد لا يكون ارتفاع الفاتورة الشهرية خطراً بحد ذاته، لكنه يصبح مؤشراً قوياً على الانسحاب عندما يقترن بعقد شهري وارتفاع عدد الشكاوى. تستطيع الأشجار تمثيل هذا النوع من القواعد المركبة بصورة طبيعية.
مع ذلك، لا ينبغي التعامل معها بوصفها نموذجاً سحرياً. فقد تكون أبطأ من النماذج البسيطة عند وجود بيانات ضخمة جداً، كما أن تفسيرها أقل مباشرة من شجرة قرار منفردة. لذلك من المهم الجمع بين مقاييس الأداء وأساليب تفسير الأهمية، وعدم الاكتفاء بنسبة الدقة العامة.
تجهيز البيانات ومعالجة القيم الناقصة والفئات النصية
تبدأ جودة النموذج من جودة البيانات. أول خطوة هي فحص الأعمدة، وأنواعها، ونسب القيم الناقصة، وتوزيع المتغير المستهدف. في بيانات الانسحاب غالباً ما نجد أن عدد العملاء المنسحبين أقل من عدد العملاء المستمرين، وهي حالة تسمى عدم توازن الفئات. فإذا كان 80% من العملاء مستمرين، يمكن لنموذج ساذج يتنبأ دائماً بعدم الانسحاب أن يحقق دقة قدرها 80%، لكنه لن يكتشف أي عميل معرض للخطر.
ينبغي حذف المعرّفات الفريدة مثل رقم العميل أو البريد الإلكتروني، لأنها لا تحمل معنى سلوكياً قابلاً للتعميم وقد تدفع النموذج إلى حفظ بيانات التدريب. أما القيم الناقصة في المتغيرات العددية فيمكن تعويضها بالوسيط غالباً، لأنه أقل تأثراً بالقيم المتطرفة من المتوسط. وبالنسبة إلى المتغيرات الفئوية مثل نوع العقد أو وسيلة الدفع، يمكن استخدام القيمة الأكثر تكراراً أو فئة مستقلة مثل “غير معروف”.
تحتاج المتغيرات النصية أو الفئوية إلى تحويلها إلى صيغة رقمية. ومن أكثر الطرق شيوعاً الترميز الأحادي One-Hot Encoding، حيث يتحول المتغير Contract مثلاً إلى أعمدة تمثل العقد الشهري والسنوي والثنائي السنوي. ومن الأفضل تنفيذ هذا التحويل داخل خط معالجة بيانات Pipeline لضمان تطبيق الخطوات نفسها على التدريب والاختبار والبيانات المستقبلية.
يجب أيضاً تقسيم البيانات إلى تدريب واختبار مع استخدام التقسيم الطبقي stratify، بحيث تظل نسبة العملاء المنسحبين متقاربة في الجزأين. وإذا كانت البيانات مرتبطة بالزمن، فمن الأفضل إجراء تقسيم زمني: التدريب على الفترات السابقة والاختبار على فترة لاحقة، لأن هذا يحاكي سيناريو الاستخدام الفعلي.
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv("customer_churn.csv")
# تحويل المتغير المستهدف إلى قيم ثنائية
df["Churn"] = df["Churn"].map({"Yes": 1, "No": 0})
# حذف المعرف الفريد للعميل
X = df.drop(columns=["Churn", "CustomerID"])
y = df["Churn"]
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.20,
random_state=42,
stratify=y
)
بناء خط المعالجة وتدريب نموذج Random Forest
يساعد خط المعالجة على تنظيم التحويلات والنموذج في كائن واحد. نحدد أولاً الأعمدة العددية والفئوية، ثم نبني معالجاً مناسباً لكل نوع. بعد ذلك نستخدم RandomForestClassifier لتدريب الغابة العشوائية.
من أهم الإعدادات عدد الأشجار n_estimators، وعمق الشجرة الأقصى max_depth، وأقل عدد من العينات المطلوبة للانقسام min_samples_split، وأقل عدد من العينات في الورقة النهائية min_samples_leaf، وعدد الخصائص التي تفحص عند كل انقسام max_features. زيادة عدد الأشجار تحسن استقرار النتائج عادةً، لكنها ترفع زمن التدريب. أما تقييد العمق أو زيادة الحد الأدنى للعينات في الورقة فيساعدان على الحد من الإفراط في التعلّم.
عند وجود عدم توازن واضح بين الفئات، يمكن استخدام class_weight="balanced" كي يمنح النموذج وزناً أكبر نسبياً لفئة العملاء المنسحبين. وهذا لا يلغي الحاجة إلى تقييم دقيق، لكنه يمنع النموذج من الانحياز المفرط إلى الفئة الأكبر.
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
numeric_features = X.select_dtypes(include=["int64", "float64"]).columns
categorical_features = X.select_dtypes(include=["object", "bool"]).columns
numeric_transformer = Pipeline(steps=[
("imputer", SimpleImputer(strategy="median"))
])
categorical_transformer = Pipeline(steps=[
("imputer", SimpleImputer(strategy="most_frequent")),
("encoder", OneHotEncoder(handle_unknown="ignore"))
])
preprocessor = ColumnTransformer(transformers=[
("num", numeric_transformer, numeric_features),
("cat", categorical_transformer, categorical_features)
])
model = RandomForestClassifier(
n_estimators=400,
max_depth=12,
min_samples_leaf=4,
max_features="sqrt",
class_weight="balanced",
random_state=42,
n_jobs=-1
)
pipeline = Pipeline(steps=[
("preprocessor", preprocessor),
("model", model)
])
pipeline.fit(X_train, y_train)
ضبط المعلمات الفائقة ومنع الإفراط في التعلّم
القيم الأولية للمعلمات ليست بالضرورة الأفضل. لذلك نستخدم البحث الشبكي Grid Search أو البحث العشوائي Randomized Search مع التحقق المتقاطع. وفي مشكلة الانسحاب، يفضل غالباً تحسين مقياس F1 أو recall لفئة الانسحاب بدلاً من الدقة وحدها.
يقيس الاستدعاء نسبة العملاء المنسحبين فعلاً الذين نجح النموذج في اكتشافهم. وهو مهم عندما تكون كلفة فقدان العميل كبيرة. أما الدقة الإيجابية Precision فتقيس مدى صحة الإنذارات التي يصدرها النموذج؛ وهي مهمة عندما تكون عروض الاحتفاظ مكلفة ولا تريد الشركة إرسالها إلى عدد كبير من العملاء غير المعرضين للانسحاب. ويوازن مقياس F1 بين هذين البعدين.
ينبغي مقارنة أداء التدريب بأداء التحقق أو الاختبار. إذا كان أداء التدريب مرتفعاً جداً وأداء الاختبار أقل بكثير، فقد يكون النموذج مفرط التعلّم. في هذه الحالة يمكن تخفيض max_depth، وزيادة min_samples_leaf، أو تقليل تعقيد النموذج. كما ينبغي الاحتفاظ بمجموعة اختبار نهائية لا تستخدم أثناء ضبط المعلمات، لتقديم تقدير واقعي لأداء النموذج.
from sklearn.model_selection import RandomizedSearchCV
params = {
"model__n_estimators": [200, 400, 600],
"model__max_depth": [8, 12, 16, None],
"model__min_samples_leaf": [1, 2, 4, 8],
"model__max_features": ["sqrt", "log2", 0.5]
}
search = RandomizedSearchCV(
estimator=pipeline,
param_distributions=params,
n_iter=20,
scoring="f1",
cv=5,
n_jobs=-1,
random_state=42
)
search.fit(X_train, y_train)
best_model = search.best_estimator_
تقييم النموذج واختيار عتبة القرار المناسبة
بعد تدريب النموذج، لا يكفي سؤال “كم تبلغ الدقة؟”. يجب قراءة مصفوفة الالتباس التي تعرض العملاء المصنفين بصورة صحيحة وخاطئة. الخطأ من النوع الأول يعني اعتبار عميل مستمر معرضاً للانسحاب، بينما الخطأ من النوع الثاني يعني تفويت عميل سينسحب فعلاً. في برامج الاحتفاظ غالباً ما يكون الخطأ الثاني أكثر ضرراً، لكنه ليس دائماً كذلك؛ فالقرار يعتمد على تكلفة الحملة وقيمة العميل المتوقعة.
تنتج Random Forest احتمالية للانسحاب، ثم تحولها افتراضياً إلى قرار عند عتبة 0.5. لكن يمكن تغيير هذه العتبة. فإذا أرادت المؤسسة توسيع قائمة العملاء المستهدفين، قد تخفض العتبة إلى 0.35 مثلاً، مما يرفع الاستدعاء ويخفض الدقة الإيجابية. أما إذا كانت العروض باهظة، فقد ترفع العتبة لتستهدف الحالات الأعلى خطورة فقط.
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score
y_prob = best_model.predict_proba(X_test)[:, 1]
threshold = 0.40
y_pred = (y_prob >= threshold).astype(int)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
print("ROC-AUC:", roc_auc_score(y_test, y_prob))
يعد مقياس ROC-AUC مفيداً لقياس قدرة النموذج على ترتيب العملاء بحسب المخاطر، لكنه لا يحدد وحده أفضل عتبة تشغيلية. لذلك ينبغي ربط اختيار العتبة بتحليل الأعمال: كم عميلاً يمكن لفريق الاحتفاظ التعامل معه؟ ما تكلفة الخصم؟ وما نسبة العملاء المتوقع إنقاذهم فعلياً بعد التدخل؟
تفسير أهمية العوامل وتحويلها إلى قرارات احتفاظ
القيمة الحقيقية للنموذج لا تتمثل في قائمة احتمالات الانسحاب فقط، بل في فهم الأسباب المحتملة وراء المخاطر. توفر Random Forest خاصية feature_importances_ التي تقيس مقدار مساهمة كل خاصية في تقليل عدم النقاء داخل الأشجار. ويمكن بعد الترميز استخراج أسماء الخصائص وترتيبها تنازلياً.
إذا أظهرت النتائج أن نوع العقد الشهري، وارتفاع الرسوم الشهرية، وقصر مدة الاشتراك، وتكرار الشكاوى هي أهم العوامل، فيمكن للشركة بناء إجراءات موجهة. فقد تقترح على أصحاب العقود الشهرية انتقالاً إلى عقد أطول مقابل ميزة مناسبة، أو تتواصل مع العملاء ذوي الشكاوى المتكررة عبر فريق دعم متخصص، أو تقدم مراجعة سعرية للعملاء ذوي الإنفاق المرتفع والاستخدام المنخفض.
لكن يجب الحذر من تفسير الأهمية بوصفها علاقة سببية. ارتفاع أهمية متغير معين لا يعني بالضرورة أن تغييره سيمنع الانسحاب. فقد يكون المتغير مجرد مؤشر مرتبط بمشكلة أعمق. كما قد تنحاز أهمية الأشجار إلى بعض المتغيرات، خصوصاً عند وجود خصائص كثيرة الفئات. لذلك يفضل استخدام أهمية التبديل Permutation Importance أو أدوات تفسير إضافية مثل SHAP للتحقق من اتساق الاستنتاجات.
كذلك، ينبغي تحليل النتائج حسب الشرائح: هل تختلف العوامل المؤثرة بين العملاء الجدد والعملاء القدامى؟ وهل تظهر دقة أقل لفئة جغرافية أو شريحة سعرية معينة؟ إن دمج التفسير الإحصائي مع معرفة فرق التسويق والدعم والمنتج يحول النموذج من أداة تقنية إلى نظام قرار فعلي.
خاتمة
يوفر نموذج Random Forest أساساً قوياً لتوقع انسحاب العملاء وتحديد المتغيرات الأكثر ارتباطاً به. تبدأ النتيجة الموثوقة بتعريف دقيق للانسحاب ومنع تسرب البيانات، ثم تجهيز المتغيرات وبناء خط معالجة قابل لإعادة الاستخدام. بعد ذلك، يساعد ضبط المعلمات وتقييم النموذج بمقاييس مثل الاستدعاء وF1 وROC-AUC على ضمان أن الأداء يخدم هدف الأعمال الحقيقي.
الأهم من ذلك هو استخدام أهمية العوامل لتصميم تدخلات قابلة للتنفيذ، مثل تحسين تجربة الدعم، أو تعديل العروض السعرية، أو استهداف العملاء في المراحل المبكرة من انخفاض التفاعل. ومع المراقبة المستمرة لأداء النموذج وإعادة تدريبه عند تغير سلوك العملاء، يمكن للمؤسسة تحويل بياناتها إلى استراتيجية احتفاظ أكثر دقة وفعالية.
تعليقات
إرسال تعليق