|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
Εισαγωγή στην ταξινόμηση
Σε αυτά τα τέσσερα μαθήματα, θα εξερευνήσετε ένα θεμελιώδες θέμα της κλασικής μηχανικής μάθησης - ταξινόμηση. Θα δούμε πώς να χρησιμοποιούμε διάφορους αλγόριθμους ταξινόμησης με ένα σύνολο δεδομένων που αφορά όλες τις υπέροχες κουζίνες της Ασίας και της Ινδίας. Ελπίζω να είστε πεινασμένοι!
Γιορτάστε τις παν-ασιατικές κουζίνες σε αυτά τα μαθήματα! Εικόνα από Jen Looper
Η ταξινόμηση είναι μια μορφή εποπτευόμενης μάθησης που έχει πολλά κοινά με τις τεχνικές παλινδρόμησης. Αν η μηχανική μάθηση αφορά την πρόβλεψη τιμών ή ονομάτων χρησιμοποιώντας σύνολα δεδομένων, τότε η ταξινόμηση γενικά χωρίζεται σε δύο ομάδες: δυαδική ταξινόμηση και πολυκατηγορική ταξινόμηση.
🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα βίντεο: Ο John Guttag του MIT παρουσιάζει την ταξινόμηση
Θυμηθείτε:
- Γραμμική παλινδρόμηση σας βοήθησε να προβλέψετε σχέσεις μεταξύ μεταβλητών και να κάνετε ακριβείς προβλέψεις για το πού θα βρισκόταν ένα νέο σημείο δεδομένων σε σχέση με αυτή τη γραμμή. Για παράδειγμα, θα μπορούσατε να προβλέψετε ποια θα είναι η τιμή μιας κολοκύθας τον Σεπτέμβριο σε σχέση με τον Δεκέμβριο.
- Λογιστική παλινδρόμηση σας βοήθησε να ανακαλύψετε "δυαδικές κατηγορίες": σε αυτό το σημείο τιμής, είναι αυτή η κολοκύθα πορτοκαλί ή μη πορτοκαλί;
Η ταξινόμηση χρησιμοποιεί διάφορους αλγόριθμους για να καθορίσει άλλους τρόπους προσδιορισμού της ετικέτας ή της κατηγορίας ενός σημείου δεδομένων. Ας δουλέψουμε με αυτά τα δεδομένα κουζίνας για να δούμε αν, παρατηρώντας μια ομάδα συστατικών, μπορούμε να προσδιορίσουμε την κουζίνα προέλευσης.
Προ-μάθημα κουίζ
Αυτό το μάθημα είναι διαθέσιμο σε R!
Εισαγωγή
Η ταξινόμηση είναι μία από τις θεμελιώδεις δραστηριότητες του ερευνητή μηχανικής μάθησης και του επιστήμονα δεδομένων. Από τη βασική ταξινόμηση μιας δυαδικής τιμής ("είναι αυτό το email ανεπιθύμητο ή όχι;"), μέχρι την πολύπλοκη ταξινόμηση και τμηματοποίηση εικόνων χρησιμοποιώντας υπολογιστική όραση, είναι πάντα χρήσιμο να μπορούμε να ταξινομούμε δεδομένα σε κατηγορίες και να θέτουμε ερωτήματα.
Για να δηλώσουμε τη διαδικασία με πιο επιστημονικό τρόπο, η μέθοδος ταξινόμησής σας δημιουργεί ένα προγνωστικό μοντέλο που σας επιτρέπει να χαρτογραφήσετε τη σχέση μεταξύ μεταβλητών εισόδου και μεταβλητών εξόδου.
Δυαδικά vs. πολυκατηγορικά προβλήματα για αλγόριθμους ταξινόμησης. Γραφικό από Jen Looper
Πριν ξεκινήσουμε τη διαδικασία καθαρισμού των δεδομένων μας, της οπτικοποίησής τους και της προετοιμασίας τους για τις εργασίες ML μας, ας μάθουμε λίγο για τους διάφορους τρόπους με τους οποίους η μηχανική μάθηση μπορεί να χρησιμοποιηθεί για την ταξινόμηση δεδομένων.
Προερχόμενη από στατιστική, η ταξινόμηση χρησιμοποιώντας κλασική μηχανική μάθηση χρησιμοποιεί χαρακτηριστικά, όπως smoker
, weight
, και age
για να καθορίσει πιθανότητα ανάπτυξης Χ ασθένειας. Ως τεχνική εποπτευόμενης μάθησης παρόμοια με τις ασκήσεις παλινδρόμησης που κάνατε νωρίτερα, τα δεδομένα σας είναι ετικετοποιημένα και οι αλγόριθμοι ML χρησιμοποιούν αυτές τις ετικέτες για να ταξινομήσουν και να προβλέψουν κατηγορίες (ή 'χαρακτηριστικά') ενός συνόλου δεδομένων και να τα αναθέσουν σε μια ομάδα ή αποτέλεσμα.
✅ Πάρτε μια στιγμή να φανταστείτε ένα σύνολο δεδομένων για κουζίνες. Τι θα μπορούσε να απαντήσει ένα πολυκατηγορικό μοντέλο; Τι θα μπορούσε να απαντήσει ένα δυαδικό μοντέλο; Τι θα γινόταν αν θέλατε να προσδιορίσετε αν μια δεδομένη κουζίνα είναι πιθανό να χρησιμοποιεί τριγωνέλλα; Τι θα γινόταν αν θέλατε να δείτε αν, δεδομένου ενός δώρου με μια σακούλα παντοπωλείου γεμάτη με αστεροειδή γλυκάνισο, αγκινάρες, κουνουπίδι και χρένο, θα μπορούσατε να δημιουργήσετε ένα τυπικό ινδικό πιάτο;
🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα βίντεο. Η όλη ιδέα της εκπομπής 'Chopped' είναι το 'μυστηριώδες καλάθι', όπου οι σεφ πρέπει να φτιάξουν ένα πιάτο από μια τυχαία επιλογή συστατικών. Σίγουρα ένα μοντέλο ML θα είχε βοηθήσει!
Γεια σου 'ταξινομητή'
Η ερώτηση που θέλουμε να κάνουμε για αυτό το σύνολο δεδομένων κουζίνας είναι στην πραγματικότητα μια πολυκατηγορική ερώτηση, καθώς έχουμε αρκετές πιθανές εθνικές κουζίνες για να δουλέψουμε. Δεδομένης μιας παρτίδας συστατικών, σε ποια από αυτές τις πολλές κατηγορίες θα ταιριάζουν τα δεδομένα;
Το Scikit-learn προσφέρει διάφορους αλγόριθμους για να ταξινομήσετε δεδομένα, ανάλογα με το είδος του προβλήματος που θέλετε να λύσετε. Στα επόμενα δύο μαθήματα, θα μάθετε για αρκετούς από αυτούς τους αλγόριθμους.
Άσκηση - καθαρίστε και ισορροπήστε τα δεδομένα σας
Η πρώτη εργασία που πρέπει να κάνετε, πριν ξεκινήσετε αυτό το έργο, είναι να καθαρίσετε και να ισορροπήσετε τα δεδομένα σας για να έχετε καλύτερα αποτελέσματα. Ξεκινήστε με το κενό αρχείο notebook.ipynb στον ριζικό φάκελο αυτού του φακέλου.
Το πρώτο πράγμα που πρέπει να εγκαταστήσετε είναι το imblearn. Αυτό είναι ένα πακέτο Scikit-learn που θα σας επιτρέψει να ισορροπήσετε καλύτερα τα δεδομένα (θα μάθετε περισσότερα για αυτή την εργασία σε λίγο).
-
Για να εγκαταστήσετε το
imblearn
, εκτελέστεpip install
, όπως παρακάτω:pip install imblearn
-
Εισάγετε τα πακέτα που χρειάζεστε για να εισάγετε τα δεδομένα σας και να τα οπτικοποιήσετε, επίσης εισάγετε το
SMOTE
από τοimblearn
.import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE
Τώρα είστε έτοιμοι να εισάγετε τα δεδομένα στη συνέχεια.
-
Η επόμενη εργασία θα είναι να εισάγετε τα δεδομένα:
df = pd.read_csv('../data/cuisines.csv')
Χρησιμοποιώντας το
read_csv()
θα διαβάσετε το περιεχόμενο του αρχείου csv cusines.csv και θα το τοποθετήσετε στη μεταβλητήdf
. -
Ελέγξτε το σχήμα των δεδομένων:
df.head()
Οι πρώτες πέντε γραμμές μοιάζουν με αυτές:
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Πάρτε πληροφορίες για αυτά τα δεδομένα καλώντας το
info()
:df.info()
Η έξοδός σας μοιάζει με:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2448 entries, 0 to 2447 Columns: 385 entries, Unnamed: 0 to zucchini dtypes: int64(384), object(1) memory usage: 7.2+ MB
Άσκηση - μάθηση για τις κουζίνες
Τώρα η εργασία αρχίζει να γίνεται πιο ενδιαφέρουσα. Ας ανακαλύψουμε τη διανομή των δεδομένων, ανά κουζίνα.
-
Οπτικοποιήστε τα δεδομένα ως μπάρες καλώντας το
barh()
:df.cuisine.value_counts().plot.barh()
Υπάρχει ένας πεπερασμένος αριθμός κουζινών, αλλά η διανομή των δεδομένων είναι άνιση. Μπορείτε να το διορθώσετε! Πριν το κάνετε, εξερευνήστε λίγο περισσότερο.
-
Βρείτε πόσα δεδομένα είναι διαθέσιμα ανά κουζίνα και εκτυπώστε τα:
thai_df = df[(df.cuisine == "thai")] japanese_df = df[(df.cuisine == "japanese")] chinese_df = df[(df.cuisine == "chinese")] indian_df = df[(df.cuisine == "indian")] korean_df = df[(df.cuisine == "korean")] print(f'thai df: {thai_df.shape}') print(f'japanese df: {japanese_df.shape}') print(f'chinese df: {chinese_df.shape}') print(f'indian df: {indian_df.shape}') print(f'korean df: {korean_df.shape}')
η έξοδος μοιάζει με:
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
Ανακαλύπτοντας συστατικά
Τώρα μπορείτε να εμβαθύνετε στα δεδομένα και να μάθετε ποια είναι τα τυπικά συστατικά ανά κουζίνα. Θα πρέπει να καθαρίσετε επαναλαμβανόμενα δεδομένα που δημιουργούν σύγχυση μεταξύ κουζινών, οπότε ας μάθουμε για αυτό το πρόβλημα.
-
Δημιουργήστε μια συνάρτηση
create_ingredient()
σε Python για να δημιουργήσετε ένα dataframe συστατικών. Αυτή η συνάρτηση θα ξεκινήσει με την αφαίρεση μιας μη χρήσιμης στήλης και θα ταξινομήσει τα συστατικά ανάλογα με την καταμέτρησή τους:def create_ingredient_df(df): ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False) return ingredient_df
Τώρα μπορείτε να χρησιμοποιήσετε αυτή τη συνάρτηση για να πάρετε μια ιδέα για τα δέκα πιο δημοφιλή συστατικά ανά κουζίνα.
-
Καλέστε το
create_ingredient()
και οπτικοποιήστε το καλώντας τοbarh()
:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
Κάντε το ίδιο για τα δεδομένα της ιαπωνικής κουζίνας:
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
Τώρα για τα κινέζικα συστατικά:
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
Οπτικοποιήστε τα ινδικά συστατικά:
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
Τέλος, οπτικοποιήστε τα κορεάτικα συστατικά:
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
Τώρα, αφαιρέστε τα πιο κοινά συστατικά που δημιουργούν σύγχυση μεταξύ διαφορετικών κουζινών, καλώντας το
drop()
:Όλοι αγαπούν το ρύζι, το σκόρδο και το τζίντζερ!
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
Ισορροπήστε το σύνολο δεδομένων
Τώρα που έχετε καθαρίσει τα δεδομένα, χρησιμοποιήστε το SMOTE - "Τεχνική Συνθετικής Υπερδειγματοληψίας Μειονοτήτων" - για να τα ισορροπήσετε.
-
Καλέστε το
fit_resample()
, αυτή η στρατηγική δημιουργεί νέα δείγματα μέσω παρεμβολής.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
Με την ισορροπία των δεδομένων σας, θα έχετε καλύτερα αποτελέσματα κατά την ταξινόμησή τους. Σκεφτείτε μια δυαδική ταξινόμηση. Αν τα περισσότερα από τα δεδομένα σας είναι μιας κατηγορίας, ένα μοντέλο ML θα προβλέψει αυτή την κατηγορία πιο συχνά, απλώς επειδή υπάρχουν περισσότερα δεδομένα για αυτήν. Η ισορροπία των δεδομένων αφαιρεί οποιαδήποτε ανισορροπία.
-
Τώρα μπορείτε να ελέγξετε τους αριθμούς των ετικετών ανά συστατικό:
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
Η έξοδός σας μοιάζει με:
new label count: korean 799 chinese 799 indian 799 japanese 799 thai 799 Name: cuisine, dtype: int64 old label count: korean 799 indian 598 chinese 442 japanese 320 thai 289 Name: cuisine, dtype: int64
Τα δεδομένα είναι καθαρά, ισορροπημένα και πολύ νόστιμα!
-
Το τελευταίο βήμα είναι να αποθηκεύσετε τα ισορροπημένα δεδομένα σας, συμπεριλαμβανομένων των ετικετών και των χαρακτηριστικών, σε ένα νέο dataframe που μπορεί να εξαχθεί σε ένα αρχείο:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
Μπορείτε να ρίξετε μια τελευταία ματιά στα δεδομένα χρησιμοποιώντας
transformed_df.head()
καιtransformed_df.info()
. Αποθηκεύστε ένα αντίγραφο αυτών των δεδομένων για χρήση σε μελλοντικά μαθήματα:transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
Αυτό το νέο CSV μπορεί τώρα να βρεθεί στον ριζικό φάκελο δεδομένων.
🚀Πρόκληση
Αυτό το πρόγραμμα σπουδών περιέχει αρκετά ενδιαφέροντα σύνολα δεδομένων. Ψάξτε στους φακέλους data
και δείτε αν κάποιο περιέχει σύνολα δεδομένων που θα ήταν κατάλληλα για δυαδική ή πολυκατηγορική ταξινόμηση. Τι ερωτήσεις θα θέτατε σε αυτό το σύνολο δεδομένων;
Μετά το μάθημα κουίζ
Ανασκόπηση & Αυτομελέτη
Εξερευνήστε το API του SMOTE. Για ποιες περιπτώσεις χρήσης είναι καλύτερα να χρησιμοποιηθεί; Ποια προβλήματα λύνει;
Εργασία
Εξερευνήστε μεθόδους ταξινόμησης
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.