Οριστικός οδηγός για την ιεραρχική ομαδοποίηση με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Οριστικός οδηγός για την ιεραρχική ομαδοποίηση με Python και Scikit-Learn

Εισαγωγή

Σε αυτόν τον οδηγό, θα επικεντρωθούμε στην εφαρμογή του Αλγόριθμος Ιεραρχικής Ομαδοποίησης με Scikit-Learn για την επίλυση ενός προβλήματος μάρκετινγκ.

Αφού διαβάσετε τον οδηγό, θα καταλάβετε:

  • Πότε να εφαρμόσετε την Ιεραρχική Ομαδοποίηση
  • Πώς να απεικονίσετε το σύνολο δεδομένων για να καταλάβετε εάν είναι κατάλληλο για ομαδοποίηση
  • Πώς να προεπεξεργάζεστε χαρακτηριστικά και να σχεδιάσετε νέες δυνατότητες με βάση το σύνολο δεδομένων
  • Πώς να μειώσετε τη διάσταση του συνόλου δεδομένων χρησιμοποιώντας PCA
  • Πώς να χρησιμοποιήσετε και να διαβάσετε ένα δενδρογράφημα σε ξεχωριστές ομάδες
  • Ποιες είναι οι διαφορετικές μέθοδοι σύνδεσης και μετρήσεις απόστασης που εφαρμόζονται σε δενδρογράμματα και αλγόριθμους ομαδοποίησης
  • Ποιες είναι οι αθροιστικές και διαιρετικές στρατηγικές ομαδοποίησης και πώς λειτουργούν
  • Πώς να εφαρμόσετε τη Συσσωρευτική Ιεραρχική Ομαδοποίηση με το Scikit-Learn
  • Ποια είναι τα πιο συχνά προβλήματα κατά την αντιμετώπιση αλγορίθμων ομαδοποίησης και πώς να τα επιλύσετε

Σημείωση: Μπορείτε να κάνετε λήψη του σημειωματάριου που περιέχει όλο τον κώδικα σε αυτόν τον οδηγό εδώ.

Κινητοποίηση

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

Υπάρχει κάποιος τρόπος με τον οποίο θα μπορούσατε να προσδιορίσετε ποιοι πελάτες είναι παρόμοιοι; Πόσοι από αυτούς ανήκουν στην ίδια ομάδα; Και πόσες διαφορετικές ομάδες υπάρχουν;

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

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

Δεδομένου ότι τα δεδομένα μας είναι μικρά και η επεξήγηση είναι ένας σημαντικός παράγοντας, μπορούμε να αξιοποιήσουμε Ιεραρχική ομαδοποίηση να λύσει αυτό το πρόβλημα. Αυτή η διαδικασία είναι επίσης γνωστή ως Ανάλυση ιεραρχικής ομαδοποίησης (HCA).

Ένα από τα πλεονεκτήματα του HCA είναι ότι είναι ερμηνεύσιμο και λειτουργεί καλά σε μικρά σύνολα δεδομένων.

Ένα άλλο πράγμα που πρέπει να ληφθεί υπόψη σε αυτό το σενάριο είναι ότι το HCA είναι ένα χωρίς επίβλεψη αλγόριθμος. Κατά την ομαδοποίηση δεδομένων, δεν θα έχουμε τρόπο να επαληθεύσουμε ότι προσδιορίζουμε σωστά ότι ένας χρήστης ανήκει σε μια συγκεκριμένη ομάδα (δεν γνωρίζουμε τις ομάδες). Δεν υπάρχουν ετικέτες με τις οποίες μπορούμε να συγκρίνουμε τα αποτελέσματά μας. Εάν προσδιορίσαμε σωστά τις ομάδες, θα επιβεβαιωθεί αργότερα από το τμήμα μάρκετινγκ σε καθημερινή βάση (όπως μετράται με μετρήσεις όπως η απόδοση επένδυσης (ROI), τα ποσοστά μετατροπής κ.λπ.).

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

Σύντομη Διερευνητική Ανάλυση Δεδομένων

Σημείωση: Μπορείτε να κάνετε λήψη του συνόλου δεδομένων που χρησιμοποιείται σε αυτόν τον οδηγό εδώ.

Μετά τη λήψη του συνόλου δεδομένων, παρατηρήστε ότι είναι α CSV (τιμές διαχωρισμένες με κόμμα) αρχείο που ονομάζεται shopping-data.csv. Για να διευκολυνθεί η εξερεύνηση και ο χειρισμός των δεδομένων, θα τα φορτώσουμε σε ένα DataFrame χρησιμοποιώντας Pandas:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

Η Marketing είπε ότι είχε συγκεντρώσει 200 ​​αρχεία πελατών. Μπορούμε να ελέγξουμε εάν τα δεδομένα λήψης είναι πλήρη με 200 σειρές χρησιμοποιώντας το shape Χαρακτηριστικό. Θα μας πει πόσες σειρές και στήλες έχουμε, αντίστοιχα:

customer_data.shape

Αυτο εχει ως αποτελεσμα:

(200, 5)

Μεγάλος! Τα δεδομένα μας είναι πλήρη με 200 σειρές (αρχεία πελατών) και έχουμε επίσης 5 στήλες (χαρακτηριστικά). Για να δούμε ποια χαρακτηριστικά έχει συλλέξει το τμήμα μάρκετινγκ από πελάτες, μπορούμε να δούμε ονόματα στηλών με το columns Χαρακτηριστικό. Για να το κάνετε αυτό, εκτελέστε:

customer_data.columns

Το παραπάνω σενάριο επιστρέφει:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

Εδώ, βλέπουμε ότι το μάρκετινγκ έχει δημιουργήσει α CustomerID, συγκέντρωσε το Genre, Age, Annual Income (σε χιλιάδες δολάρια) και α Spending Score από 1 έως 100 για καθέναν από τους 200 πελάτες. Όταν τους ζητήθηκε διευκρίνιση, είπαν ότι οι αξίες στο Spending Score η στήλη υποδηλώνει πόσο συχνά ένα άτομο ξοδεύει χρήματα σε ένα εμπορικό κέντρο σε κλίμακα από το 1 έως το 100. Με άλλα λόγια, εάν ένας πελάτης έχει βαθμολογία 0, αυτό το άτομο δεν ξοδεύει ποτέ χρήματα και εάν η βαθμολογία είναι 100, μόλις εντοπίσαμε το που ξοδεύει περισσότερο.

Ας ρίξουμε μια γρήγορη ματιά στη διανομή αυτής της βαθμολογίας για να ελέγξουμε τις συνήθειες δαπανών των χρηστών στο σύνολο δεδομένων μας. Εκεί είναι τα Πάντα hist() η μέθοδος έρχεται να βοηθήσει:

customer_data['Spending Score (1-100)'].hist()

img

Βλέποντας το ιστόγραμμα βλέπουμε ότι περισσότεροι από 35 πελάτες έχουν σκορ μεταξύ τους 40 και 60, τότε λιγότερο από 25 έχουν σκορ μεταξύ τους 70 και 80. Έτσι οι περισσότεροι πελάτες μας είναι ισοσκελισμένοι ξοδευτές, ακολουθούμενο από μέτριους έως υψηλούς ξοδευτές. Μπορούμε επίσης να δούμε ότι υπάρχει μια γραμμή μετά 0, στα αριστερά της κατανομής και μια άλλη γραμμή πριν από το 100, στα δεξιά της διανομής. Αυτά τα κενά κενά σημαίνουν πιθανώς ότι η διανομή δεν περιέχει μη δαπανητές, οι οποίοι θα είχαν βαθμολογία 0, και ότι επίσης δεν υπάρχουν υψηλά δαπανητήρια με βαθμολογία 100.

Για να επαληθεύσουμε αν αυτό είναι αλήθεια, μπορούμε να δούμε τις ελάχιστες και μέγιστες τιμές της κατανομής. Αυτές οι τιμές μπορούν εύκολα να βρεθούν ως μέρος των περιγραφικών στατιστικών, επομένως μπορούμε να χρησιμοποιήσουμε το describe() μέθοδος για να κατανοήσετε άλλες κατανομές αριθμητικών τιμών:


customer_data.describe().transpose()

Αυτό θα μας δώσει έναν πίνακα από τον οποίο μπορούμε να διαβάσουμε κατανομές άλλων τιμών του συνόλου δεδομένων μας:

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

Η υπόθεσή μας επιβεβαιώνεται. ο min τιμή του Spending Score is 1 και το μέγιστο είναι 99. Άρα δεν έχουμε 0 or 100 σκοράρει τους ξοδευτές. Ας ρίξουμε στη συνέχεια μια ματιά στις άλλες στήλες του μεταφερόμενου describe τραπέζι. Όταν κοιτάζετε το mean και std στήλες, μπορούμε να δούμε ότι για Age ο mean is 38.85 και την std είναι περίπου 13.97. Το ίδιο συμβαίνει και για Annual Income, Με mean of 60.56 και std 26.26, Και για Spending Score με mean of 50 και std of 25.82. Για όλα τα χαρακτηριστικά, το mean απέχει πολύ από την τυπική απόκλιση, η οποία υποδεικνύει Τα δεδομένα μας έχουν μεγάλη μεταβλητότητα.

Για να κατανοήσουμε καλύτερα πώς ποικίλλουν τα δεδομένα μας, ας σχεδιάσουμε το Annual Income κατανομή:

customer_data['Annual Income (k$)'].hist()

Που θα μας δώσει:

img

Παρατηρήστε στο ιστόγραμμα ότι τα περισσότερα από τα δεδομένα μας, περισσότεροι από 35 πελάτες, συγκεντρώνονται κοντά στον αριθμό 60, στο δικό μας mean, στον οριζόντιο άξονα. Τι συμβαίνει όμως καθώς προχωράμε προς τα άκρα της διανομής; Όταν πηγαίνουμε προς τα αριστερά, από τη μέση τιμή των 60.560 $, η επόμενη τιμή που θα συναντήσουμε είναι 34.300 $ – η μέση τιμή (60.560 $) μείον την τυπική διακύμανση (26.260 $). Αν πάμε πιο μακριά στα αριστερά της διανομής δεδομένων μας, ισχύει ένας παρόμοιος κανόνας, αφαιρούμε την τυπική παραλλαγή (26.260 $) από την τρέχουσα τιμή (34.300 $). Επομένως, θα συναντήσουμε μια τιμή 8.040 $. Παρατηρήστε πώς τα δεδομένα μας έγιναν γρήγορα από 60 $ σε 8 $. «Πηδά» 26.260 $ κάθε φορά – ποικίλλει πολύ, και γι’ αυτό έχουμε τόσο μεγάλη μεταβλητότητα.

img

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

Μέχρι στιγμής, έχουμε δει το σχήμα των δεδομένων μας, ορισμένες από τις διανομές τους και περιγραφικά στατιστικά στοιχεία. Με τα Panda, μπορούμε επίσης να απαριθμήσουμε τους τύπους δεδομένων μας και να δούμε εάν και οι 200 ​​σειρές μας είναι γεμάτες ή έχουν κάποιες null αξίες:

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

Εδώ, μπορούμε να δούμε ότι δεν υπάρχουν null τιμές στα δεδομένα και ότι έχουμε μόνο μία κατηγορική στήλη – Genre. Σε αυτό το στάδιο, είναι σημαντικό να έχουμε κατά νου ποια χαρακτηριστικά φαίνονται ενδιαφέροντα να προστεθούν στο μοντέλο ομαδοποίησης. Αν θέλουμε να προσθέσουμε τη στήλη Genre στο μοντέλο μας, θα χρειαστεί να μετατρέψουμε τις τιμές της από κατηγορηματικός προς την αριθμητικός.

Ας δούμε πώς Genre συμπληρώνεται ρίχνοντας μια γρήγορη ματιά στις πρώτες 5 τιμές των δεδομένων μας:

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

Φαίνεται ότι έχει μόνο Female και Male κατηγορίες. Μπορούμε να είμαστε σίγουροι για αυτό ρίχνοντας μια ματιά στις μοναδικές αξίες του με unique:

customer_data['Genre'].unique()

Αυτό επιβεβαιώνει την υπόθεσή μας:

array(['Male', 'Female'], dtype=object)

Μέχρι στιγμής, γνωρίζουμε ότι έχουμε μόνο δύο είδη, αν σκοπεύουμε να χρησιμοποιήσουμε αυτή τη δυνατότητα στο μοντέλο μας, Male θα μπορούσε να μετατραπεί σε 0 και Female προς την 1. Είναι επίσης σημαντικό να ελέγξετε την αναλογία μεταξύ των ειδών, για να δείτε εάν είναι ισορροπημένα. Μπορούμε να το κάνουμε με το value_counts() μέθοδος και το επιχείρημά της normalize=True για να εμφανιστεί το ποσοστό μεταξύ Male και Female:

customer_data['Genre'].value_counts(normalize=True)

Αυτό βγάζει:

Female    0.56
Male      0.44
Name: Genre, dtype: float64

Έχουμε το 56% των γυναικών στο σύνολο δεδομένων και το 44% των ανδρών. Η διαφορά μεταξύ τους είναι μόνο 16%, και τα δεδομένα μας δεν είναι 50/50 αλλά είναι αρκετά ισορροπημένο να μην προκαλέσει κανένα πρόβλημα. Εάν τα αποτελέσματα ήταν 70/30, 60/40, τότε ίσως χρειαζόταν είτε για τη συλλογή περισσότερων δεδομένων είτε για την χρησιμοποίηση κάποιου είδους τεχνικής αύξησης δεδομένων για να γίνει αυτή η αναλογία πιο ισορροπημένη.

Μέχρι τώρα, όλα τα χαρακτηριστικά αλλά Age, έχουν διερευνηθεί εν συντομία. Σε ό,τι αφορά Age, είναι συνήθως ενδιαφέρον να το χωρίσουμε σε κάδους για να μπορέσουμε να τμηματοποιήσουμε τους πελάτες με βάση τις ηλικιακές τους ομάδες. Εάν το κάνουμε αυτό, θα πρέπει να μετατρέψουμε τις ηλικιακές κατηγορίες σε έναν αριθμό πριν τις προσθέσουμε στο μοντέλο μας. Με αυτόν τον τρόπο, αντί να χρησιμοποιούμε την κατηγορία 15-20 ετών, θα μετρούσαμε πόσοι πελάτες υπάρχουν στο 15-20 κατηγορία, και αυτός θα ήταν ένας αριθμός σε μια νέα στήλη που ονομάζεται 15-20.

Συμβουλές: Σε αυτόν τον οδηγό, παρουσιάζουμε μόνο σύντομη διερευνητική ανάλυση δεδομένων. Αλλά μπορείς να πας παραπέρα και πρέπει να πας παραπέρα. Μπορείτε να δείτε αν υπάρχουν διαφορές εισοδήματος και διαφορές βαθμολόγησης με βάση το είδος και την ηλικία. Αυτό όχι μόνο εμπλουτίζει την ανάλυση αλλά οδηγεί σε καλύτερα αποτελέσματα του μοντέλου. Για να εμβαθύνετε στην Διερευνητική Ανάλυση Δεδομένων, ανατρέξτε στο Κεφάλαιο EDA στο «Πρόβλεψη τιμής σπιτιού – Μηχανική μάθηση σε Python" Καθοδηγούμενο Έργο.

Μετά από εικασίες σχετικά με το τι θα μπορούσε να γίνει και με το κατηγορηματικό – ή το κατηγορηματικό να είναι – Genre και Age στήλες, ας εφαρμόσουμε αυτά που συζητήθηκαν.

Κωδικοποίηση μεταβλητών και μηχανική χαρακτηριστικών

Ας ξεκινήσουμε διαιρώντας τα Age σε ομάδες που ποικίλλουν σε 10, ώστε να έχουμε 20-30, 30-40, 40-50 κ.ο.κ. Δεδομένου ότι ο νεότερος πελάτης μας είναι 15 ετών, μπορούμε να ξεκινήσουμε στα 15 και να τελειώσουμε στα 70, που είναι η ηλικία του γηραιότερου πελάτη στα δεδομένα. Ξεκινώντας από το 15 και τελειώνοντας στο 70, θα είχαμε διαστήματα 15-20, 20-30, 30-40, 40-50, 50-60 και 60-70.

Για ομαδοποίηση ή bin Age τιμές σε αυτά τα διαστήματα, μπορούμε να χρησιμοποιήσουμε τα Pandas cut() μέθοδο για να τα κόψετε σε κάδους και στη συνέχεια να αντιστοιχίσετε τους κάδους σε ένα νέο Age Groups στήλη:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

Αυτο εχει ως αποτελεσμα:

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

Παρατηρήστε ότι όταν εξετάζετε τις τιμές των στηλών, υπάρχει επίσης μια γραμμή που προσδιορίζει ότι έχουμε 6 κατηγορίες και εμφανίζει όλα τα δεσμευμένα διαστήματα δεδομένων. Με αυτόν τον τρόπο, έχουμε κατηγοριοποιήσει τα προηγούμενα αριθμητικά δεδομένα μας και δημιουργήσαμε ένα νέο Age Groups χαρακτηριστικό.

Και πόσους πελάτες έχουμε σε κάθε κατηγορία; Μπορούμε να το γνωρίζουμε γρήγορα ομαδοποιώντας τη στήλη και μετρώντας τις τιμές με groupby() και count():

customer_data.groupby('Age Groups')['Age Groups'].count()

Αυτο εχει ως αποτελεσμα:

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

Είναι εύκολο να εντοπιστεί ότι οι περισσότεροι πελάτες είναι μεταξύ 30 και 40 ετών, ακολουθούμενοι από πελάτες μεταξύ 20 και 30 και μετά πελάτες μεταξύ 40 και 50. Αυτή είναι επίσης καλή πληροφορία για το τμήμα μάρκετινγκ.

Αυτή τη στιγμή, έχουμε δύο κατηγορικές μεταβλητές, Age και Genre, που πρέπει να μετατρέψουμε σε αριθμούς για να μπορέσουμε να χρησιμοποιήσουμε στο μοντέλο μας. Υπάρχουν πολλοί διαφορετικοί τρόποι για να κάνετε αυτόν τον μετασχηματισμό – θα χρησιμοποιήσουμε τα Panda get_dummies() μέθοδος που δημιουργεί μια νέα στήλη για κάθε διάστημα και είδος και στη συνέχεια γεμίζει τις τιμές του με 0 και 1 - αυτό το είδος λειτουργίας ονομάζεται κωδικοποίηση εν θερμώ. Ας δούμε πώς φαίνεται:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

Αυτό θα μας δώσει μια προεπισκόπηση του πίνακα που προκύπτει:

img

Με την έξοδο, είναι εύκολο να δει κανείς ότι η στήλη Genre χωρίστηκε σε στήλες - Genre_Female και Genre_Male. Όταν ο πελάτης είναι γυναίκα, Genre_Female είναι ίσο με 1, και όταν ο πελάτης είναι άνδρας, ισούται 0.

Επίσης, η Age Groups στήλη χωρίστηκε σε 6 στήλες, μία για κάθε διάστημα, όπως π.χ Age Groups_(15, 20], Age Groups_(20, 30], και ούτω καθεξής. Με τον ίδιο τρόπο όπως Genre, όταν ο πελάτης είναι 18 ετών, το Age Groups_(15, 20] η τιμή είναι 1 και η τιμή όλων των άλλων στηλών είναι 0.

Η πλεονέκτημα της one-hot κωδικοποίησης είναι η απλότητα στην αναπαράσταση των τιμών της στήλης, είναι εύκολο να κατανοήσουμε τι συμβαίνει – ενώ το μειονέκτημα είναι ότι τώρα έχουμε δημιουργήσει 8 επιπλέον στήλες, για να συνοψίσουμε με τις στήλες που είχαμε ήδη.

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

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

Για τις ανάγκες μας για ομαδοποίηση, η κωδικοποίηση one-hot φαίνεται να λειτουργεί. Μπορούμε όμως να σχεδιάσουμε τα δεδομένα για να δούμε αν υπάρχουν πραγματικά ξεχωριστές ομάδες για να ομαδοποιήσουμε.

Βασική σχεδίαση και μείωση διαστάσεων

Το σύνολο δεδομένων μας έχει 11 στήλες και υπάρχουν ορισμένοι τρόποι με τους οποίους μπορούμε να οπτικοποιήσουμε αυτά τα δεδομένα. Το πρώτο είναι σχεδιάζοντάς το σε 10 διαστάσεις (καλή τύχη με αυτό). Δέκα γιατί το Customer_ID στήλη δεν λαμβάνεται υπόψη. Το δεύτερο είναι με τη σχεδίαση των αρχικών αριθμητικών μας χαρακτηριστικών και το τρίτο είναι μετατρέποντας τα 10 χαρακτηριστικά μας σε 2 – επομένως, εκτελώντας μείωση διαστάσεων.

Σχεδίαση κάθε ζεύγους δεδομένων

Δεδομένου ότι η γραφική παράσταση 10 διαστάσεων είναι λίγο αδύνατη, θα επιλέξουμε να ακολουθήσουμε τη δεύτερη προσέγγιση – θα σχεδιάσουμε τα αρχικά μας χαρακτηριστικά. Μπορούμε να επιλέξουμε δύο από αυτά για την ανάλυση ομαδοποίησης. Ένας τρόπος με τον οποίο μπορούμε να δούμε όλα τα ζεύγη δεδομένων μας συνδυασμένα είναι με ένα Seaborn pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

Το οποίο εμφανίζει:

img

Με μια ματιά, μπορούμε να εντοπίσουμε τα scatterplots που φαίνεται να έχουν ομάδες δεδομένων. Ένα που φαίνεται ενδιαφέρον είναι το scatterplot που συνδυάζει Annual Income και Spending Score. Παρατηρήστε ότι δεν υπάρχει σαφής διαχωρισμός μεταξύ άλλων γραφικών διασποράς μεταβλητών. Το πολύ, μπορούμε ίσως να πούμε ότι υπάρχουν δύο διακριτές συγκεντρώσεις σημείων στο Spending Score vs Age διάγραμμα διασποράς.

Και τα δύο scatterplots αποτελούνται από Annual Income και Spending Score είναι ουσιαστικά τα ίδια. Μπορούμε να το δούμε δύο φορές επειδή ο άξονας x και y ανταλλάχθηκαν. Ρίχνοντας μια ματιά σε οποιαδήποτε από αυτές, μπορούμε να δούμε τι φαίνεται να είναι πέντε διαφορετικές ομάδες. Ας σχεδιάσουμε μόνο αυτά τα δύο χαρακτηριστικά με ένα Seaborn scatterplot() για να ρίξουμε μια πιο προσεκτική ματιά:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

img

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

img

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

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

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

Σχεδίαση δεδομένων μετά τη χρήση PCA

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

Σημείωση: Οι περισσότεροι άνθρωποι χρησιμοποιούν PCA για μείωση διαστάσεων πριν από την οπτικοποίηση. Υπάρχουν άλλες μέθοδοι που βοηθούν στην οπτικοποίηση δεδομένων πριν από την ομαδοποίηση, όπως π.χ Χωρική ομαδοποίηση εφαρμογών με θόρυβο βάσει πυκνότητας (DBSCAN) και Αυτοοργάνωση Χαρτών (SOM) ομαδοποίηση. Και οι δύο είναι αλγόριθμοι ομαδοποίησης, αλλά μπορούν επίσης να χρησιμοποιηθούν για οπτικοποίηση δεδομένων. Δεδομένου ότι η ανάλυση ομαδοποίησης δεν έχει χρυσό πρότυπο, είναι σημαντικό να συγκρίνουμε διαφορετικές οπτικοποιήσεις και διαφορετικούς αλγόριθμους.

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

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

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

Note: Το PCA είναι ένας γραμμικός μετασχηματισμός και η γραμμικότητα είναι ευαίσθητη στην κλίμακα των δεδομένων. Επομένως, το PCA λειτουργεί καλύτερα όταν όλες οι τιμές δεδομένων είναι στην ίδια κλίμακα. Αυτό μπορεί να γίνει αφαιρώντας τη στήλη εννοώ από τις τιμές του και διαιρώντας το αποτέλεσμα με την τυπική του απόκλιση. Που ονομάζεται τυποποίηση δεδομένων. Πριν χρησιμοποιήσετε το PCA, βεβαιωθείτε ότι τα δεδομένα είναι κλιμακωμένα! Εάν δεν είστε σίγουροι πώς, διαβάστε μας “Feature Scaling Data with Scikit-Learn for Machine Learning in Python”!

Με την καλύτερη γραμμή (γραμμικός συνδυασμός) που βρέθηκε, το PCA παίρνει τις κατευθύνσεις των αξόνων του, που ονομάζονται ιδιοδιανύσματα, και τους γραμμικούς συντελεστές του, το ιδιοτιμές. Ο συνδυασμός των ιδιοδιανυσμάτων και των ιδιοτιμών – ή των κατευθύνσεων και των συντελεστών των αξόνων – είναι Κύρια εξαρτήματα της PCA. Και τότε μπορούμε να επιλέξουμε τον αριθμό των διαστάσεων μας με βάση την επεξηγημένη διακύμανση κάθε χαρακτηριστικού, κατανοώντας ποια κύρια στοιχεία θέλουμε να διατηρήσουμε ή να απορρίψουμε με βάση το πόση διακύμανση εξηγούν.

Μετά την απόκτηση των κύριων στοιχείων, το PCA χρησιμοποιεί τα ιδιοδιανύσματα για να σχηματίσει ένα διάνυσμα χαρακτηριστικών που επαναπροσανατολίζουν τα δεδομένα από τους αρχικούς άξονες σε αυτούς που αντιπροσωπεύονται από τα κύρια στοιχεία – έτσι μειώνονται οι διαστάσεις των δεδομένων.

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

Πριν εφαρμόσουμε PCA, πρέπει να επιλέξουμε μεταξύ των Age στήλη ή το Age Groups στήλες στα προηγουμένως κωδικοποιημένα δεδομένα μας. Δεδομένου ότι και οι δύο στήλες αντιπροσωπεύουν τις ίδιες πληροφορίες, η εισαγωγή τους δύο φορές επηρεάζει τη διακύμανση των δεδομένων μας. Αν το Age Groups επιλέγεται η στήλη, απλώς αφαιρέστε το Age στήλη χρησιμοποιώντας τα Pandas drop() μέθοδο και την εκ νέου αντιστοίχιση στο customer_data_oh μεταβλητή:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

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

Ας το κάνουμε αυτό με το Scikit-Learn PCA. Θα υπολογίσουμε την επεξηγημένη διακύμανση κάθε διάστασης, που δίνεται από explained_variance_ratio_ , και μετά κοιτάξτε το σωρευτικό άθροισμά τους με cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

Οι σωρευτικές εξηγούμενες διακυμάνσεις μας είναι:

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

Μπορούμε να δούμε ότι η πρώτη διάσταση εξηγεί το 50% των δεδομένων και όταν συνδυάζονται με τη δεύτερη διάσταση, εξηγούν το 99% τοις εκατό. Αυτό σημαίνει ότι οι πρώτες 2 διαστάσεις εξηγούν ήδη το 99% των δεδομένων μας. Έτσι μπορούμε να εφαρμόσουμε ένα PCA με 2 στοιχεία, να λάβουμε τα κύρια συστατικά μας και να τα σχεδιάσουμε:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

img

Η γραφική παράσταση δεδομένων μετά το PCA είναι πολύ παρόμοια με την γραφική παράσταση που χρησιμοποιεί μόνο δύο στήλες των δεδομένων χωρίς PCA. Παρατηρήστε ότι τα σημεία που σχηματίζουν ομάδες είναι πιο κοντά και λίγο πιο συγκεντρωμένα μετά το PCA από πριν.

img

Οπτικοποίηση Ιεραρχικής Δομής με Δενδρογράμματα

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

Η δενδρογράφημα είναι αποτέλεσμα της σύνδεσης σημείων σε ένα σύνολο δεδομένων. Είναι μια οπτική αναπαράσταση της ιεραρχικής διαδικασίας ομαδοποίησης. Και πώς λειτουργεί η ιεραρχική διαδικασία ομαδοποίησης; Λοιπόν… εξαρτάται – πιθανώς μια απάντηση που έχετε ήδη ακούσει πολλά στο Data Science.

Κατανόηση της Ιεραρχικής Ομαδοποίησης

Όταν ο Αλγόριθμος Ιεραρχικής Ομαδοποίησης (HCA) αρχίζει να συνδέει τα σημεία και να βρίσκει συμπλέγματα, μπορεί πρώτα να χωρίσει τα σημεία σε 2 μεγάλες ομάδες και στη συνέχεια να χωρίσει κάθε μία από αυτές τις δύο ομάδες σε μικρότερες 2 ομάδες, έχοντας 4 ομάδες συνολικά, που είναι η διαιρετικός και από πάνω προς τα κάτω πλησιάζω.

Εναλλακτικά, μπορεί να κάνει το αντίθετο – μπορεί να κοιτάξει όλα τα σημεία δεδομένων, να βρει 2 σημεία που είναι πιο κοντά το ένα στο άλλο, να τα συνδέσει και στη συνέχεια να βρει άλλα σημεία που είναι τα πλησιέστερα σε αυτά τα συνδεδεμένα σημεία και να συνεχίσει να δημιουργεί τις 2 ομάδες από το (bottom - up). Ποιο είναι το συσσωματωτικό προσέγγιση που θα αναπτύξουμε.

Βήματα για την πραγματοποίηση συγκεντρωτικής ιεραρχικής ομαδοποίησης

Για να γίνει ακόμη σαφής η συγκεντρωτική προσέγγιση, υπάρχουν βήματα του Συσσωρευτική Ιεραρχική Ομαδοποίηση (AHC) αλγόριθμος:

  1. Στην αρχή, αντιμετωπίστε κάθε σημείο δεδομένων ως ένα σύμπλεγμα. Επομένως, ο αριθμός των συμπλεγμάτων στην αρχή θα είναι K – ενώ το K είναι ένας ακέραιος αριθμός που αντιπροσωπεύει τον αριθμό των σημείων δεδομένων.
  2. Σχηματίστε ένα σύμπλεγμα ενώνοντας τα δύο πλησιέστερα σημεία δεδομένων με αποτέλεσμα τα συμπλέγματα K-1.
  3. Σχηματίστε περισσότερα συμπλέγματα ενώνοντας τα δύο πιο κοντινά συμπλέγματα με αποτέλεσμα τα συμπλέγματα K-2.
  4. Επαναλάβετε τα παραπάνω τρία βήματα μέχρι να σχηματιστεί ένα μεγάλο σύμπλεγμα.

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

Αν αντιστρέψετε τα βήματα του αλγορίθμου ACH, πηγαίνοντας από το 4 στο 1 – αυτά θα ήταν τα βήματα προς *Διαιρετική Ιεραρχική Ομαδοποίηση (DHC)*.

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

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

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

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

Η έξοδος του σεναρίου μοιάζει με αυτό:

img

Στο παραπάνω σενάριο, δημιουργήσαμε τα συμπλέγματα και τα υποσυστήματα με τα σημεία μας, ορίσαμε πώς θα συνδεθούν τα σημεία μας (εφαρμόζοντας το ward μέθοδος), και πώς να μετρήσετε την απόσταση μεταξύ των σημείων (χρησιμοποιώντας το euclidean μετρικός).

Με την γραφική παράσταση του δενδρογράμματος, οι περιγραφόμενες διεργασίες των DHC και AHC μπορούν να απεικονιστούν. Για να οπτικοποιήσετε την προσέγγιση από πάνω προς τα κάτω, ξεκινήστε από την κορυφή του δενδρογράμματος και κατεβείτε, και κάντε το αντίθετο, ξεκινώντας από κάτω και κινούμενοι προς τα πάνω για να οπτικοποιήσετε την προσέγγιση από κάτω προς τα πάνω.

Μέθοδοι Σύνδεσης

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

Μερικές από τις μεθόδους σύνδεσης είναι:

  • Ενιαία σύνδεση: αναφέρεται επίσης ως Πλησιέστερος γείτονας (NN). Η απόσταση μεταξύ των συστάδων ορίζεται από την απόσταση μεταξύ των πλησιέστερων μελών τους.

img

  • Πλήρης σύνδεση: αναφέρεται επίσης ως Furthest Neighbor (FN), Αλγόριθμος απώτατων σημείων, ή Αλγόριθμος Voor Hees. Η απόσταση μεταξύ των συστάδων ορίζεται από την απόσταση μεταξύ των πιο απομακρυσμένων μελών τους. Αυτή η μέθοδος είναι υπολογιστικά ακριβή.

img

  • Μέση σύνδεση: γνωστός και ως UPGMA (Μέθοδος ομάδας μη σταθμισμένου ζεύγους με αριθμητικό μέσο όρο). Το ποσοστό του αριθμού των σημείων κάθε συστάδας υπολογίζεται σε σχέση με τον αριθμό των σημείων των δύο συστάδων εάν συγχωνεύονταν.

img

  • Ζυγισμένη σύνδεση: γνωστός και ως WPGMA (Μέθοδος ομάδας σταθμισμένου ζεύγους με αριθμητικό μέσο όρο). Τα επιμέρους σημεία των δύο συστάδων συμβάλλουν στη συνολική απόσταση μεταξύ ενός μικρότερου και ενός μεγαλύτερου συμπλέγματος.
  • Centroid σύνδεση: αναφέρεται επίσης ως UPGMC (Μέθοδος ομάδας μη σταθμισμένου ζεύγους με χρήση Centroids). Ένα σημείο που ορίζεται από τον μέσο όρο όλων των σημείων (κεντροειδές) υπολογίζεται για κάθε συστάδα και η απόσταση μεταξύ των συστάδων είναι η απόσταση μεταξύ των αντίστοιχων κεντροειδών τους.

img

  • Σύνδεση θαλάμου: Γνωστός και ως MISSQ (Ελάχιστη αύξηση του αθροίσματος των τετραγώνων). Καθορίζει την απόσταση μεταξύ δύο συστάδων, υπολογίζει το άθροισμα των τετραγώνων σφάλματος (ESS) και επιλέγει διαδοχικά τα επόμενα συμπλέγματα με βάση το μικρότερο ESS. Η Μέθοδος Ward επιδιώκει να ελαχιστοποιήσει την αύξηση του ESS σε κάθε βήμα. Επομένως, ελαχιστοποίηση του σφάλματος.

img

Μετρήσεις απόστασης

Εκτός από τη σύνδεση, μπορούμε επίσης να καθορίσουμε μερικές από τις πιο χρησιμοποιούμενες μετρήσεις απόστασης:

  • Ευκλείδειος: αναφέρεται επίσης ως Πυθαγόρειο ή ευθύγραμμο απόσταση. Υπολογίζει την απόσταση μεταξύ δύο σημείων στο χώρο, μετρώντας το μήκος ενός ευθύγραμμου τμήματος που διέρχεται μεταξύ τους. Χρησιμοποιεί το Πυθαγόρειο θεώρημα και η τιμή της απόστασης είναι το αποτέλεσμα (Γ) της εξίσωσης:

$$
c^2 = a^2 + b^2
$$

  • Μανχάταν: επίσης λέγεται Πόλη-τετράγωνο, Ταξί απόσταση. Είναι το άθροισμα των απόλυτων διαφορών μεταξύ των μέτρων σε όλες τις διαστάσεις δύο σημείων. Εάν αυτές οι διαστάσεις είναι δύο, είναι ανάλογο με το να κάνετε δεξιά και μετά αριστερά όταν περπατάτε ένα τετράγωνο.

img

  • Minkowski: είναι μια γενίκευση τόσο των αποστάσεων του Ευκλείδειου όσο και του Μανχάταν. Είναι ένας τρόπος υπολογισμού αποστάσεων με βάση τις απόλυτες διαφορές στη σειρά της μετρικής Minkowski p. Αν και ορίζεται για οποιαδήποτε p> 0, χρησιμοποιείται σπάνια για τιμές άλλες από 1, 2 και ∞ (άπειρο). Η απόσταση Minkowski είναι ίδια με την απόσταση του Μανχάταν όταν p = 1, και το ίδιο με την Ευκλείδεια απόσταση όταν p = 2.

$$
Dleft(X,Yright) = αριστερά(sum_{i=1}^n |x_i-y_i|^right)^{frac{1}{p}}
$$

img

  • Chebyshev: γνωστός και ως Σκακιέρα απόσταση. Είναι η ακραία περίπτωση της απόστασης Minkowski. Όταν χρησιμοποιούμε το άπειρο ως τιμή της παραμέτρου p (p = ∞), καταλήγουμε σε μια μέτρηση που ορίζει την απόσταση ως τη μέγιστη απόλυτη διαφορά μεταξύ των συντεταγμένων.
  • συνημίτονο: είναι η γωνιακή απόσταση συνημιτόνου μεταξύ δύο ακολουθιών σημείων ή διανυσμάτων. Η ομοιότητα συνημιτόνου είναι το γινόμενο κουκίδων των διανυσμάτων διαιρούμενο με το γινόμενο των μηκών τους.
  • Ζακάρ: μετρά την ομοιότητα μεταξύ πεπερασμένων συνόλων σημείων. Ορίζεται ως ο συνολικός αριθμός σημείων (cardinality) στα κοινά σημεία σε κάθε σύνολο (τομή), διαιρούμενος με τον συνολικό αριθμό σημείων (cardinality) των συνολικών πόντων και των δύο συνόλων (union).
  • Τζένσεν-Σάνον: βασίζεται στην απόκλιση Kullback-Leibler. Λαμβάνει υπόψη τις κατανομές πιθανοτήτων των σημείων και μετρά την ομοιότητα μεταξύ αυτών των κατανομών. Είναι μια δημοφιλής μέθοδος θεωρίας πιθανοτήτων και στατιστικών.

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

Σε αυτό το παράδειγμα, εργαζόμαστε με δύο χαρακτηριστικά (στήλες) των δεδομένων μάρκετινγκ και 200 ​​παρατηρήσεις ή σειρές. Δεδομένου ότι ο αριθμός των παρατηρήσεων είναι μεγαλύτερος από τον αριθμό των χαρακτηριστικών (200 > 2), εργαζόμαστε σε ένα χώρο χαμηλών διαστάσεων.

Όταν ο αριθμός των χαρακτηριστικών (φά) είναι μεγαλύτερο από τον αριθμό των παρατηρήσεων (Ν) – κυρίως γράφεται ως στ >> Ν, σημαίνει ότι έχουμε α υψηλών διαστάσεων χώρο.

Αν περιλαμβάναμε περισσότερα χαρακτηριστικά, άρα έχουμε περισσότερα από 200 χαρακτηριστικά, η Ευκλείδεια απόσταση μπορεί να μην λειτουργεί πολύ καλά, αφού θα δυσκολευόταν να μετρήσει όλες τις μικρές αποστάσεις σε έναν πολύ μεγάλο χώρο που γίνεται μόνο μεγαλύτερος. Με άλλα λόγια, η προσέγγιση της Ευκλείδειας απόστασης έχει δυσκολίες στην εργασία με τα δεδομένα βραδύτητα. Αυτό είναι ένα θέμα που λέγεται η κατάρα της διάστασης. Οι τιμές της απόστασης θα γίνονταν τόσο μικρές, σαν να «αραιώθηκαν» στον μεγαλύτερο χώρο, να παραμορφωθούν μέχρι να γίνουν 0.

Σημείωση: Εάν συναντήσετε ποτέ ένα σύνολο δεδομένων με f >> σελ, πιθανότατα θα χρησιμοποιήσετε άλλες μετρήσεις απόστασης, όπως το Μαχαλανόμπης απόσταση. Εναλλακτικά, μπορείτε επίσης να μειώσετε τις διαστάσεις των δεδομένων, χρησιμοποιώντας Ανάλυση κύριων συστατικών (PCA). Αυτό το πρόβλημα είναι συχνό ειδικά κατά τη ομαδοποίηση δεδομένων βιολογικής αλληλουχίας.

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

Η εύρεση ενός ενδιαφέροντος αριθμού συστάδων σε ένα δενδρόγραμμα είναι το ίδιο με την εύρεση του μεγαλύτερου οριζόντιου χώρου που δεν έχει κάθετες γραμμές (το διάστημα με τις μεγαλύτερες κάθετες γραμμές). Αυτό σημαίνει ότι υπάρχει μεγαλύτερος διαχωρισμός μεταξύ των συστάδων.

Μπορούμε να σχεδιάσουμε μια οριζόντια γραμμή που διέρχεται από τη μεγαλύτερη απόσταση:

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

img

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

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

Υλοποίηση Συσσωρευτικής Ιεραρχικής Ομαδοποίησης

Χρήση πρωτότυπων δεδομένων

Μέχρι στιγμής έχουμε υπολογίσει τον προτεινόμενο αριθμό συμπλεγμάτων για το σύνολο δεδομένων μας που επιβεβαιώνουν την αρχική μας ανάλυση και την ανάλυση PCA. Τώρα μπορούμε να δημιουργήσουμε το αθροιστικό μοντέλο ιεραρχικής ομαδοποίησης χρησιμοποιώντας το Scikit-Learn AgglomerativeClustering και μάθετε τις ετικέτες των σημείων μάρκετινγκ με labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

Αυτο εχει ως αποτελεσμα:

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

Έχουμε ερευνήσει πολύ για να φτάσουμε σε αυτό το σημείο. Και τι σημαίνουν αυτές οι ετικέτες; Εδώ, κάθε σημείο των δεδομένων μας επισημαίνεται ως ομάδα από το 0 έως το 4:

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

img

Αυτά είναι τα τελικά ομαδοποιημένα δεδομένα μας. Μπορείτε να δείτε τα χρωματικά κωδικοποιημένα σημεία δεδομένων με τη μορφή πέντε συμπλεγμάτων.

Τα σημεία δεδομένων κάτω δεξιά (ετικέτα: 0, μωβ data points) ανήκουν στους πελάτες με υψηλούς μισθούς αλλά χαμηλές δαπάνες. Αυτοί είναι οι πελάτες που ξοδεύουν τα χρήματά τους προσεκτικά.

Ομοίως, οι πελάτες πάνω δεξιά (ετικέτα: 2, green data points), είναι οι πελάτες με υψηλούς μισθούς και υψηλές δαπάνες. Αυτοί είναι οι τύποι πελατών που στοχεύουν οι εταιρείες.

Οι πελάτες στη μέση (ετικέτα: 1, μπλε σημεία δεδομένων) είναι αυτά με μέσο εισόδημα και μέση δαπάνη. Ο μεγαλύτερος αριθμός πελατών ανήκει σε αυτή την κατηγορία. Οι εταιρείες μπορούν επίσης να στοχεύσουν αυτούς τους πελάτες δεδομένου του γεγονότος ότι είναι σε τεράστιους αριθμούς.

Οι πελάτες κάτω αριστερά (ετικέτα: 4, κόκκινο) είναι οι πελάτες που έχουν χαμηλούς μισθούς και χαμηλές δαπάνες, μπορεί να προσελκύονται προσφέροντας προσφορές.

Και τέλος, οι πελάτες πάνω αριστερά (ετικέτα: 3, πορτοκαλί σημεία δεδομένων) είναι αυτά με υψηλά έσοδα και χαμηλές δαπάνες, τα οποία στοχεύουν ιδανικά από το μάρκετινγκ.

Χρήση του αποτελέσματος από το PCA

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

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

img

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

Όσο λιγότερο έχουμε να μεταμορφώσουμε τα δεδομένα μας, τόσο το καλύτερο.

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

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

Μπορείτε πάντα να επιλέξετε διαφορετικές τεχνικές οπτικοποίησης ομαδοποίησης ανάλογα με τη φύση των δεδομένων σας (γραμμικές, μη γραμμικές) και να τις συνδυάσετε ή να τις δοκιμάσετε όλες εάν είναι απαραίτητο.

Συμπέρασμα

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

Σε αυτόν τον οδηγό, έχουμε φέρει ένα πραγματικό πρόβλημα επιστήμης δεδομένων, καθώς οι τεχνικές ομαδοποίησης χρησιμοποιούνται σε μεγάλο βαθμό στην ανάλυση μάρκετινγκ (και επίσης στη βιολογική ανάλυση). Έχουμε επίσης εξηγήσει πολλά από τα βήματα της έρευνας για να φτάσουμε σε ένα καλό μοντέλο ιεραρχικής ομαδοποίησης και πώς να διαβάζουμε δενδρογράμματα και έχουμε αμφισβητήσει εάν το PCA είναι απαραίτητο βήμα. Ο κύριος στόχος μας είναι να καλυφθούν ορισμένες από τις παγίδες και τα διαφορετικά σενάρια στα οποία μπορούμε να βρούμε ιεραρχική ομαδοποίηση.

Καλή συσπείρωση!

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

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