MyMisPal
→ دروس الذكاء الاصطناعي العملي
الدرس 5 من 11

التصنيف: مين بيوقف التعامل معنا؟

خسارة عميل قديم تكلّف أكثر من كسب عميل جديد. نخلة تبي تعرف أي متجر بيوقف الطلب (Churn) قبل ما يوقف، عشان فريق المبيعات يتواصل معه. عندنا 10 متاجر نعرف وش صار لها، ومتجر جديد نبي نتوقع له.

فكرة أقرب الجيران (k-Nearest Neighbors) بسيطة: «قل لي مين يشبهك أقول لك وش بتسوي». نحسب المسافة بين المتجر الجديد وكل متجر قديم، ناخذ أقرب k متاجر (مثلاً 3)، ونشوف وش صار لأغلبهم.

distance = √((orders₁ − orders₂)² + (weeks₁ − weeks₂)²)
PYTHON
# [orders per month, weeks since last order, outcome]
stores = [
    [8, 1, "stays"], [7, 2, "stays"], [9, 1, "stays"], [6, 3, "stays"],
    [2, 7, "leaves"], [1, 9, "leaves"], [3, 6, "leaves"], [2, 8, "leaves"],
    [6, 4, "stays"], [4, 6, "leaves"]
]
new = [4, 5]

def distance(a, b):
    return ((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) ** 0.5

ranked = sorted(stores, key=lambda s: distance(s, new))
k = 3
nearest = ranked[:k]
for s in nearest:
    print(s[2], round(distance(s, new), 2))

votes = [s[2] for s in nearest]
leaves = votes.count("leaves")
print("Prediction:", "leaves" if leaves > k / 2 else "stays")

النتيجة: اثنين من أقرب 3 متاجر وقفوا، فالنموذج يتوقع إن المتجر الجديد بيوقف. هنا القرار للإدارة: اتصال من مندوب المبيعات، أو عرض خاص.

انتبهاختر k فردي (3، 5، 7) عشان ما يتعادل التصويت بين فئتين. وk صغير جداً (1) يتأثر بمتجر شاذ واحد، وk كبير جداً يصير يرجع لرأي الأغلبية العامة.
انتبهتوحيد المقاييس (Scaling) مهم: لو خاصية بالريال (آلاف) وخاصية بالأسابيع (1 إلى 10)، الريال بيسيطر على المسافة. عشان كذا نحوّل كل الخصائص لنفس المدى (مثلاً من 0 إلى 1) قبل حساب المسافة.

تمارين

تمرين 1 · حساب

كم المسافة بين المتجر (3، 4) والمتجر (0، 0)؟

تمرين 2 · اختيار

ليش نختار k = 3 أو 5 بدل 4؟

تمرين 3 · Python · يتصحح بالتشغيل

اكتب دالة distance(a, b) ترجع المسافة بين نقطتين كل وحدة فيها رقمين، مثل [3, 4]. (المصحح يستدعيها ويطبع النتيجة مقرّبة.)

لقيت خطأ في هذي الصفحة، أو عندك فكرة تحسّن الموقع؟