|
|
3 months ago | |
|---|---|---|
| .. | ||
| solution | 5 months ago | |
| README.md | 3 months ago | |
| assignment.md | 5 months ago | |
| notebook.ipynb | 10 months ago | |
README.md
Ταξινομητές Κουζίνας 1
Σε αυτό το μάθημα, θα χρησιμοποιήσετε το σύνολο δεδομένων που αποθηκεύσατε από το προηγούμενο μάθημα, γεμάτο με ισορροπημένα, καθαρά δεδομένα σχετικά με τις κουζίνες.
Θα χρησιμοποιήσετε αυτό το σύνολο δεδομένων με διάφορους ταξινομητές για να προβλέψετε μια συγκεκριμένη εθνική κουζίνα βασισμένη σε μια ομάδα συστατικών. Καθώς το κάνετε, θα μάθετε περισσότερα για μερικούς από τους τρόπους με τους οποίους οι αλγόριθμοι μπορούν να αξιοποιηθούν για εργασίες ταξινόμησης.
Προ-διάλεξη quiz
Προετοιμασία
Υποθέτοντας ότι ολοκληρώσατε το Μάθημα 1, βεβαιωθείτε ότι υπάρχει ένα αρχείο cleaned_cuisines.csv στο ριζικό φάκελο /data για αυτά τα τέσσερα μαθήματα.
Άσκηση - πρόβλεψη εθνικής κουζίνας
-
Εργαζόμενοι στον φάκελο notebook.ipynb αυτού του μαθήματος, εισάγετε αυτό το αρχείο μαζί με τη βιβλιοθήκη Pandas:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_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 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Τώρα, εισάγετε μερικές ακόμα βιβλιοθήκες:
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve from sklearn.svm import SVC import numpy as np -
Χωρίστε τις συντεταγμένες X και y σε δύο πλαίσια δεδομένων για εκπαίδευση. Το
cuisineμπορεί να είναι το πλαίσιο δεδομένων των ετικετών:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()Θα μοιάζει έτσι:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
Αφαιρέστε τη στήλη
Unnamed: 0και τη στήληcuisine, χρησιμοποιώντας τοdrop(). Αποθηκεύστε τα υπόλοιπα δεδομένα ως χαρακτηριστικά που μπορούν να εκπαιδευτούν:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Τα χαρακτηριστικά σας μοιάζουν έτσι:
| almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Τώρα είστε έτοιμοι να εκπαιδεύσετε το μοντέλο σας!
Επιλογή του ταξινομητή σας
Τώρα που τα δεδομένα σας είναι καθαρά και έτοιμα για εκπαίδευση, πρέπει να αποφασίσετε ποιος αλγόριθμος να χρησιμοποιηθεί για την εργασία.
Το Scikit-learn ομαδοποιεί την ταξινόμηση κάτω από την Επιβλεπόμενη Μάθηση, και σε αυτή την κατηγορία θα βρείτε πολλούς τρόπους ταξινόμησης. Η ποικιλία είναι αρκετά μπερδεμένη με την πρώτη ματιά. Οι ακόλουθες μέθοδοι περιλαμβάνουν τεχνικές ταξινόμησης:
- Γραμμικά Μοντέλα
- Support Vector Machines
- Στοχαστική Κατάβαση Κλίσης
- Κοντινότεροι Γείτονες
- Gaussian Processes
- Δέντρα Απόφασης
- Μέθοδοι συνόλου (voting Classifier)
- Αλγόριθμοι πολυκατηγορίας και πολλαπλής εξόδου (ταξινόμηση πολυκατηγορίας και πολυετικετών, πολυκατηγορία-πολλαπλή έξοδος)
Μπορείτε επίσης να χρησιμοποιήσετε νευρωνικά δίκτυα για ταξινόμηση δεδομένων, αλλά αυτό είναι εκτός του πεδίου αυτού του μαθήματος.
Ποιον ταξινομητή να επιλέξετε;
Λοιπόν, ποιον ταξινομητή πρέπει να επιλέξετε; Συχνά, το να δοκιμάσετε αρκετούς και να ψάξετε για ένα καλό αποτέλεσμα είναι ένας τρόπος δοκιμής. Το Scikit-learn προσφέρει μια παράλληλη σύγκριση σε δημιουργημένο σύνολο δεδομένων, συγκρίνοντας τους KNeighbors, SVC με δύο τρόπους, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB και QuadraticDiscrinationAnalysis, δείχνοντας τα αποτελέσματα οπτικοποιημένα:
Διαγράμματα που δημιουργήθηκαν στην τεκμηρίωση του Scikit-learn
Το AutoML λύνει αυτό το πρόβλημα επιδέξια εκτελώντας αυτές τις συγκρίσεις στο cloud, επιτρέποντάς σας να επιλέξετε τον καλύτερο αλγόριθμο για τα δεδομένα σας. Δοκιμάστε το εδώ
Μια καλύτερη προσέγγιση
Μια καλύτερη μέθοδος από το άγριο μάντεμα είναι να ακολουθήσετε τις ιδέες αυτού του ληξιαρίου ML Cheat sheet που μπορείτε να κατεβάσετε. Εδώ, ανακαλύπτουμε ότι για το πρόβλημα πολυκατηγορίας που έχουμε, υπάρχουν μερικές επιλογές:
Μια ενότητα του Algorithm Cheat Sheet της Microsoft, που περιγράφει τις επιλογές πολυκατηγορικής ταξινόμησης
✅ Κατεβάστε αυτό το cheat sheet, τυπώστε το και κρεμάστε το στον τοίχο σας!
Λογική σκέψη
Ας δούμε αν μπορούμε να σκεφτούμε διαφορετικές προσεγγίσεις με βάση τους περιορισμούς που έχουμε:
- Τα νευρωνικά δίκτυα είναι πολύ βαριά. Δεδομένου του καθαρού, αλλά μικρού συνόλου δεδομένων, και του γεγονότος ότι εκτελούμε την εκπαίδευση τοπικά μέσω notebooks, τα νευρωνικά δίκτυα είναι πολύ βαριά για αυτή την εργασία.
- Δεν χρησιμοποιούμε ταξινομητή δύο κατηγοριών. Δεν χρησιμοποιούμε ταξινομητή δύο κατηγοριών, οπότε αποκλείεται το one-vs-all.
- Ένα δέντρο απόφασης ή λογιστική παλινδρόμηση μπορεί να δουλέψει. Ένα δέντρο απόφασης μπορεί να λειτουργήσει, ή λογιστική παλινδρόμηση για δεδομένα πολυκατηγορίας.
- Τα πολυκατηγορικά ενισχυμένα δέντρα απόφασης επιλύουν διαφορετικό πρόβλημα. Το πολυκατηγορικό ενισχυμένο δέντρο απόφασης είναι πιο κατάλληλο για μη παραμετρικά καθήκοντα, π.χ. καθήκοντα που σχεδιάζονται για κατασκευή κατατάξεων, οπότε δεν είναι χρήσιμο για εμάς.
Χρήση Scikit-learn
Θα χρησιμοποιήσουμε το Scikit-learn για να αναλύσουμε τα δεδομένα μας. Ωστόσο, υπάρχουν πολλοί τρόποι να χρησιμοποιήσετε τη λογιστική παλινδρόμηση στο Scikit-learn. Ρίξτε μια ματιά στις παραμέτρους που πρέπει να περάσετε.
Ουσιαστικά υπάρχουν δύο σημαντικές παράμετροι - multi_class και solver - που πρέπει να καθορίσουμε όταν ζητάμε από το Scikit-learn να εκτελέσει λογιστική παλινδρόμηση. Η τιμή multi_class επιβάλλει μια συγκεκριμένη συμπεριφορά. Η τιμή του solver είναι ποιος αλγόριθμος θα χρησιμοποιηθεί. Δεν μπορούν όλοι οι solvers να συνδυαστούν με όλες τις τιμές multi_class.
Σύμφωνα με την τεκμηρίωση, στην περίπτωση πολυκατηγορίας, ο αλγόριθμος εκπαίδευσης:
- Χρησιμοποιεί το σχήμα one-vs-rest (OvR), αν η επιλογή
multi_classείναι ορισμένη σεovr - Χρησιμοποιεί την απώλεια cross-entropy, αν η επιλογή
multi_classείναι ορισμένη σεmultinomial. (Προς το παρόν η επιλογήmultinomialυποστηρίζεται μόνο από τους λύτες ‘lbfgs’, ‘sag’, ‘saga’ και ‘newton-cg’)."
🎓 Το 'σχήμα' μπορεί να είναι είτε 'ovr' (one-vs-rest) είτε 'multinomial'. Επειδή η λογιστική παλινδρόμηση είναι σχεδιασμένη κυρίως για δυαδική ταξινόμηση, αυτά τα σχήματα της επιτρέπουν να χειριστεί καλύτερα τα καθήκοντα πολυκατηγορικής ταξινόμησης. πηγή
🎓 Ο 'λύτης' ορίζεται ως "ο αλγόριθμος που χρησιμοποιείται στο πρόβλημα βελτιστοποίησης". πηγή.
Το Scikit-learn προσφέρει αυτόν τον πίνακα για να εξηγήσει πώς οι λύτες χειρίζονται διαφορετικές προκλήσεις που παρουσιάζονται από διαφορετικούς τύπους δομών δεδομένων:
Άσκηση - διαχωρισμός δεδομένων
Μπορούμε να εστιάσουμε στη λογιστική παλινδρόμηση για την πρώτη μας προσπάθεια εκπαίδευσης αφού μάθατε πρόσφατα σχετικά με αυτή σε προηγούμενο μάθημα.
Διαχωρίστε τα δεδομένα σας σε ομάδες εκπαίδευσης και δοκιμών καλώντας το train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Άσκηση - εφαρμόστε λογιστική παλινδρόμηση
Επειδή χρησιμοποιείτε την περίπτωση πολυκατηγορίας, πρέπει να επιλέξετε ποιο σχήμα θα χρησιμοποιήσετε και ποιο λύτη θα ορίσετε. Χρησιμοποιήστε το LogisticRegression με ρύθμιση πολυκατηγορίας και τον liblinear λύτη για εκπαίδευση.
-
Δημιουργήστε ένα logistic regression με
multi_classορισμένο σεovrκαι τον λύτη σεliblinear:lr = LogisticRegression(multi_class='ovr',solver='liblinear') model = lr.fit(X_train, np.ravel(y_train)) accuracy = model.score(X_test, y_test) print ("Accuracy is {}".format(accuracy))✅ Δοκιμάστε έναν διαφορετικό λύτη όπως
lbfgs, που συχνά ορίζεται ως προεπιλογήΣημείωση, χρησιμοποιήστε τη συνάρτηση
ravelτης Pandas για να ισιώσετε τα δεδομένα σας όταν χρειάζεται.Η ακρίβεια είναι καλή και πάνω από 80%!
-
Μπορείτε να δείτε αυτό το μοντέλο σε δράση δοκιμάζοντας μια γραμμή δεδομένων (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')Το αποτέλεσμα τυπώνεται:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian✅ Δοκιμάστε διαφορετικό αριθμό γραμμής και ελέγξτε τα αποτελέσματα
-
Βαθύτερα, μπορείτε να ελέγξετε την ακρίβεια αυτής της πρόβλεψης:
test= X_test.iloc[50].values.reshape(-1, 1).T proba = model.predict_proba(test) classes = model.classes_ resultdf = pd.DataFrame(data=proba, columns=classes) topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) topPrediction.head()Το αποτέλεσμα εκτυπώνεται - Η ινδική κουζίνα είναι η καλύτερη εικασία, με καλή πιθανότητα:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Μπορείτε να εξηγήσετε γιατί το μοντέλο είναι αρκετά σίγουρο ότι αυτή είναι μια ινδική κουζίνα;
-
Πάρτε περισσότερες λεπτομέρειες εκτυπώνοντας μια αναφορά ταξινόμησης, όπως κάνατε στα μαθήματα παλινδρόμησης:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))precision recall f1-score support chinese 0.73 0.71 0.72 229 indian 0.91 0.93 0.92 254 japanese 0.70 0.75 0.72 220 korean 0.86 0.76 0.81 242 thai 0.79 0.85 0.82 254 accuracy 0.80 1199 macro avg 0.80 0.80 0.80 1199 weighted avg 0.80 0.80 0.80 1199
🚀Πρόκληση
Σε αυτό το μάθημα, χρησιμοποιήσατε τα καθαρισμένα σας δεδομένα για να δημιουργήσετε ένα μοντέλο μηχανικής μάθησης που μπορεί να προβλέψει μια εθνική κουζίνα βάσει μιας σειράς συστατικών. Αφιερώστε λίγο χρόνο για να διαβάσετε τις πολλές επιλογές που παρέχει το Scikit-learn για την ταξινόμηση δεδομένων. Εμβαθύνετε στην έννοια του 'solver' για να κατανοήσετε τι συμβαίνει πίσω από τις σκηνές.
Μετα-διάλεξη quiz
Ανασκόπηση & Αυτομελέτη
Εμβαθύνετε λίγο περισσότερο στα μαθηματικά πίσω από την λογιστική παλινδρόμηση σε αυτό το μάθημα
Ανάθεση
Αποποίηση Ευθυνών:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI Co-op Translator. Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να γνωρίζετε ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το αρχικό έγγραφο στην μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για οποιεσδήποτε παρεξηγήσεις ή λανθασμένες ερμηνείες προκύψουν από τη χρήση αυτής της μετάφρασης.


