# Δημιουργία μοντέλου παλινδρόμησης με χρήση Scikit-learn: προετοιμασία και οπτικοποίηση δεδομένων ![Infographic οπτικοποίησης δεδομένων](../../../../2-Regression/2-Data/images/data-visualization.png) Infographic από [Dasani Madipalli](https://twitter.com/dasani_decoded) ## [Προ-μάθημα quiz](https://ff-quizzes.netlify.app/en/ml/) > ### [Αυτό το μάθημα είναι διαθέσιμο και σε R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) ## Εισαγωγή Τώρα που έχετε εξοπλιστεί με τα εργαλεία που χρειάζεστε για να ξεκινήσετε τη δημιουργία μοντέλων μηχανικής μάθησης με το Scikit-learn, είστε έτοιμοι να αρχίσετε να θέτετε ερωτήματα στα δεδομένα σας. Καθώς εργάζεστε με δεδομένα και εφαρμόζετε λύσεις ML, είναι πολύ σημαντικό να κατανοήσετε πώς να θέσετε τη σωστή ερώτηση για να αξιοποιήσετε πλήρως τις δυνατότητες του συνόλου δεδομένων σας. Σε αυτό το μάθημα, θα μάθετε: - Πώς να προετοιμάσετε τα δεδομένα σας για τη δημιουργία μοντέλων. - Πώς να χρησιμοποιήσετε το Matplotlib για την οπτικοποίηση δεδομένων. ## Θέτοντας τη σωστή ερώτηση στα δεδομένα σας Η ερώτηση που θέλετε να απαντήσετε θα καθορίσει τον τύπο των αλγορίθμων ML που θα χρησιμοποιήσετε. Και η ποιότητα της απάντησης που θα λάβετε θα εξαρτηθεί σε μεγάλο βαθμό από τη φύση των δεδομένων σας. Ρίξτε μια ματιά στα [δεδομένα](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) που παρέχονται για αυτό το μάθημα. Μπορείτε να ανοίξετε αυτό το αρχείο .csv στο VS Code. Μια γρήγορη ματιά δείχνει αμέσως ότι υπάρχουν κενά και ένας συνδυασμός συμβολοσειρών και αριθμητικών δεδομένων. Υπάρχει επίσης μια περίεργη στήλη που ονομάζεται 'Package', όπου τα δεδομένα είναι ένας συνδυασμός μεταξύ 'sacks', 'bins' και άλλων τιμών. Τα δεδομένα, στην πραγματικότητα, είναι λίγο ακατάστατα. [![ML για αρχάριους - Πώς να αναλύσετε και να καθαρίσετε ένα σύνολο δεδομένων](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML για αρχάριους - Πώς να αναλύσετε και να καθαρίσετε ένα σύνολο δεδομένων") > 🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα σύντομο βίντεο που δείχνει πώς να προετοιμάσετε τα δεδομένα για αυτό το μάθημα. Στην πραγματικότητα, δεν είναι πολύ συνηθισμένο να σας δοθεί ένα σύνολο δεδομένων που είναι πλήρως έτοιμο για χρήση για τη δημιουργία ενός μοντέλου ML από την αρχή. Σε αυτό το μάθημα, θα μάθετε πώς να προετοιμάσετε ένα ακατέργαστο σύνολο δεδομένων χρησιμοποιώντας τις τυπικές βιβλιοθήκες Python. Θα μάθετε επίσης διάφορες τεχνικές για την οπτικοποίηση των δεδομένων. ## Μελέτη περίπτωσης: 'η αγορά κολοκύθας' Σε αυτόν τον φάκελο θα βρείτε ένα αρχείο .csv στον κύριο φάκελο `data` που ονομάζεται [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), το οποίο περιλαμβάνει 1757 γραμμές δεδομένων σχετικά με την αγορά κολοκύθας, ταξινομημένες σε ομάδες ανά πόλη. Αυτά είναι ακατέργαστα δεδομένα που εξάγονται από τις [Ειδικές Αναφορές Τερματικών Αγορών Καλλιεργειών](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) που διανέμονται από το Υπουργείο Γεωργίας των Ηνωμένων Πολιτειών. ### Προετοιμασία δεδομένων Αυτά τα δεδομένα είναι δημόσια διαθέσιμα. Μπορούν να ληφθούν σε πολλά ξεχωριστά αρχεία, ανά πόλη, από τον ιστότοπο του USDA. Για να αποφύγουμε πάρα πολλά ξεχωριστά αρχεία, έχουμε συνενώσει όλα τα δεδομένα των πόλεων σε ένα υπολογιστικό φύλλο, επομένως έχουμε ήδη _προετοιμάσει_ τα δεδομένα λίγο. Στη συνέχεια, ας ρίξουμε μια πιο προσεκτική ματιά στα δεδομένα. ### Τα δεδομένα κολοκύθας - πρώιμα συμπεράσματα Τι παρατηρείτε σχετικά με αυτά τα δεδομένα; Έχετε ήδη δει ότι υπάρχει ένας συνδυασμός συμβολοσειρών, αριθμών, κενών και περίεργων τιμών που πρέπει να κατανοήσετε. Ποια ερώτηση μπορείτε να θέσετε σε αυτά τα δεδομένα, χρησιμοποιώντας μια τεχνική παλινδρόμησης; Τι θα λέγατε για "Πρόβλεψη της τιμής μιας κολοκύθας προς πώληση κατά τη διάρκεια ενός συγκεκριμένου μήνα". Κοιτάζοντας ξανά τα δεδομένα, υπάρχουν κάποιες αλλαγές που πρέπει να κάνετε για να δημιουργήσετε τη δομή δεδομένων που είναι απαραίτητη για την εργασία. ## Άσκηση - ανάλυση των δεδομένων κολοκύθας Ας χρησιμοποιήσουμε το [Pandas](https://pandas.pydata.org/), (το όνομα προέρχεται από το `Python Data Analysis`) ένα εργαλείο πολύ χρήσιμο για τη διαμόρφωση δεδομένων, για να αναλύσουμε και να προετοιμάσουμε αυτά τα δεδομένα κολοκύθας. ### Πρώτα, ελέγξτε για ελλείπουσες ημερομηνίες Πρώτα θα χρειαστεί να λάβετε μέτρα για να ελέγξετε για ελλείπουσες ημερομηνίες: 1. Μετατρέψτε τις ημερομηνίες σε μορφή μήνα (αυτές είναι ημερομηνίες των ΗΠΑ, επομένως η μορφή είναι `MM/DD/YYYY`). 2. Εξαγάγετε τον μήνα σε μια νέα στήλη. Ανοίξτε το αρχείο _notebook.ipynb_ στο Visual Studio Code και εισαγάγετε το υπολογιστικό φύλλο σε ένα νέο dataframe Pandas. 1. Χρησιμοποιήστε τη συνάρτηση `head()` για να δείτε τις πρώτες πέντε γραμμές. ```python import pandas as pd pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head() ``` ✅ Ποια συνάρτηση θα χρησιμοποιούσατε για να δείτε τις τελευταίες πέντε γραμμές; 1. Ελέγξτε αν υπάρχουν ελλείποντα δεδομένα στο τρέχον dataframe: ```python pumpkins.isnull().sum() ``` Υπάρχουν ελλείποντα δεδομένα, αλλά ίσως να μην έχουν σημασία για την εργασία που έχετε. 1. Για να κάνετε το dataframe σας πιο εύχρηστο, επιλέξτε μόνο τις στήλες που χρειάζεστε, χρησιμοποιώντας τη συνάρτηση `loc`, η οποία εξάγει από το αρχικό dataframe μια ομάδα γραμμών (περνά ως πρώτο παράμετρο) και στηλών (περνά ως δεύτερο παράμετρο). Η έκφραση `:` στην περίπτωση αυτή σημαίνει "όλες οι γραμμές". ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` ### Δεύτερον, προσδιορίστε τη μέση τιμή της κολοκύθας Σκεφτείτε πώς να προσδιορίσετε τη μέση τιμή μιας κολοκύθας σε έναν δεδομένο μήνα. Ποιες στήλες θα επιλέγατε για αυτήν την εργασία; Υπόδειξη: θα χρειαστείτε 3 στήλες. Λύση: πάρτε τον μέσο όρο των στηλών `Low Price` και `High Price` για να γεμίσετε τη νέα στήλη Price και μετατρέψτε τη στήλη Date ώστε να δείχνει μόνο τον μήνα. Ευτυχώς, σύμφωνα με τον παραπάνω έλεγχο, δεν υπάρχουν ελλείποντα δεδομένα για ημερομηνίες ή τιμές. 1. Για να υπολογίσετε τον μέσο όρο, προσθέστε τον παρακάτω κώδικα: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 month = pd.DatetimeIndex(pumpkins['Date']).month ``` ✅ Μη διστάσετε να εκτυπώσετε οποιαδήποτε δεδομένα θέλετε να ελέγξετε χρησιμοποιώντας `print(month)`. 2. Τώρα, αντιγράψτε τα μετατραπέντα δεδομένα σας σε ένα νέο dataframe Pandas: ```python new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) ``` Εκτυπώνοντας το dataframe σας θα δείτε ένα καθαρό, τακτοποιημένο σύνολο δεδομένων πάνω στο οποίο μπορείτε να δημιουργήσετε το νέο σας μοντέλο παλινδρόμησης. ### Αλλά περιμένετε! Υπάρχει κάτι περίεργο εδώ Αν κοιτάξετε τη στήλη `Package`, οι κολοκύθες πωλούνται σε πολλές διαφορετικές διαμορφώσεις. Κάποιες πωλούνται σε μέτρα '1 1/9 bushel', κάποιες σε '1/2 bushel', κάποιες ανά κολοκύθα, κάποιες ανά λίβρα και κάποιες σε μεγάλα κουτιά με διάφορα πλάτη. > Οι κολοκύθες φαίνεται να είναι πολύ δύσκολο να ζυγιστούν με συνέπεια Εξετάζοντας τα αρχικά δεδομένα, είναι ενδιαφέρον ότι οτιδήποτε έχει `Unit of Sale` ίσο με 'EACH' ή 'PER BIN' έχει επίσης τον τύπο `Package` ανά ίντσα, ανά bin ή 'each'. Οι κολοκύθες φαίνεται να είναι πολύ δύσκολο να ζυγιστούν με συνέπεια, οπότε ας τις φιλτράρουμε επιλέγοντας μόνο κολοκύθες με τη συμβολοσειρά 'bushel' στη στήλη `Package`. 1. Προσθέστε ένα φίλτρο στην κορυφή του αρχείου, κάτω από την αρχική εισαγωγή .csv: ```python pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` Αν εκτυπώσετε τα δεδομένα τώρα, μπορείτε να δείτε ότι λαμβάνετε μόνο τις περίπου 415 γραμμές δεδομένων που περιέχουν κολοκύθες ανά bushel. ### Αλλά περιμένετε! Υπάρχει ακόμα κάτι που πρέπει να κάνετε Παρατηρήσατε ότι η ποσότητα bushel ποικίλλει ανά γραμμή; Πρέπει να κανονικοποιήσετε την τιμολόγηση ώστε να δείξετε την τιμολόγηση ανά bushel, οπότε κάντε κάποιους υπολογισμούς για να την τυποποιήσετε. 1. Προσθέστε αυτές τις γραμμές μετά το μπλοκ που δημιουργεί το dataframe new_pumpkins: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) ``` ✅ Σύμφωνα με το [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), το βάρος ενός bushel εξαρτάται από τον τύπο του προϊόντος, καθώς είναι μέτρηση όγκου. "Ένα bushel ντομάτας, για παράδειγμα, υποτίθεται ότι ζυγίζει 56 λίβρες... Τα φύλλα και τα χόρτα καταλαμβάνουν περισσότερο χώρο με λιγότερο βάρος, οπότε ένα bushel σπανάκι είναι μόνο 20 λίβρες." Είναι όλα αρκετά περίπλοκα! Ας μην ασχοληθούμε με τη μετατροπή bushel σε λίβρες και αντίθετα ας τιμολογήσουμε ανά bushel. Όλη αυτή η μελέτη για bushels κολοκύθας, ωστόσο, δείχνει πόσο σημαντικό είναι να κατανοήσετε τη φύση των δεδομένων σας! Τώρα, μπορείτε να αναλύσετε την τιμολόγηση ανά μονάδα με βάση τη μέτρηση bushel τους. Αν εκτυπώσετε τα δεδομένα μία ακόμη φορά, μπορείτε να δείτε πώς έχουν τυποποιηθεί. ✅ Παρατηρήσατε ότι οι κολοκύθες που πωλούνται ανά μισό bushel είναι πολύ ακριβές; Μπορείτε να καταλάβετε γιατί; Υπόδειξη: οι μικρές κολοκύθες είναι πολύ πιο ακριβές από τις μεγάλες, πιθανώς επειδή υπάρχουν πολύ περισσότερες από αυτές ανά bushel, δεδομένου του αχρησιμοποίητου χώρου που καταλαμβάνει μία μεγάλη κολοκύθα για πίτα. ## Στρατηγικές Οπτικοποίησης Μέρος του ρόλου του επιστήμονα δεδομένων είναι να δείξει την ποιότητα και τη φύση των δεδομένων με τα οποία εργάζεται. Για να το κάνει αυτό, συχνά δημιουργεί ενδιαφέρουσες οπτικοποιήσεις, όπως διαγράμματα, γραφήματα και πίνακες, που δείχνουν διαφορετικές πτυχές των δεδομένων. Με αυτόν τον τρόπο, μπορεί να δείξει οπτικά σχέσεις και κενά που είναι δύσκολο να αποκαλυφθούν με άλλους τρόπους. [![ML για αρχάριους - Πώς να οπτικοποιήσετε δεδομένα με το Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML για αρχάριους - Πώς να οπτικοποιήσετε δεδομένα με το Matplotlib") > 🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα σύντομο βίντεο που δείχνει πώς να οπτικοποιήσετε τα δεδομένα για αυτό το μάθημα. Οι οπτικοποιήσεις μπορούν επίσης να βοηθήσουν στον προσδιορισμό της τεχνικής μηχανικής μάθησης που είναι πιο κατάλληλη για τα δεδομένα. Ένα scatterplot που φαίνεται να ακολουθεί μια γραμμή, για παράδειγμα, υποδεικνύει ότι τα δεδομένα είναι καλός υποψήφιος για μια άσκηση γραμμικής παλινδρόμησης. Μια βιβλιοθήκη οπτικοποίησης δεδομένων που λειτουργεί καλά σε Jupyter notebooks είναι το [Matplotlib](https://matplotlib.org/) (το οποίο είδατε επίσης στο προηγούμενο μάθημα). > Αποκτήστε περισσότερη εμπειρία με την οπτικοποίηση δεδομένων σε [αυτά τα tutorials](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott). ## Άσκηση - πειραματιστείτε με το Matplotlib Προσπαθήστε να δημιουργήσετε μερικά βασικά διαγράμματα για να εμφανίσετε το νέο dataframe που μόλις δημιουργήσατε. Τι θα έδειχνε ένα βασικό γραμμικό διάγραμμα; 1. Εισαγάγετε το Matplotlib στην κορυφή του αρχείου, κάτω από την εισαγωγή του Pandas: ```python import matplotlib.pyplot as plt ``` 1. Εκτελέστε ξανά ολόκληρο το notebook για να ανανεωθεί. 1. Στο κάτω μέρος του notebook, προσθέστε ένα κελί για να σχεδιάσετε τα δεδομένα ως κουτί: ```python price = new_pumpkins.Price month = new_pumpkins.Month plt.scatter(price, month) plt.show() ``` ![Ένα scatterplot που δείχνει τη σχέση τιμής με μήνα](../../../../2-Regression/2-Data/images/scatterplot.png) Είναι αυτό ένα χρήσιμο διάγραμμα; Σας εκπλήσσει κάτι σχετικά με αυτό; Δεν είναι ιδιαίτερα χρήσιμο καθώς το μόνο που κάνει είναι να εμφανίζει τα δεδομένα σας ως μια διασπορά σημείων σε έναν δεδομένο μήνα. ### Κάντε το χρήσιμο Για να εμφανιστούν χρήσιμα δεδομένα στα διαγράμματα, συνήθως πρέπει να ομαδοποιήσετε τα δεδομένα με κάποιον τρόπο. Ας προσπαθήσουμε να δημιουργήσουμε ένα διάγραμμα όπου ο άξονας y δείχνει τους μήνες και τα δεδομένα δείχνουν τη διανομή των δεδομένων. 1. Προσθέστε ένα κελί για να δημιουργήσετε ένα ομαδοποιημένο διάγραμμα στηλών: ```python new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price") ``` ![Ένα διάγραμμα στηλών που δείχνει τη σχέση τιμής με μήνα](../../../../2-Regression/2-Data/images/barchart.png) Αυτό είναι μια πιο χρήσιμη οπτικοποίηση δεδομένων! Φαίνεται να δείχνει ότι η υψηλότερη τιμή για τις κολοκύθες εμφανίζεται τον Σεπτέμβριο και τον Οκτώβριο. Ανταποκρίνεται αυτό στις προσδοκίες σας; Γιατί ή γιατί όχι; --- ## 🚀Πρόκληση Εξερευνήστε τους διαφορετικούς τύπους οπτικοποίησης που προσφέρει το Matplotlib. Ποιοι τύποι είναι πιο κατάλληλοι για προβλήματα παλινδρόμησης; ## [Μετά το μάθημα quiz](https://ff-quizzes.netlify.app/en/ml/) ## Ανασκόπηση & Αυτομελέτη Ρίξτε μια ματιά στους πολλούς τρόπους οπτικοποίησης δεδομένων. Δημιουργήστε μια λίστα με τις διάφορες διαθέσιμες βιβλιοθήκες και σημειώστε ποιες είναι καλύτερες για συγκεκριμένους τύπους εργασιών, για παράδειγμα 2D οπτικοποιήσεις έναντι 3D οπτικοποιήσεων. Τι ανακαλύπτετε; ## Εργασία [Εξερεύνηση οπ --- **Αποποίηση ευθύνης**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.