DBSCAN مع Scikit-Learn في Python

DBSCAN مع Scikit-Learn في Python

المُقدّمة

أنت تعمل في شركة استشارية كعالم بيانات. يحتوي المشروع الذي تم تكليفك به حاليًا على بيانات من الطلاب الذين أنهوا دورات تدريبية حول الموارد المالية مؤخرًا. ترغب الشركة المالية التي تجري الدورات في فهم ما إذا كانت هناك عوامل مشتركة تؤثر على الطلاب لشراء نفس الدورات أو شراء دورات مختلفة. من خلال فهم هذه العوامل ، يمكن للشركة إنشاء ملف تعريف الطالب وتصنيف كل طالب حسب الملف الشخصي والتوصية بقائمة من الدورات التدريبية.

عند فحص البيانات من مجموعات الطلاب المختلفة ، صادفت ثلاثة ترتيبات للنقاط ، كما في 1 و 2 و 3 أدناه:

DBSCAN مع Scikit-Learn في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

لاحظ أنه في الرسم 1 ، توجد نقاط أرجوانية منظمة في نصف دائرة ، مع كتلة من النقاط الوردية داخل تلك الدائرة ، وتركيز ضئيل للنقاط البرتقالية خارج تلك الدائرة النصفية ، وخمس نقاط رمادية بعيدة عن كل النقاط الأخرى.

في القطعة 2 ، توجد كتلة مستديرة من النقاط الأرجواني ، وأخرى من النقاط البرتقالية ، وكذلك أربع نقاط رمادية بعيدة عن كل النقاط الأخرى.

وفي الرسم 3 ، يمكننا أن نرى أربع تركيزات للنقاط ، أرجوانية ، وأزرق ، وبرتقالي ، ووردي ، وثلاث نقاط رمادية أخرى بعيدة.

الآن ، إذا اخترت نموذجًا يمكنه فهم بيانات الطلاب الجديدة وتحديد مجموعات مماثلة ، فهل هناك خوارزمية تجميع يمكن أن تعطي نتائج مثيرة للاهتمام لهذا النوع من البيانات؟

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

خوارزمية تعتمد على الكثافة يمكنها تصفية الضوضاء ، مثل DBSCAN (Dانسيتي-BASED Sباتيال Cإشتهاء Aالصفحات مع Noise) ، هو خيار قوي للمواقف ذات المساحات الأكثر كثافة والأشكال الدائرية والضوضاء.

حول DBSCAN

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

الفكرة الرئيسية وراء DBSCAN هي أن هناك حدًا أدنى لعدد النقاط التي ستكون ضمن مسافة محددة أو radius من أكثر نقطة تجمع "مركزية" ، تسمى النقطة الأساسية. النقاط داخل هذا النطاق هي نقاط الجوار ، والنقاط الموجودة على حافة ذلك الحي هي النقاط الحدودية or نقاط الحدود. يتم استدعاء نصف القطر أو مسافة الجوار حي إبسيلون, ε الحي أو مجرد ε (رمز الحرف اليوناني إبسيلون).

بالإضافة إلى ذلك ، عندما تكون هناك نقاط ليست نقاطًا أساسية أو نقاطًا حدودية لأنها تتجاوز نصف القطر للانتماء إلى مجموعة محددة وليس لديها أيضًا الحد الأدنى من عدد النقاط لتكون نقطة أساسية ، فيتم اعتبارها نقاط الضوضاء.

هذا يعني أن لدينا ثلاثة أنواع مختلفة من النقاط ، وهي النواة, الحدود و ضجيج. علاوة على ذلك ، من المهم ملاحظة أن الفكرة الرئيسية تستند أساسًا إلى نصف قطر أو مسافة ، مما يجعل DBSCAN - مثل معظم نماذج المجموعات - يعتمد على مقياس المسافة هذا. يمكن أن يكون هذا المقياس إقليدي ، مانهاتن ، ماهالانوبيس ، وغيرها الكثير. لذلك ، من الضروري اختيار مقياس مسافة مناسب يأخذ في الاعتبار سياق البيانات. على سبيل المثال ، إذا كنت تستخدم بيانات مسافة القيادة من نظام تحديد المواقع العالمي (GPS) ، فقد يكون من المثير للاهتمام استخدام مقياس يأخذ تخطيطات الشوارع في الاعتبار ، مثل مسافة مانهاتن.

DBSCAN مع Scikit-Learn في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

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

للعثور على النقطة الأساسية ، ستحدد DBSCAN أولاً نقطة بشكل عشوائي ، وتعيين جميع النقاط داخل جوارها ، ومقارنة عدد الجيران للنقطة المحددة بالحد الأدنى لعدد النقاط. إذا كانت النقطة المحددة لها عدد مساوٍ أو عدد جيران أكثر من الحد الأدنى لعدد النقاط ، فسيتم تمييزها كنقطة أساسية. ستشكل هذه النقطة الأساسية ونقاط الجوار الخاصة بها المجموعة الأولى.

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

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

المشورة: هناك العديد من القواعد والعروض التوضيحية الرياضية المتضمنة في الفكرة وراء DBSCAN ، إذا كنت تريد التعمق أكثر ، فقد ترغب في إلقاء نظرة على الورقة الأصلية ، والمرتبطة أعلاه.

من المثير للاهتمام معرفة كيفية عمل خوارزمية DBSCAN ، على الرغم من أنه ، لحسن الحظ ، ليست هناك حاجة لتشفير الخوارزمية ، بمجرد تطبيق مكتبة Scikit-Learn في Python بالفعل.

دعونا نرى كيف يعمل في الممارسة!

استيراد البيانات للتجميع

لمعرفة كيفية عمل DBSCAN عمليًا ، سنقوم بتغيير المشاريع قليلاً واستخدام مجموعة بيانات صغيرة للعملاء تحتوي على 200 عميل من النوع والعمر والدخل السنوي والإنفاق.

تتراوح درجة الإنفاق من 0 إلى 100 وتمثل عدد المرات التي ينفق فيها الشخص المال في مركز تجاري على مقياس من 1 إلى 100. بمعنى آخر ، إذا حصل العميل على درجة 0 ، فلن ينفق المال أبدًا ، وإذا كانت النتيجة كذلك 100 ، هم أعلى منفق.

ملحوظة: يمكنك تنزيل مجموعة البيانات هنا.

بعد تنزيل مجموعة البيانات ، سترى أنه ملف CSV (قيم مفصولة بفواصل) يسمى بيانات التسوق. csv، سنقوم بتحميله في DataFrame باستخدام Pandas وتخزينه في ملف customer_data المتغير:

import pandas as pd path_to_file = '../../datasets/dbscan/dbscan-with-python-and-scikit-learn-shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

لإلقاء نظرة على الصفوف الخمسة الأولى من بياناتنا ، يمكنك تنفيذها customer_data.head():

وينتج عنه:

 CustomerID Genre Age Annual Income (k$) Spending Score (1-100)
0 1 Male 19 15 39
1 2 Male 21 15 81
2 3 Female 20 16 6
3 4 Female 23 16 77
4 5 Female 31 17 40

من خلال فحص البيانات ، يمكننا رؤية أرقام معرف العميل ، والنوع ، والعمر ، والدخل بالكيلو دولار ، وعشرات الإنفاق. ضع في اعتبارك أنه سيتم استخدام بعض أو كل هذه المتغيرات في النموذج. على سبيل المثال ، إذا كنا سنستخدم Age و Spending Score (1-100) كمتغيرات لـ DBSCAN ، التي تستخدم مقياس المسافة ، من المهم وضعها في نطاق مشترك لتجنب إدخال التشوهات منذ Age يقاس بالسنوات و Spending Score (1-100) نطاق محدود من 0 إلى 100. هذا يعني أننا سنجري نوعًا من تحجيم البيانات.

يمكننا أيضًا التحقق مما إذا كانت البيانات تحتاج إلى مزيد من المعالجة المسبقة بصرف النظر عن القياس من خلال معرفة ما إذا كان نوع البيانات متسقًا والتحقق مما إذا كانت هناك أي قيم مفقودة تحتاج إلى المعالجة عن طريق تنفيذ Panda's info() الأسلوب:

customer_data.info()

يعرض هذا:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 CustomerID 200 non-null int64 1 Genre 200 non-null object 2 Age 200 non-null int64 3 Annual Income (k$) 200 non-null int64 4 Spending Score (1-100) 200 non-null int64 dtypes: int64(4), object(1)
memory usage: 7.9+ KB

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

يمكننا المضي قدمًا في تصور البيانات وتحديد الميزات التي سيكون من المثير للاهتمام استخدامها في DBSCAN. بعد اختيار هذه الميزات ، يمكننا توسيع نطاقها.

مجموعة بيانات العملاء هذه هي نفسها المستخدمة في دليلنا النهائي للتجميع الهرمي. لمعرفة المزيد حول هذه البيانات ، وكيفية استكشافها ، وحول مقاييس المسافة ، يمكنك إلقاء نظرة عليها الدليل النهائي للتسلسل الهرمي للمجموعات باستخدام Python و Scikit-Learn!

تصور البيانات

باستخدام Seaborn's pairplot()، يمكننا رسم رسم بياني مبعثر لكل مجموعة من الميزات. منذ CustomerID هو مجرد تعريف وليس ميزة ، سنقوم بإزالتها باستخدام drop() قبل التآمر:

import seaborn as sns customer_data = customer_data.drop('CustomerID', axis=1) sns.pairplot(customer_data);

هذا ينتج:

DBSCAN مع Scikit-Learn في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

عند النظر إلى مجموعة الميزات التي تنتجها pairplot، الرسم البياني لـ Annual Income (k$) مع Spending Score (1-100) يبدو أنه يعرض حوالي 5 مجموعات من النقاط. يبدو أن هذا هو أكثر مجموعة واعدة من الميزات. يمكننا إنشاء قائمة بأسمائهم ، واختيارهم من customer_data DataFrame ، وقم بتخزين التحديد في ملف customer_data متغير مرة أخرى لاستخدامه في نموذجنا المستقبلي.

selected_cols = ['Annual Income (k$)', 'Spending Score (1-100)']
customer_data = customer_data[selected_cols]

بعد تحديد الأعمدة ، يمكننا إجراء القياس الذي تمت مناقشته في القسم السابق. لجلب الميزات إلى نفس المقياس أو توحيد لهم ، يمكننا استيراد Scikit-Learn's StandardScalerوإنشائها وملاءمة بياناتنا لحساب متوسطها وانحرافها المعياري ، وتحويل البيانات بطرح وسطها وتقسيمها على الانحراف المعياري. يمكن القيام بذلك في خطوة واحدة باستخدام ملف fit_transform() الأسلوب:

from sklearn.preprocessing import StandardScaler ss = StandardScaler() scaled_data = ss.fit_transform(customer_data)

تم الآن تحجيم المتغيرات ، ويمكننا فحصها ببساطة عن طريق طباعة محتوى ملف scaled_data عامل. بدلاً من ذلك ، يمكننا أيضًا إضافتها إلى ملف scaled_customer_data DataFrame جنبًا إلى جنب مع أسماء الأعمدة واستخدام ملف head() الطريقة مرة أخرى:

scaled_customer_data = pd.DataFrame(columns=selected_cols, data=scaled_data)
scaled_customer_data.head()

هذا ينتج:

 Annual Income (k$) Spending Score (1-100)
0 -1.738999 -0.434801
1 -1.738999 1.195704
2 -1.700830 -1.715913
3 -1.700830 1.040418
4 -1.662660 -0.395980 

هذه البيانات جاهزة للتجميع! عند تقديم DBSCAN ، ذكرنا الحد الأدنى لعدد النقاط و epsilon. يجب تحديد هاتين القيمتين قبل إنشاء النموذج. دعونا نرى كيف يتم ذلك.

اختيار مين. عينات وابسيلون

لاختيار الحد الأدنى لعدد النقاط لتجميع DBSCAN ، هناك قاعدة عامة تنص على أنه يجب أن تكون مساوية أو أعلى من عدد الأبعاد في البيانات زائد واحد ، كما في:

$$
نص {min. النقاط}> = نص {أبعاد البيانات} + 1
$$

الأبعاد هي عدد الأعمدة في إطار البيانات ، ونحن نستخدم عمودين ، وبالتالي الحد الأدنى. يجب أن تكون النقاط إما 2 + 2 ، أي 1 ، أو أعلى. في هذا المثال ، دعنا نستخدم 5 دقائق نقاط.

$$
نص {5 (الحد الأدنى من النقاط)}> = نص {2 (أبعاد البيانات)} + 1
$$

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

الآن ، لاختيار قيمة هناك طريقة يكون فيها a أقرب الجيران يتم استخدام الخوارزمية لإيجاد مسافات عدد محدد مسبقًا من أقرب نقطة لكل نقطة. هذا العدد المحدد مسبقًا من الجيران هو الحد الأدنى. النقاط التي اخترناها للتو ناقص 1. لذلك ، في حالتنا ، ستجد الخوارزمية 5-1 ، أو 4 نقاط أقرب لكل نقطة من بياناتنا. هؤلاء هم ك الجيران ولنا k يساوي 4.

$$
نص {k-neighbours} = نص {دقيقة. النقاط} - 1
$$

بعد إيجاد الجيران ، سنرتب مسافاتهما من الأكبر إلى الأصغر ونرسم مسافات المحور y والنقاط على المحور x. بالنظر إلى المخطط ، سنجد المكان الذي يشبه انحناء الكوع ونقطة المحور y التي تصف أن الانحناء الكوع هي القيمة المقترحة ε.

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

لتنفيذ هذه الخطوات ، يمكننا استيراد الخوارزمية ، وتناسبها مع البيانات ، ومن ثم يمكننا استخراج مسافات ومؤشرات كل نقطة باستخدام kneighbors() الأسلوب:

from sklearn.neighbors import NearestNeighbors
import numpy as np nn = NearestNeighbors(n_neighbors=4) nbrs = nn.fit(scaled_customer_data)
distances, indices = nbrs.kneighbors(scaled_customer_data)

بعد إيجاد المسافات ، يمكننا فرزها من الأكبر إلى الأصغر. نظرًا لأن العمود الأول لصفيف المسافات هو من النقطة إلى نفسها (بمعنى أنها كلها 0) ، والعمود الثاني يحتوي على أصغر المسافات ، متبوعًا بالعمود الثالث الذي يحتوي على مسافات أكبر من الثاني ، وهكذا ، يمكننا اختيار فقط قيم العمود الثاني وتخزينها في ملف distances المتغير:

distances = np.sort(distances, axis=0)
distances = distances[:,1] 

الآن بعد أن أصبح لدينا أصغر المسافات ، يمكننا الاستيراد matplotlib، ارسم المسافات ، وارسم خطًا أحمر حيث يكون "منعطف الكوع":

import matplotlib.pyplot as plt plt.figure(figsize=(6,3))
plt.plot(distances)
plt.axhline(y=0.24, color='r', linestyle='--', alpha=0.4) plt.title('Kneighbors distance graph')
plt.xlabel('Data points')
plt.ylabel('Epsilon value')
plt.show();

هذه هي النتيجة:

DBSCAN مع Scikit-Learn في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

لاحظ أنه عند رسم الخط ، سنكتشف قيمة ε ، وهي في هذه الحالة 0.24.

لدينا في النهاية الحد الأدنى من النقاط و ε. باستخدام كلا المتغيرين ، يمكننا إنشاء نموذج DBSCAN وتشغيله.

إنشاء نموذج DBSCAN

لإنشاء النموذج ، يمكننا استيراده من Scikit-Learn ، وإنشائه باستخدام ε وهو نفس ملف eps حجة ، والحد الأدنى من النقاط التي هي mean_samples دعوى. يمكننا بعد ذلك تخزينها في متغير ، دعنا نسميها dbs وتناسبها مع البيانات المقاسة:

from sklearn.cluster import DBSCAN dbs = DBSCAN(eps=0.24, min_samples=5)
dbs.fit(scaled_customer_data)

تمامًا مثل ذلك ، تم إنشاء نموذج DBSCAN الخاص بنا وتدريبه على البيانات! لاستخراج النتائج ، نقوم بالوصول إلى labels_ ملكية. يمكننا أيضًا إنشاء ملف labels العمود في scaled_customer_data إطار البيانات واملأه بالتسميات المتوقعة:

labels = dbs.labels_ scaled_customer_data['labels'] = labels
scaled_customer_data.head()

هذه هي النتيجة النهائية:

 Annual Income (k$) Spending Score (1-100) labels
0 -1.738999 -0.434801 -1
1 -1.738999 1.195704 0
2 -1.700830 -1.715913 -1
3 -1.700830 1.040418 0
4 -1.662660 -0.395980 -1

لاحظ أن لدينا تسميات بها -1 قيم؛ هؤلاء هم نقاط الضوضاء، تلك التي لا تنتمي إلى أي كتلة. لمعرفة عدد نقاط الضجيج التي عثرت عليها الخوارزمية ، يمكننا حساب عدد المرات التي تظهر فيها القيمة -1 في قائمة التسميات الخاصة بنا:

labels_list = list(scaled_customer_data['labels'])
n_noise = labels_list.count(-1)
print("Number of noise points:", n_noise)

هذا ينتج:

Number of noise points: 62

نحن نعلم بالفعل أن 62 نقطة من بياناتنا الأصلية البالغة 200 نقطة كانت تعتبر ضوضاء. هذا كثير من الضوضاء ، مما يشير إلى أنه ربما لم تأخذ مجموعة DBSCAN في الاعتبار العديد من النقاط كجزء من الكتلة. سوف نفهم ما حدث قريبًا ، عندما نرسم البيانات.

في البداية ، عندما لاحظنا البيانات ، بدا أنها تحتوي على 5 مجموعات من النقاط. لمعرفة عدد المجموعات التي تكونت بواسطة DBSCAN ، يمكننا حساب عدد الملصقات التي ليست -1. هناك طرق عديدة لكتابة هذا الرمز ؛ هنا ، قمنا بكتابة حلقة for ، والتي ستعمل أيضًا مع البيانات التي وجد فيها DBSCAN العديد من المجموعات:

total_labels = np.unique(labels) n_labels = 0
for n in total_labels: if n != -1: n_labels += 1
print("Number of clusters:", n_labels)

هذا ينتج:

Number of clusters: 6

يمكننا أن نرى أن الخوارزمية توقعت أن تحتوي البيانات على 6 مجموعات ، مع العديد من نقاط الضوضاء. دعونا نتخيل ذلك من خلال تآمره مع الطيور البحرية scatterplot:

sns.scatterplot(data=scaled_customer_data, x='Annual Income (k$)', y='Spending Score (1-100)', hue='labels', palette='muted').set_title('DBSCAN found clusters');

وينتج عنه:

DBSCAN مع Scikit-Learn في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

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

DBSCAN مع Scikit-Learn في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. منظمة العفو الدولية.

إذا قمنا بتمييز المجموعات ، لاحظ كيف تحصل DBSCAN على المجموعة 1 تمامًا ، وهي الكتلة التي بها مساحة أقل بين النقاط. ثم تحصل على أجزاء المجموعات 0 و 3 حيث تكون النقاط متقاربة ، مع الأخذ في الاعتبار النقاط المتباعدة على أنها ضوضاء. كما أنها تعتبر النقاط الموجودة في النصف الأيسر السفلي بمثابة ضوضاء وتقسم النقاط الموجودة في الجزء السفلي الأيمن إلى 3 مجموعات ، مرة أخرى تلتقط المجموعات 4 و 2 و 5 حيث تكون النقاط أقرب معًا.

يمكننا أن نبدأ في التوصل إلى استنتاج مفاده أن DBSCAN كان رائعًا لالتقاط المناطق الكثيفة من المجموعات ولكن ليس كثيرًا لتحديد المخطط الأكبر للبيانات ، تحديد المجموعات الخمس. سيكون من المثير للاهتمام اختبار المزيد من خوارزميات التجميع باستخدام بياناتنا. دعونا نرى ما إذا كان المقياس سيؤيد هذه الفرضية.

تقييم الخوارزمية

لتقييم DBSCAN سنستخدم امتداد النتيجة الظلية والتي ستأخذ في الاعتبار المسافة بين نقاط نفس المجموعة والمسافات بين العناقيد.

ملحوظة: في الوقت الحالي ، لا تُعد معظم مقاييس المجموعات مناسبة بالفعل لاستخدامها في تقييم DBSCAN لأنها لا تستند إلى الكثافة. هنا ، نحن نستخدم درجة الصورة الظلية لأنها مطبقة بالفعل في Scikit-Learn ولأنها تحاول النظر إلى شكل الكتلة.

للحصول على تقييم أكثر ملاءمة ، يمكنك استخدامه أو دمجه مع التحقق من صحة المجموعات المستندة إلى الكثافة (DBCV) ، الذي تم تصميمه خصيصًا للتجمعات القائمة على الكثافة. يتوفر تطبيق لـ DBCV على هذا GitHub جيثب:.

أولاً ، يمكننا الاستيراد silhouette_score من Scikit-Learn ، إذن ، قم بتمريرها أعمدةنا وتسمياتنا:

from sklearn.metrics import silhouette_score s_score = silhouette_score(scaled_customer_data, labels)
print(f"Silhouette coefficient: {s_score:.3f}")

هذا ينتج:

Silhouette coefficient: 0.506

وفقًا لهذه النتيجة ، يبدو أن DBSCAN يمكنه التقاط ما يقرب من 50٪ من البيانات.

وفي الختام

مزايا وعيوب DBSCAN

DBSCAN هي خوارزمية أو نموذج تجميع فريد جدًا.

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

يتطلب منا تحديد الحد الأدنى من النقاط و ، ولكن ليست هناك حاجة لتحديد عدد المجموعات مسبقًا ، كما هو الحال في K-Means ، على سبيل المثال. يمكن استخدامه أيضًا مع قواعد بيانات كبيرة جدًا نظرًا لأنه مصمم للبيانات عالية الأبعاد.

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

ملحقات DBSCAN

هناك خوارزميات أخرى ، مثل DBSCAN الهرمي (HDBSCAN) و ترتيب النقاط لتحديد هيكل التجميع (OPTICS)، والتي تعتبر امتدادًا لـ DBSCAN.

يمكن لكل من HDBSCAN و OPTICS أداء أفضل عادة عندما تكون هناك مجموعات من كثافات متفاوتة في البيانات وتكون أيضًا أقل حساسية للاختيار أو الحد الأدنى الأولي. النقاط و المعلمات.

الطابع الزمني:

اكثر من ستاكابوز