You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/el/4-Classification/2-Classifiers-1/README.md

247 lines
22 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Ταξινομητές Κουζίνας 1
Σε αυτό το μάθημα, θα χρησιμοποιήσετε το σύνολο δεδομένων που αποθηκεύσατε από το προηγούμενο μάθημα, γεμάτο με ισορροπημένα, καθαρά δεδομένα σχετικά με τις κουζίνες.
Θα χρησιμοποιήσετε αυτό το σύνολο δεδομένων με διάφορους ταξινομητές για να ροβλέψετε μια συγκεκριμένη εθνική κουζίνα βασισμένη σε μια ομάδα συστατικών_. Καθώς το κάνετε, θα μάθετε περισσότερα για μερικούς από τους τρόπους με τους οποίους οι αλγόριθμοι μπορούν να αξιοποιηθούν για εργασίες ταξινόμησης.
## [Προ-διάλεξη quiz](https://ff-quizzes.netlify.app/en/ml/)
# Προετοιμασία
Υποθέτοντας ότι ολοκληρώσατε το [Μάθημα 1](../1-Introduction/README.md), βεβαιωθείτε ότι υπάρχει ένα αρχείο _cleaned_cuisines.csv_ στο ριζικό φάκελο `/data` για αυτά τα τέσσερα μαθήματα.
## Άσκηση - πρόβλεψη εθνικής κουζίνας
1. Εργαζόμενοι στον φάκελο _notebook.ipynb_ αυτού του μαθήματος, εισάγετε αυτό το αρχείο μαζί με τη βιβλιοθήκη Pandas:
```python
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 |
1. Τώρα, εισάγετε μερικές ακόμα βιβλιοθήκες:
```python
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
```
1. Χωρίστε τις συντεταγμένες X και y σε δύο πλαίσια δεδομένων για εκπαίδευση. Το `cuisine` μπορεί να είναι το πλαίσιο δεδομένων των ετικετών:
```python
cuisines_label_df = cuisines_df['cuisine']
cuisines_label_df.head()
```
Θα μοιάζει έτσι:
```output
0 indian
1 indian
2 indian
3 indian
4 indian
Name: cuisine, dtype: object
```
1. Αφαιρέστε τη στήλη `Unnamed: 0` και τη στήλη `cuisine`, χρησιμοποιώντας το `drop()`. Αποθηκεύστε τα υπόλοιπα δεδομένα ως χαρακτηριστικά που μπορούν να εκπαιδευτούν:
```python
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 | 0 |
| 1 | 1 | 0 | 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 | 0 |
| 3 | 0 | 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 | 0 |
Τώρα είστε έτοιμοι να εκπαιδεύσετε το μοντέλο σας!
## Επιλογή του ταξινομητή σας
Τώρα που τα δεδομένα σας είναι καθαρά και έτοιμα για εκπαίδευση, πρέπει να αποφασίσετε ποιος αλγόριθμος να χρησιμοποιηθεί για την εργασία.
Το Scikit-learn ομαδοποιεί την ταξινόμηση κάτω από την Επιβλεπόμενη Μάθηση, και σε αυτή την κατηγορία θα βρείτε πολλούς τρόπους ταξινόμησης. [Η ποικιλία](https://scikit-learn.org/stable/supervised_learning.html) είναι αρκετά μπερδεμένη με την πρώτη ματιά. Οι ακόλουθες μέθοδοι περιλαμβάνουν τεχνικές ταξινόμησης:
- Γραμμικά Μοντέλα
- Support Vector Machines
- Στοχαστική Κατάβαση Κλίσης
- Κοντινότεροι Γείτονες
- Gaussian Processes
- Δέντρα Απόφασης
- Μέθοδοι συνόλου (voting Classifier)
- Αλγόριθμοι πολυκατηγορίας και πολλαπλής εξόδου (ταξινόμηση πολυκατηγορίας και πολυετικετών, πολυκατηγορία-πολλαπλή έξοδος)
> Μπορείτε επίσης να χρησιμοποιήσετε [νευρωνικά δίκτυα για ταξινόμηση δεδομένων](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), αλλά αυτό είναι εκτός του πεδίου αυτού του μαθήματος.
### Ποιον ταξινομητή να επιλέξετε;
Λοιπόν, ποιον ταξινομητή πρέπει να επιλέξετε; Συχνά, το να δοκιμάσετε αρκετούς και να ψάξετε για ένα καλό αποτέλεσμα είναι ένας τρόπος δοκιμής. Το Scikit-learn προσφέρει μια [παράλληλη σύγκριση](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) σε δημιουργημένο σύνολο δεδομένων, συγκρίνοντας τους KNeighbors, SVC με δύο τρόπους, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB και QuadraticDiscrinationAnalysis, δείχνοντας τα αποτελέσματα οπτικοποιημένα:
![σύγκριση ταξινομητών](../../../../translated_images/el/comparison.edfab56193a85e7f.webp)
> Διαγράμματα που δημιουργήθηκαν στην τεκμηρίωση του Scikit-learn
> Το AutoML λύνει αυτό το πρόβλημα επιδέξια εκτελώντας αυτές τις συγκρίσεις στο cloud, επιτρέποντάς σας να επιλέξετε τον καλύτερο αλγόριθμο για τα δεδομένα σας. Δοκιμάστε το [εδώ](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
### Μια καλύτερη προσέγγιση
Μια καλύτερη μέθοδος από το άγριο μάντεμα είναι να ακολουθήσετε τις ιδέες αυτού του ληξιαρίου [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott) που μπορείτε να κατεβάσετε. Εδώ, ανακαλύπτουμε ότι για το πρόβλημα πολυκατηγορίας που έχουμε, υπάρχουν μερικές επιλογές:
![cheatsheet για προβλήματα πολυκατηγορίας](../../../../translated_images/el/cheatsheet.07a475ea444d2223.webp)
> Μια ενότητα του Algorithm Cheat Sheet της Microsoft, που περιγράφει τις επιλογές πολυκατηγορικής ταξινόμησης
✅ Κατεβάστε αυτό το cheat sheet, τυπώστε το και κρεμάστε το στον τοίχο σας!
### Λογική σκέψη
Ας δούμε αν μπορούμε να σκεφτούμε διαφορετικές προσεγγίσεις με βάση τους περιορισμούς που έχουμε:
- **Τα νευρωνικά δίκτυα είναι πολύ βαριά**. Δεδομένου του καθαρού, αλλά μικρού συνόλου δεδομένων, και του γεγονότος ότι εκτελούμε την εκπαίδευση τοπικά μέσω notebooks, τα νευρωνικά δίκτυα είναι πολύ βαριά για αυτή την εργασία.
- **Δεν χρησιμοποιούμε ταξινομητή δύο κατηγοριών**. Δεν χρησιμοποιούμε ταξινομητή δύο κατηγοριών, οπότε αποκλείεται το one-vs-all.
- **Ένα δέντρο απόφασης ή λογιστική παλινδρόμηση μπορεί να δουλέψει**. Ένα δέντρο απόφασης μπορεί να λειτουργήσει, ή λογιστική παλινδρόμηση για δεδομένα πολυκατηγορίας.
- **Τα πολυκατηγορικά ενισχυμένα δέντρα απόφασης επιλύουν διαφορετικό πρόβλημα**. Το πολυκατηγορικό ενισχυμένο δέντρο απόφασης είναι πιο κατάλληλο για μη παραμετρικά καθήκοντα, π.χ. καθήκοντα που σχεδιάζονται για κατασκευή κατατάξεων, οπότε δεν είναι χρήσιμο για εμάς.
### Χρήση Scikit-learn
Θα χρησιμοποιήσουμε το Scikit-learn για να αναλύσουμε τα δεδομένα μας. Ωστόσο, υπάρχουν πολλοί τρόποι να χρησιμοποιήσετε τη λογιστική παλινδρόμηση στο Scikit-learn. Ρίξτε μια ματιά στις [παραμέτρους που πρέπει να περάσετε](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
Ουσιαστικά υπάρχουν δύο σημαντικές παράμετροι - `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'. Επειδή η λογιστική παλινδρόμηση είναι σχεδιασμένη κυρίως για δυαδική ταξινόμηση, αυτά τα σχήματα της επιτρέπουν να χειριστεί καλύτερα τα καθήκοντα πολυκατηγορικής ταξινόμησης. [πηγή](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 Ο 'λύτης' ορίζεται ως "ο αλγόριθμος που χρησιμοποιείται στο πρόβλημα βελτιστοποίησης". [πηγή](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
Το Scikit-learn προσφέρει αυτόν τον πίνακα για να εξηγήσει πώς οι λύτες χειρίζονται διαφορετικές προκλήσεις που παρουσιάζονται από διαφορετικούς τύπους δομών δεδομένων:
![λύτες](../../../../translated_images/el/solvers.5fc648618529e627.webp)
## Άσκηση - διαχωρισμός δεδομένων
Μπορούμε να εστιάσουμε στη λογιστική παλινδρόμηση για την πρώτη μας προσπάθεια εκπαίδευσης αφού μάθατε πρόσφατα σχετικά με αυτή σε προηγούμενο μάθημα.
Διαχωρίστε τα δεδομένα σας σε ομάδες εκπαίδευσης και δοκιμών καλώντας το `train_test_split()`:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## Άσκηση - εφαρμόστε λογιστική παλινδρόμηση
Επειδή χρησιμοποιείτε την περίπτωση πολυκατηγορίας, πρέπει να επιλέξετε ποιο _σχήμα_ θα χρησιμοποιήσετε και ποιο _λύτη_ θα ορίσετε. Χρησιμοποιήστε το LogisticRegression με ρύθμιση πολυκατηγορίας και τον **liblinear** λύτη για εκπαίδευση.
1. Δημιουργήστε ένα logistic regression με `multi_class` ορισμένο σε `ovr` και τον λύτη σε `liblinear`:
```python
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`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) της Pandas για να ισιώσετε τα δεδομένα σας όταν χρειάζεται.
Η ακρίβεια είναι καλή και πάνω από **80%**!
1. Μπορείτε να δείτε αυτό το μοντέλο σε δράση δοκιμάζοντας μια γραμμή δεδομένων (#50):
```python
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
print(f'cuisine: {y_test.iloc[50]}')
```
Το αποτέλεσμα τυπώνεται:
```output
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
cuisine: indian
```
✅ Δοκιμάστε διαφορετικό αριθμό γραμμής και ελέγξτε τα αποτελέσματα
1. Βαθύτερα, μπορείτε να ελέγξετε την ακρίβεια αυτής της πρόβλεψης:
```python
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 |
✅ Μπορείτε να εξηγήσετε γιατί το μοντέλο είναι αρκετά σίγουρο ότι αυτή είναι μια ινδική κουζίνα;
1. Πάρτε περισσότερες λεπτομέρειες εκτυπώνοντας μια αναφορά ταξινόμησης, όπως κάνατε στα μαθήματα παλινδρόμησης:
```python
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](https://ff-quizzes.netlify.app/en/ml/)
## Ανασκόπηση & Αυτομελέτη
Εμβαθύνετε λίγο περισσότερο στα μαθηματικά πίσω από την λογιστική παλινδρόμηση σε [αυτό το μάθημα](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## Ανάθεση
[Μελετήστε τους λύτες](assignment.md)
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Αποποίηση Ευθυνών**:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να γνωρίζετε ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το αρχικό έγγραφο στην μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για οποιεσδήποτε παρεξηγήσεις ή λανθασμένες ερμηνείες προκύψουν από τη χρήση αυτής της μετάφρασης.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->