Η ομαδοποίηση K-means είναι ένας αλγόριθμος μάθησης χωρίς επίβλεψη που ομαδοποιεί δεδομένα με βάση κάθε σημείο ευκλείδειας απόστασης σε ένα κεντρικό σημείο που ονομάζεται κεντροειδές. Τα κεντροειδή ορίζονται με τη βοήθεια όλων των σημείων που βρίσκονται στο ίδιο σύμπλεγμα. Ο αλγόριθμος αρχικά επιλέγει τυχαία σημεία ως κεντροειδή και στη συνέχεια επαναλαμβάνει προσαρμόζοντάς τα μέχρι την πλήρη σύγκλιση.
Ένα σημαντικό πράγμα που πρέπει να θυμάστε όταν χρησιμοποιείτε το K-means, είναι ότι ο αριθμός των συμπλεγμάτων είναι μια υπερπαράμετρος, θα οριστεί πριν την εκτέλεση του μοντέλου.
Το K-means μπορεί να εφαρμοστεί χρησιμοποιώντας το Scikit-Learn με μόλις 3 γραμμές κώδικα. Το Scikit-learn έχει επίσης ήδη διαθέσιμη μια μέθοδο βελτιστοποίησης centroid, kmeans++, που βοηθά το μοντέλο να συγκλίνει πιο γρήγορα.
Για να εφαρμόσουμε τον αλγόριθμο ομαδοποίησης K-means, ας φορτώσουμε το Πιγκουίνοι Πάλμερ σύνολο δεδομένων, επιλέξτε τις στήλες που θα συγκεντρωθούν και χρησιμοποιήστε το Seaborn για να σχεδιάσετε ένα διάγραμμα διασποράς με συμπλέγματα κωδικοποιημένα με χρώμα.
Note: Μπορείτε να κάνετε λήψη του συνόλου δεδομένων από αυτό σύνδεσμος.
Ας εισαγάγουμε τις βιβλιοθήκες και ας φορτώσουμε το σύνολο δεδομένων Penguins, περικόπτοντάς το στις επιλεγμένες στήλες και αφήνοντας σειρές με δεδομένα που λείπουν (υπήρχαν μόνο 2):
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
df = pd.read_csv('penguins.csv')
print(df.shape)
df = df[['bill_length_mm', 'flipper_length_mm']]
df = df.dropna(axis=0)
Μπορούμε να χρησιμοποιήσουμε τη μέθοδο Elbow για να έχουμε ένδειξη συστάδων για τα δεδομένα μας. Συνίσταται στην ερμηνεία μιας γραμμικής πλοκής με σχήμα αγκώνα. Ο αριθμός των συστάδων είναι οι κάμψεις των αγκώνων. Ο άξονας x της γραφικής παράστασης είναι ο αριθμός των συστάδων και ο άξονας y είναι το άθροισμα τετραγώνων εντός συστάδων (WCSS) για κάθε αριθμό συστάδων:
wcss = []
for i in range(1, 11):
clustering = KMeans(n_clusters=i, init='k-means++', random_state=42)
clustering.fit(df)
wcss.append(clustering.inertia_)
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss);
Η μέθοδος elbow δείχνει ότι τα δεδομένα μας έχουν 2 συστάδες. Ας σχεδιάσουμε τα δεδομένα πριν και μετά την ομαδοποίηση:
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without clustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('Using the elbow method');
Αυτό το παράδειγμα δείχνει πώς η μέθοδος Elbow είναι μόνο μια αναφορά όταν χρησιμοποιείται για την επιλογή του αριθμού των συμπλεγμάτων. Γνωρίζουμε ήδη ότι έχουμε 3 τύπους πιγκουίνων στο σύνολο δεδομένων, αλλά αν προσδιορίζαμε τον αριθμό τους χρησιμοποιώντας τη μέθοδο Elbow, το αποτέλεσμα θα ήταν 2 συστάδες.
Επειδή το K-means είναι ευαίσθητο στη διακύμανση δεδομένων, ας δούμε τα περιγραφικά στατιστικά στοιχεία των στηλών που ομαδοποιούμε:
df.describe().T
Αυτο εχει ως αποτελεσμα:
count mean std min 25% 50% 75% max
bill_length_mm 342.0 43.921930 5.459584 32.1 39.225 44.45 48.5 59.6
flipper_length_mm 342.0 200.915205 14.061714 172.0 190.000 197.00 213.0 231.0
Παρατηρήστε ότι ο μέσος όρος απέχει πολύ από την τυπική απόκλιση (std), αυτό υποδηλώνει υψηλή διακύμανση. Ας προσπαθήσουμε να το μειώσουμε κλιμακώνοντας τα δεδομένα με το Standard Scaler:
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
scaled = ss.fit_transform(df)
Τώρα, ας επαναλάβουμε τη διαδικασία της μεθόδου Elbow για τα δεδομένα κλίμακας:
wcss_sc = []
for i in range(1, 11):
clustering_sc = KMeans(n_clusters=i, init='k-means++', random_state=42)
clustering_sc.fit(scaled)
wcss_sc.append(clustering_sc.inertia_)
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss_sc);
Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!
Αυτή τη φορά, ο προτεινόμενος αριθμός συμπλεγμάτων είναι 3. Μπορούμε να σχεδιάσουμε ξανά τα δεδομένα με τις ετικέτες συμπλέγματος μαζί με τα δύο προηγούμενα για σύγκριση:
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without cliustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('With the Elbow method')
sns.scatterplot(ax=axes[2], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering_sc.labels_).set_title('With the Elbow method and scaled data');
Όταν χρησιμοποιείτε το K-means Clustering, πρέπει να προκαθορίσετε τον αριθμό των συμπλεγμάτων. Όπως έχουμε δει όταν χρησιμοποιούμε μια μέθοδο για να επιλέξουμε το δικό μας k τον αριθμό των συστάδων, το αποτέλεσμα είναι μόνο μια πρόταση και μπορεί να επηρεαστεί από το μέγεθος της διακύμανσης στα δεδομένα. Είναι σημαντικό να διεξάγετε μια εις βάθος ανάλυση και να δημιουργήσετε περισσότερα από ένα μοντέλα με διαφορετικά _k_s κατά την ομαδοποίηση.
Εάν δεν υπάρχει προηγούμενη ένδειξη πόσες συστάδες υπάρχουν στα δεδομένα, οπτικοποιήστε τα, δοκιμάστε τα και ερμηνεύστε τα για να δείτε εάν τα αποτελέσματα της ομαδοποίησης έχουν νόημα. Εάν όχι, ομαδοποιήστε ξανά. Επίσης, ανατρέξτε σε περισσότερες από μία μέτρηση και δημιουργήστε διαφορετικά μοντέλα ομαδοποίησης – για K-means, δείτε τη βαθμολογία σιλουέτας και ίσως την Ιεραρχική ομαδοποίηση για να δείτε εάν τα αποτελέσματα παραμένουν ίδια.