# Ομαδοποίηση K-Means ## [Προ-μάθημα κουίζ](https://ff-quizzes.netlify.app/en/ml/) Σε αυτό το μάθημα, θα μάθετε πώς να δημιουργείτε ομάδες χρησιμοποιώντας το Scikit-learn και το σύνολο δεδομένων της νιγηριανής μουσικής που εισαγάγατε νωρίτερα. Θα καλύψουμε τα βασικά του K-Means για την Ομαδοποίηση. Να θυμάστε ότι, όπως μάθατε στο προηγούμενο μάθημα, υπάρχουν πολλοί τρόποι να δουλέψετε με ομάδες και η μέθοδος που χρησιμοποιείτε εξαρτάται από τα δεδομένα σας. Θα δοκιμάσουμε το K-Means καθώς είναι η πιο κοινή τεχνική ομαδοποίησης. Ας ξεκινήσουμε! Όροι που θα μάθετε: - Βαθμολογία Silhouette - Μέθοδος Elbow - Αδράνεια - Διακύμανση ## Εισαγωγή Η [Ομαδοποίηση K-Means](https://wikipedia.org/wiki/K-means_clustering) είναι μια μέθοδος που προέρχεται από τον τομέα της επεξεργασίας σήματος. Χρησιμοποιείται για να διαιρέσει και να κατατμήσει ομάδες δεδομένων σε 'k' ομάδες χρησιμοποιώντας μια σειρά παρατηρήσεων. Κάθε παρατήρηση λειτουργεί για να ομαδοποιήσει ένα δεδομένο σημείο δεδομένων πιο κοντά στο πλησιέστερο 'μέσο', ή το κεντρικό σημείο μιας ομάδας. Οι ομάδες μπορούν να οπτικοποιηθούν ως [Διαγράμματα Voronoi](https://wikipedia.org/wiki/Voronoi_diagram), τα οποία περιλαμβάνουν ένα σημείο (ή 'σπόρο') και την αντίστοιχη περιοχή του. ![voronoi diagram](../../../../5-Clustering/2-K-Means/images/voronoi.png) > infographic από [Jen Looper](https://twitter.com/jenlooper) Η διαδικασία ομαδοποίησης K-Means [εκτελείται σε τρία βήματα](https://scikit-learn.org/stable/modules/clustering.html#k-means): 1. Ο αλγόριθμος επιλέγει k αριθμό κεντρικών σημείων δειγματίζοντας από το σύνολο δεδομένων. Μετά από αυτό, επαναλαμβάνει: 1. Αναθέτει κάθε δείγμα στο πλησιέστερο κέντρο. 2. Δημιουργεί νέα κέντρα λαμβάνοντας τη μέση τιμή όλων των δειγμάτων που έχουν ανατεθεί στα προηγούμενα κέντρα. 3. Στη συνέχεια, υπολογίζει τη διαφορά μεταξύ των νέων και παλιών κέντρων και επαναλαμβάνει μέχρι να σταθεροποιηθούν τα κέντρα. Ένα μειονέκτημα της χρήσης του K-Means είναι ότι πρέπει να καθορίσετε το 'k', δηλαδή τον αριθμό των κέντρων. Ευτυχώς, η 'μέθοδος elbow' βοηθά να εκτιμήσετε μια καλή αρχική τιμή για το 'k'. Θα το δοκιμάσετε σε λίγο. ## Προαπαιτούμενα Θα εργαστείτε στο αρχείο [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) αυτού του μαθήματος, το οποίο περιλαμβάνει την εισαγωγή δεδομένων και τον προκαταρκτικό καθαρισμό που κάνατε στο προηγούμενο μάθημα. ## Άσκηση - προετοιμασία Ξεκινήστε ρίχνοντας μια άλλη ματιά στα δεδομένα των τραγουδιών. 1. Δημιουργήστε ένα boxplot, καλώντας `boxplot()` για κάθε στήλη: ```python plt.figure(figsize=(20,20), dpi=200) plt.subplot(4,3,1) sns.boxplot(x = 'popularity', data = df) plt.subplot(4,3,2) sns.boxplot(x = 'acousticness', data = df) plt.subplot(4,3,3) sns.boxplot(x = 'energy', data = df) plt.subplot(4,3,4) sns.boxplot(x = 'instrumentalness', data = df) plt.subplot(4,3,5) sns.boxplot(x = 'liveness', data = df) plt.subplot(4,3,6) sns.boxplot(x = 'loudness', data = df) plt.subplot(4,3,7) sns.boxplot(x = 'speechiness', data = df) plt.subplot(4,3,8) sns.boxplot(x = 'tempo', data = df) plt.subplot(4,3,9) sns.boxplot(x = 'time_signature', data = df) plt.subplot(4,3,10) sns.boxplot(x = 'danceability', data = df) plt.subplot(4,3,11) sns.boxplot(x = 'length', data = df) plt.subplot(4,3,12) sns.boxplot(x = 'release_date', data = df) ``` Αυτά τα δεδομένα είναι λίγο θορυβώδη: παρατηρώντας κάθε στήλη ως boxplot, μπορείτε να δείτε ακραίες τιμές. ![outliers](../../../../5-Clustering/2-K-Means/images/boxplots.png) Μπορείτε να περάσετε από το σύνολο δεδομένων και να αφαιρέσετε αυτές τις ακραίες τιμές, αλλά αυτό θα έκανε τα δεδομένα αρκετά περιορισμένα. 1. Προς το παρόν, επιλέξτε ποιες στήλες θα χρησιμοποιήσετε για την άσκηση ομαδοποίησης. Επιλέξτε αυτές με παρόμοια εύρη και κωδικοποιήστε τη στήλη `artist_top_genre` ως αριθμητικά δεδομένα: ```python from sklearn.preprocessing import LabelEncoder le = LabelEncoder() X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')] y = df['artist_top_genre'] X['artist_top_genre'] = le.fit_transform(X['artist_top_genre']) y = le.transform(y) ``` 1. Τώρα πρέπει να επιλέξετε πόσες ομάδες να στοχεύσετε. Ξέρετε ότι υπάρχουν 3 είδη τραγουδιών που εξάγαμε από το σύνολο δεδομένων, οπότε ας δοκιμάσουμε 3: ```python from sklearn.cluster import KMeans nclusters = 3 seed = 0 km = KMeans(n_clusters=nclusters, random_state=seed) km.fit(X) # Predict the cluster for each data point y_cluster_kmeans = km.predict(X) y_cluster_kmeans ``` Βλέπετε έναν πίνακα που εκτυπώνεται με προβλεπόμενες ομάδες (0, 1 ή 2) για κάθε γραμμή του dataframe. 1. Χρησιμοποιήστε αυτόν τον πίνακα για να υπολογίσετε μια 'βαθμολογία silhouette': ```python from sklearn import metrics score = metrics.silhouette_score(X, y_cluster_kmeans) score ``` ## Βαθμολογία Silhouette Αναζητήστε μια βαθμολογία silhouette κοντά στο 1. Αυτή η βαθμολογία κυμαίνεται από -1 έως 1, και αν η βαθμολογία είναι 1, η ομάδα είναι πυκνή και καλά διαχωρισμένη από άλλες ομάδες. Μια τιμή κοντά στο 0 αντιπροσωπεύει επικαλυπτόμενες ομάδες με δείγματα πολύ κοντά στο όριο απόφασης των γειτονικών ομάδων. [(Πηγή)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam) Η βαθμολογία μας είναι **.53**, δηλαδή ακριβώς στη μέση. Αυτό δείχνει ότι τα δεδομένα μας δεν είναι ιδιαίτερα κατάλληλα για αυτόν τον τύπο ομαδοποίησης, αλλά ας συνεχίσουμε. ### Άσκηση - δημιουργία μοντέλου 1. Εισάγετε το `KMeans` και ξεκινήστε τη διαδικασία ομαδοποίησης. ```python from sklearn.cluster import KMeans wcss = [] for i in range(1, 11): kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42) kmeans.fit(X) wcss.append(kmeans.inertia_) ``` Υπάρχουν μερικά μέρη εδώ που αξίζουν εξήγηση. > 🎓 range: Αυτές είναι οι επαναλήψεις της διαδικασίας ομαδοποίησης > 🎓 random_state: "Καθορίζει τη γενιά τυχαίων αριθμών για την αρχικοποίηση των κέντρων." [Πηγή](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) > 🎓 WCSS: "άθροισμα τετραγώνων εντός της ομάδας" μετρά τη μέση τετραγωνική απόσταση όλων των σημείων εντός μιας ομάδας από το κέντρο της ομάδας. [Πηγή](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce). > 🎓 Αδράνεια: Οι αλγόριθμοι K-Means προσπαθούν να επιλέξουν κέντρα για να ελαχιστοποιήσουν την 'αδράνεια', "ένα μέτρο του πόσο εσωτερικά συνεκτικές είναι οι ομάδες." [Πηγή](https://scikit-learn.org/stable/modules/clustering.html). Η τιμή προστίθεται στη μεταβλητή wcss σε κάθε επανάληψη. > 🎓 k-means++: Στο [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) μπορείτε να χρησιμοποιήσετε τη βελτιστοποίηση 'k-means++', η οποία "αρχικοποιεί τα κέντρα ώστε να είναι (γενικά) απομακρυσμένα μεταξύ τους, οδηγώντας πιθανώς σε καλύτερα αποτελέσματα από την τυχαία αρχικοποίηση." ### Μέθοδος Elbow Προηγουμένως, υποθέσατε ότι, επειδή στοχεύσατε 3 είδη τραγουδιών, θα πρέπει να επιλέξετε 3 ομάδες. Αλλά ισχύει αυτό; 1. Χρησιμοποιήστε τη 'μέθοδο elbow' για να βεβαιωθείτε. ```python plt.figure(figsize=(10,5)) sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red') plt.title('Elbow') plt.xlabel('Number of clusters') plt.ylabel('WCSS') plt.show() ``` Χρησιμοποιήστε τη μεταβλητή `wcss` που δημιουργήσατε στο προηγούμενο βήμα για να δημιουργήσετε ένα γράφημα που δείχνει πού βρίσκεται η 'κάμψη' στον αγκώνα, η οποία υποδεικνύει τον βέλτιστο αριθμό ομάδων. Ίσως είναι **όντως** 3! ![elbow method](../../../../5-Clustering/2-K-Means/images/elbow.png) ## Άσκηση - εμφάνιση των ομάδων 1. Δοκιμάστε ξανά τη διαδικασία, αυτή τη φορά ορίζοντας τρεις ομάδες, και εμφανίστε τις ομάδες ως scatterplot: ```python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters = 3) kmeans.fit(X) labels = kmeans.predict(X) plt.scatter(df['popularity'],df['danceability'],c = labels) plt.xlabel('popularity') plt.ylabel('danceability') plt.show() ``` 1. Ελέγξτε την ακρίβεια του μοντέλου: ```python labels = kmeans.labels_ correct_labels = sum(y == labels) print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size)) print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size))) ``` Η ακρίβεια αυτού του μοντέλου δεν είναι πολύ καλή, και το σχήμα των ομάδων σας δίνει μια ένδειξη γιατί. ![clusters](../../../../5-Clustering/2-K-Means/images/clusters.png) Αυτά τα δεδομένα είναι πολύ μη ισορροπημένα, έχουν πολύ λίγη συσχέτιση και υπάρχει υπερβολική διακύμανση μεταξύ των τιμών των στηλών για να ομαδοποιηθούν καλά. Στην πραγματικότητα, οι ομάδες που σχηματίζονται πιθανότατα επηρεάζονται ή παραμορφώνονται έντονα από τις τρεις κατηγορίες ειδών που ορίσαμε παραπάνω. Ήταν μια διαδικασία μάθησης! Στην τεκμηρίωση του Scikit-learn, μπορείτε να δείτε ότι ένα μοντέλο σαν αυτό, με ομάδες που δεν είναι πολύ καλά διαχωρισμένες, έχει πρόβλημα 'διακύμανσης': ![problem models](../../../../5-Clustering/2-K-Means/images/problems.png) > Infographic από το Scikit-learn ## Διακύμανση Η διακύμανση ορίζεται ως "ο μέσος όρος των τετραγωνικών διαφορών από τη Μέση τιμή" [(Πηγή)](https://www.mathsisfun.com/data/standard-deviation.html). Στο πλαίσιο αυτού του προβλήματος ομαδοποίησης, αναφέρεται σε δεδομένα όπου οι αριθμοί του συνόλου δεδομένων τείνουν να αποκλίνουν λίγο υπερβολικά από τη μέση τιμή. ✅ Αυτή είναι μια εξαιρετική στιγμή να σκεφτείτε όλους τους τρόπους με τους οποίους θα μπορούσατε να διορθώσετε αυτό το ζήτημα. Να τροποποιήσετε λίγο τα δεδομένα; Να χρησιμοποιήσετε διαφορετικές στήλες; Να χρησιμοποιήσετε διαφορετικό αλγόριθμο; Υπόδειξη: Δοκιμάστε [να κλιμακώσετε τα δεδομένα σας](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) για να τα κανονικοποιήσετε και να δοκιμάσετε άλλες στήλες. > Δοκιμάστε αυτόν τον '[υπολογιστή διακύμανσης](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' για να κατανοήσετε λίγο περισσότερο την έννοια. --- ## 🚀Πρόκληση Περάστε λίγο χρόνο με αυτό το notebook, τροποποιώντας παραμέτρους. Μπορείτε να βελτιώσετε την ακρίβεια του μοντέλου καθαρίζοντας περισσότερο τα δεδομένα (αφαιρώντας ακραίες τιμές, για παράδειγμα); Μπορείτε να χρησιμοποιήσετε βάρη για να δώσετε μεγαλύτερη βαρύτητα σε συγκεκριμένα δείγματα δεδομένων. Τι άλλο μπορείτε να κάνετε για να δημιουργήσετε καλύτερες ομάδες; Υπόδειξη: Δοκιμάστε να κλιμακώσετε τα δεδομένα σας. Υπάρχει σχολιασμένος κώδικας στο notebook που προσθέτει τυπική κλιμάκωση για να κάνουν οι στήλες δεδομένων να μοιάζουν περισσότερο μεταξύ τους όσον αφορά το εύρος. Θα διαπιστώσετε ότι ενώ η βαθμολογία silhouette μειώνεται, η 'κάμψη' στο γράφημα elbow εξομαλύνεται. Αυτό συμβαίνει επειδή αφήνοντας τα δεδομένα χωρίς κλιμάκωση επιτρέπει στα δεδομένα με λιγότερη διακύμανση να έχουν μεγαλύτερη βαρύτητα. Διαβάστε λίγο περισσότερο για αυτό το πρόβλημα [εδώ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226). ## [Μετά-μάθημα κουίζ](https://ff-quizzes.netlify.app/en/ml/) ## Ανασκόπηση & Αυτομελέτη Ρίξτε μια ματιά σε έναν Προσομοιωτή K-Means [όπως αυτόν](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Μπορείτε να χρησιμοποιήσετε αυτό το εργαλείο για να οπτικοποιήσετε δείγματα δεδομένων και να καθορίσετε τα κέντρα τους. Μπορείτε να επεξεργαστείτε την τυχαιότητα των δεδομένων, τον αριθμό των ομάδων και τον αριθμό των κέντρων. Σας βοηθά αυτό να αποκτήσετε μια ιδέα για το πώς μπορούν να ομαδοποιηθούν τα δεδομένα; Επίσης, ρίξτε μια ματιά σε [αυτό το φυλλάδιο για το K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) από το Stanford. ## Εργασία [Δοκιμάστε διαφορετικές μεθόδους ομαδοποίησης](assignment.md) --- **Αποποίηση ευθύνης**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.