DBSCAN με Scikit-Learn σε Python

DBSCAN με Scikit-Learn σε Python

Εισαγωγή

Εργάζεστε σε μια εταιρεία συμβούλων ως επιστήμονας δεδομένων. Το έργο στο οποίο ανατέθηκε αυτήν τη στιγμή έχει δεδομένα από φοιτητές που ολοκλήρωσαν πρόσφατα μαθήματα σχετικά με τα οικονομικά. Η χρηματοοικονομική εταιρεία που διεξάγει τα μαθήματα θέλει να καταλάβει εάν υπάρχουν κοινοί παράγοντες που επηρεάζουν τους μαθητές να αγοράσουν τα ίδια μαθήματα ή να αγοράσουν διαφορετικά μαθήματα. Κατανοώντας αυτούς τους παράγοντες, η εταιρεία μπορεί να δημιουργήσει ένα προφίλ μαθητή, να ταξινομήσει κάθε μαθητή ανά προφίλ και να προτείνει μια λίστα μαθημάτων.

Κατά την επιθεώρηση δεδομένων από διαφορετικές ομάδες μαθητών, έχετε συναντήσει τρεις διαθέσεις σημείων, όπως στα 1, 2 και 3 παρακάτω:

DBSCAN με Scikit-Learn στο Python PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Παρατηρήστε ότι στο διάγραμμα 1, υπάρχουν μωβ σημεία οργανωμένα σε ημικύκλιο, με μάζα ροζ σημείων μέσα σε αυτόν τον κύκλο, λίγη συγκέντρωση πορτοκαλί σημείων έξω από αυτό το ημικύκλιο και πέντε γκρίζα σημεία που απέχουν πολύ από όλα τα άλλα.

Στο οικόπεδο 2, υπάρχει μια στρογγυλή μάζα από μωβ σημεία, μια άλλη από πορτοκαλί σημεία, και επίσης τέσσερα γκρίζα σημεία που απέχουν πολύ από όλα τα άλλα.

Και στο διάγραμμα 3, μπορούμε να δούμε τέσσερις συγκεντρώσεις σημείων, μωβ, μπλε, πορτοκαλί, ροζ και τρία ακόμη απομακρυσμένα γκρίζα σημεία.

Τώρα, εάν επιλέγατε ένα μοντέλο που θα μπορούσε να κατανοήσει νέα δεδομένα μαθητών και να προσδιορίσει παρόμοιες ομάδες, υπάρχει κάποιος αλγόριθμος ομαδοποίησης που θα μπορούσε να δώσει ενδιαφέροντα αποτελέσματα σε αυτού του είδους τα δεδομένα;

Κατά την περιγραφή των πλοκών, αναφέραμε όρους όπως μάζα σημείων και συγκέντρωση σημείων, υποδεικνύοντας ότι υπάρχουν περιοχές σε όλα τα γραφήματα με μεγαλύτερη πυκνότητα. Αναφερθήκαμε επίσης εγκύκλιος και ημικυκλικός σχήματα, τα οποία είναι δύσκολο να εντοπιστούν τραβώντας μια ευθεία γραμμή ή απλώς εξετάζοντας τα πλησιέστερα σημεία. Επιπλέον, υπάρχουν ορισμένα απομακρυσμένα σημεία που πιθανόν να αποκλίνουν από την κύρια διανομή δεδομένων, εισάγοντας περισσότερες προκλήσεις ή θόρυβος κατά τον καθορισμό των ομάδων.

Ένας αλγόριθμος που βασίζεται στην πυκνότητα που μπορεί να φιλτράρει τον θόρυβο, όπως π.χ DBSCAN (Dνομιμότητα-Bασήμαντη Sκρησφύγετο Cλάμψη του Aεφαρμογές με Noise), είναι μια ισχυρή επιλογή για καταστάσεις με πυκνότερες περιοχές, στρογγυλεμένα σχήματα και θόρυβο.

Σχετικά με το DBSCAN

Το DBSCAN είναι ένας από τους αλγόριθμους με τις περισσότερες αναφορές στην έρευνα, η πρώτη του δημοσίευση εμφανίζεται το 1996, αυτός είναι ο πρωτότυπο χαρτί DBSCAN. Στο έγγραφο, οι ερευνητές δείχνουν πώς ο αλγόριθμος μπορεί να αναγνωρίσει μη γραμμικά χωρικά συμπλέγματα και να χειριστεί δεδομένα με υψηλότερες διαστάσεις αποτελεσματικά.

Η κύρια ιδέα πίσω από το DBSCAN είναι ότι υπάρχει ένας ελάχιστος αριθμός σημείων που θα βρίσκονται σε μια καθορισμένη απόσταση ή ακτίνα κύκλου από το πιο «κεντρικό» σημείο συμπλέγματος, που ονομάζεται βασικό σημείο. Τα σημεία εντός αυτής της ακτίνας είναι τα σημεία γειτονιάς και τα σημεία στην άκρη αυτής της γειτονιάς είναι τα συνοριακά σημεία or οριακά σημεία. Η ακτίνα ή η απόσταση γειτονιάς ονομάζεται γειτονιά έψιλον, ε-γειτονιά ή απλά ε (το σύμβολο για το ελληνικό γράμμα έψιλον).

Επιπλέον, όταν υπάρχουν σημεία που δεν είναι σημεία πυρήνα ή συνοριακά σημεία επειδή υπερβαίνουν την ακτίνα για να ανήκουν σε ένα καθορισμένο σύμπλεγμα και επίσης δεν έχουν τον ελάχιστο αριθμό σημείων για να είναι σημείο πυρήνα, λαμβάνονται υπόψη σημεία θορύβου.

Αυτό σημαίνει ότι έχουμε τρεις διαφορετικούς τύπους σημείων, δηλαδή, πυρήνας, σύνορο και θόρυβος. Επιπλέον, είναι σημαντικό να σημειωθεί ότι η κύρια ιδέα βασίζεται θεμελιωδώς σε μια ακτίνα ή απόσταση, γεγονός που καθιστά το DBSCAN –όπως τα περισσότερα μοντέλα ομαδοποίησης– να εξαρτάται από αυτή τη μέτρηση απόστασης. Αυτή η μέτρηση θα μπορούσε να είναι Ευκλείδειος, Μανχάταν, Μαχαλανόμπις και πολλά άλλα. Επομένως, είναι σημαντικό να επιλέξετε μια κατάλληλη μέτρηση απόστασης που λαμβάνει υπόψη το πλαίσιο των δεδομένων. Για παράδειγμα, εάν χρησιμοποιείτε δεδομένα απόστασης οδήγησης από ένα GPS, μπορεί να είναι ενδιαφέρον να χρησιμοποιήσετε μια μέτρηση που λαμβάνει υπόψη τη διάταξη των δρόμων, όπως η απόσταση του Μανχάταν.

DBSCAN με Scikit-Learn στο Python PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Σημείωση: Εφόσον το DBSCAN χαρτογραφεί τα σημεία που συνιστούν θόρυβο, μπορεί επίσης να χρησιμοποιηθεί ως αλγόριθμος ανίχνευσης ακραίων τιμών. Για παράδειγμα, εάν προσπαθείτε να προσδιορίσετε ποιες τραπεζικές συναλλαγές μπορεί να είναι δόλιες και το ποσοστό των δόλιων συναλλαγών είναι μικρό, το DBSCAN μπορεί να είναι μια λύση για τον εντοπισμό αυτών των σημείων.

Για να βρει το κεντρικό σημείο, το DBSCAN θα επιλέξει πρώτα ένα σημείο τυχαία, θα αντιστοιχίσει όλα τα σημεία εντός της ε-γειτονιάς του και θα συγκρίνει τον αριθμό των γειτόνων του επιλεγμένου σημείου με τον ελάχιστο αριθμό σημείων. Εάν το επιλεγμένο σημείο έχει ίσο ή περισσότερους γείτονες από τον ελάχιστο αριθμό πόντων, θα επισημανθεί ως βασικό σημείο. Αυτό το κεντρικό σημείο και τα σημεία γειτονιάς του θα αποτελέσουν το πρώτο σύμπλεγμα.

Στη συνέχεια, ο αλγόριθμος θα εξετάσει κάθε σημείο του πρώτου συμπλέγματος και θα δει αν έχει ίσο ή περισσότερα γειτονικά σημεία από τον ελάχιστο αριθμό σημείων μέσα στο ε. Εάν συμβεί αυτό, αυτά τα γειτονικά σημεία θα προστεθούν επίσης στο πρώτο σύμπλεγμα. Αυτή η διαδικασία θα συνεχιστεί έως ότου τα σημεία του πρώτου συμπλέγματος έχουν λιγότερους γείτονες από τον ελάχιστο αριθμό σημείων μέσα στο ε. Όταν συμβεί αυτό, ο αλγόριθμος σταματά να προσθέτει σημεία σε αυτό το σύμπλεγμα, προσδιορίζει ένα άλλο βασικό σημείο έξω από αυτό το σύμπλεγμα και δημιουργεί ένα νέο σύμπλεγμα για αυτό το νέο κεντρικό σημείο.

Στη συνέχεια, το DBSCAN θα επαναλάβει τη διαδικασία του πρώτου συμπλέγματος για την εύρεση όλων των σημείων που συνδέονται με ένα νέο κεντρικό σημείο του δεύτερου συμπλέγματος έως ότου δεν υπάρχουν άλλα σημεία που θα προστεθούν σε αυτό το σύμπλεγμα. Στη συνέχεια, θα συναντήσει ένα άλλο βασικό σημείο και θα δημιουργήσει ένα τρίτο σύμπλεγμα ή θα επαναλάβει όλα τα σημεία που δεν έχει εξετάσει προηγουμένως. Εάν αυτά τα σημεία βρίσκονται σε απόσταση ε από ένα σύμπλεγμα, προστίθενται σε αυτό το σύμπλεγμα και γίνονται σημεία συνόρων. Εάν δεν είναι, θεωρούνται σημεία θορύβου.

Συμβουλές: Υπάρχουν πολλοί κανόνες και μαθηματικές επιδείξεις που εμπλέκονται στην ιδέα πίσω από το DBSCAN, αν θέλετε να σκάψετε βαθύτερα, ίσως θελήσετε να ρίξετε μια ματιά στην αρχική εργασία, η οποία συνδέεται παραπάνω.

Είναι ενδιαφέρον να γνωρίζουμε πώς λειτουργεί ο αλγόριθμος DBSCAN, αν και, ευτυχώς, δεν υπάρχει ανάγκη κωδικοποίησης του αλγόριθμου, αφού η βιβλιοθήκη Scikit-Learn της Python έχει ήδη μια υλοποίηση.

Ας δούμε πώς λειτουργεί στην πράξη!

Εισαγωγή δεδομένων για ομαδοποίηση

Για να δούμε πώς λειτουργεί το DBSCAN στην πράξη, θα αλλάξουμε λίγο τα έργα και θα χρησιμοποιήσουμε ένα μικρό σύνολο δεδομένων πελατών που έχει το είδος, την ηλικία, το ετήσιο εισόδημα και τη βαθμολογία δαπανών 200 πελατών.

Η βαθμολογία δαπανών κυμαίνεται από 0 έως 100 και αντιπροσωπεύει πόσο συχνά ένα άτομο ξοδεύει χρήματα σε ένα εμπορικό κέντρο σε κλίμακα από το 1 έως το 100. Με άλλα λόγια, εάν ένας πελάτης έχει βαθμολογία 0, δεν ξοδεύει ποτέ χρήματα και εάν η βαθμολογία είναι 100, είναι αυτοί που ξοδεύουν περισσότερο.

Σημείωση: Μπορείτε να κατεβάσετε το σύνολο δεδομένων εδώ.

Μετά τη λήψη του συνόλου δεδομένων, θα δείτε ότι είναι ένα αρχείο CSV (τιμές διαχωρισμένες με κόμμα) που ονομάζεται shopping-data.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

Εξετάζοντας τα δεδομένα, μπορούμε να δούμε αριθμούς αναγνωριστικού πελάτη, είδος, ηλικία, εισοδήματα σε k$ και βαθμολογίες δαπανών. Λάβετε υπόψη ότι ορισμένες ή όλες αυτές οι μεταβλητές θα χρησιμοποιηθούν στο μοντέλο. Για παράδειγμα, αν χρησιμοποιούσαμε 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 Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Όταν εξετάζετε τον συνδυασμό χαρακτηριστικών που παράγονται από 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, αναφέραμε τον ελάχιστο αριθμό πόντων και το έψιλον. Αυτές οι δύο τιμές πρέπει να επιλεγούν πριν από τη δημιουργία του μοντέλου. Ας δούμε πώς γίνεται.

Επιλέγοντας Min. Δείγματα και Έψιλον

Για να επιλέξετε τον ελάχιστο αριθμό σημείων για ομαδοποίηση DBSCAN, υπάρχει ένας εμπειρικός κανόνας, ο οποίος δηλώνει ότι πρέπει να είναι ίσος ή μεγαλύτερος από τον αριθμό των διαστάσεων στα δεδομένα συν ένα, όπως:

$$
κείμενο{ελάχ. σημεία} >= κείμενο{διαστάσεις δεδομένων} + 1
$$

Οι διαστάσεις είναι ο αριθμός των στηλών στο πλαίσιο δεδομένων, χρησιμοποιούμε 2 στήλες, οπότε το ελάχ. Οι βαθμοί θα πρέπει να είναι είτε 2+1, δηλαδή 3, είτε υψηλότεροι. Για αυτό το παράδειγμα, ας χρησιμοποιήσουμε 5 λεπτά. σημεία.

$$
κείμενο{5 (ελάχ. βαθμοί)} >= κείμενο{2 (διαστάσεις δεδομένων)} + 1
$$

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Τώρα, για να επιλέξετε την τιμή για το ε υπάρχει μια μέθοδος στην οποία α Κοντινότεροι γείτονες Ο αλγόριθμος χρησιμοποιείται για να βρει τις αποστάσεις ενός προκαθορισμένου αριθμού πλησιέστερων σημείων για κάθε σημείο. Αυτός ο προκαθορισμένος αριθμός γειτόνων είναι το ελάχιστο. σημεία που μόλις επιλέξαμε μείον 1. Έτσι, στην περίπτωσή μας, ο αλγόριθμος θα βρει τα 5-1, ή 4 πλησιέστερα σημεία για κάθε σημείο των δεδομένων μας. αυτά είναι τα κ-γείτονες και το κομμάτι k ισούται με 4.

$$
text{k-neighbors} = κείμενο{ελάχ. βαθμοί} – 1
$$

Αφού βρούμε τους γείτονες, θα διατάξουμε τις αποστάσεις τους από το μεγαλύτερο στο μικρότερο και θα σχεδιάσουμε τις αποστάσεις του άξονα y και των σημείων στον άξονα x. Κοιτάζοντας την γραφική παράσταση, θα βρούμε πού μοιάζει με την κάμψη ενός αγκώνα και το σημείο του άξονα y που περιγράφει ότι ο αγκώνας κάμπτεται είναι η προτεινόμενη τιμή ε.

Note: είναι πιθανό το γράφημα για την εύρεση της τιμής ε να έχει είτε μία είτε περισσότερες «λυγίσεις αγκώνα», είτε μεγάλες είτε μικρές, όταν συμβεί αυτό, μπορείτε να βρείτε τις τιμές, να τις δοκιμάσετε και να επιλέξετε αυτές με αποτελέσματα που περιγράφουν καλύτερα τις συστάδες, είτε εξετάζοντας τις μετρήσεις των οικόπεδων.

Για να εκτελέσουμε αυτά τα βήματα, μπορούμε να εισαγάγουμε τον αλγόριθμο, να τον προσαρμόσουμε στα δεδομένα και, στη συνέχεια, μπορούμε να εξαγάγουμε τις αποστάσεις και τους δείκτες κάθε σημείου με 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 Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Παρατηρήστε ότι όταν σχεδιάζουμε τη γραμμή, θα μάθουμε την τιμή ε, σε αυτήν την περίπτωση, είναι 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 συστάδες, με πολλά σημεία θορύβου. Ας το οραματιστούμε αυτό σχεδιάζοντας το με το seaborn's 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 Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Κοιτάζοντας την πλοκή, μπορούμε να δούμε ότι το DBSCAN έχει καταγράψει τα σημεία που ήταν πιο πυκνά συνδεδεμένα και τα σημεία που θα μπορούσαν να θεωρηθούν μέρος του ίδιου συμπλέγματος ήταν είτε θόρυβος είτε θεωρήθηκαν ότι σχηματίζουν ένα άλλο μικρότερο σύμπλεγμα.

DBSCAN με Scikit-Learn στο Python PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Εάν επισημάνουμε τα συμπλέγματα, παρατηρήστε πώς το DBSCAN παίρνει το σύμπλεγμα 1 πλήρως, το οποίο είναι το σύμπλεγμα με λιγότερο χώρο μεταξύ των σημείων. Στη συνέχεια, λαμβάνει τα μέρη των συστάδων 0 και 3 όπου τα σημεία είναι στενά μεταξύ τους, θεωρώντας περισσότερα απέχοντα σημεία ως θόρυβο. Θεωρεί επίσης τα σημεία στο κάτω αριστερό μισό ως θόρυβο και χωρίζει τα σημεία κάτω δεξιά σε 3 συστάδες, καταγράφοντας για άλλη μια φορά τα συμπλέγματα 4, 2 και 5 όπου τα σημεία είναι πιο κοντά μεταξύ τους.

Μπορούμε να αρχίσουμε να καταλήγουμε στο συμπέρασμα ότι το DBSCAN ήταν εξαιρετικό για την καταγραφή των πυκνών περιοχών των συστάδων, αλλά όχι τόσο για τον προσδιορισμό του μεγαλύτερου σχήματος των δεδομένων, των οριοθετήσεων των 5 συστάδων. Θα ήταν ενδιαφέρον να δοκιμάσουμε περισσότερους αλγόριθμους ομαδοποίησης με τα δεδομένα μας. Ας δούμε αν μια μέτρηση θα επιβεβαιώσει αυτή την υπόθεση.

Αξιολόγηση του Αλγορίθμου

Για να αξιολογήσουμε το 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 μπορούν συνήθως να αποδίδουν καλύτερα όταν υπάρχουν συστάδες με ποικίλες πυκνότητες στα δεδομένα και είναι επίσης λιγότερο ευαίσθητα στην επιλογή ή στην αρχική ελάχιστη. σημεία και ε παραμέτρους.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse