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/2-Regression/3-Linear
localizeflow[bot] 2b2e986966
chore(i18n): sync translations with latest source changes (chunk 1/1, 12 changes)
4 months ago
..
solution chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 6 months ago
README.md chore(i18n): sync translations with latest source changes (chunk 1/1, 12 changes) 4 months ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 6 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

Δημιουργία μοντέλου παλινδρόμησης χρησιμοποιώντας το Scikit-learn: παλινδρόμηση με τέσσερις τρόπους

Σημείωση για αρχάριους

Η γραμμική παλινδρόμηση χρησιμοποιείται όταν θέλουμε να προβλέψουμε μια αριθμητική τιμή (για παράδειγμα, την τιμή ενός σπιτιού, τη θερμοκρασία ή τις πωλήσεις). Λειτουργεί βρίσκοντας μια ευθεία γραμμή που αντιπροσωπεύει καλύτερα τη σχέση μεταξύ των εισροών και της εξόδου.

Σε αυτό το μάθημα, εστιάζουμε στην κατανόηση της έννοιας πριν εξερευνήσουμε πιο προχωρημένες τεχνικές παλινδρόμησης. Γραμμική έναντι πολυωνυμικής παλινδρόμησης infographic

Infographic από Dasani Madipalli

Προ-μαθηματικό κουίζ

Αυτό το μάθημα είναι διαθέσιμο και σε R!

Εισαγωγή

Μέχρι τώρα έχετε εξερευνήσει τι είναι η παλινδρόμηση με δείγματα δεδομένων που συλλέχθηκαν από το σύνολο δεδομένων τιμών κολοκύθας που θα χρησιμοποιήσουμε σε όλο αυτό το μάθημα. Έχετε επίσης το οπτικοποιήσει χρησιμοποιώντας το Matplotlib.

Τώρα είστε έτοιμοι να εμβαθύνετε στην παλινδρόμηση για Μηχανική Μάθηση. Ενώ η οπτικοποίηση σας επιτρέπει να κατανοήσετε τα δεδομένα, η πραγματική δύναμη της Μηχανικής Μάθησης προέρχεται από την εκπαίδευση μοντέλων. Τα μοντέλα εκπαιδεύονται σε ιστορικά δεδομένα για να συλλάβουν αυτόματα τις εξαρτήσεις των δεδομένων και σας επιτρέπουν να προβλέπετε αποτελέσματα για νέα δεδομένα που το μοντέλο δεν έχει ξαναδεί.

Σε αυτό το μάθημα, θα μάθετε περισσότερα για δύο τύπους παλινδρόμησης: βασική γραμμική παλινδρόμηση και πολυωνυμική παλινδρόμηση, μαζί με κάποια από τα μαθηματικά που υποστηρίζουν αυτές τις τεχνικές. Αυτά τα μοντέλα θα μας επιτρέψουν να προβλέψουμε τις τιμές της κολοκύθας ανάλογα με διάφορα εισερχόμενα δεδομένα.

Μηχανική Μάθηση για αρχάριους - Κατανόηση της γραμμικής παλινδρόμησης

🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα σύντομο βίντεο επισκόπησης της γραμμικής παλινδρόμησης.

Καθ' όλη τη διάρκεια αυτού του προγράμματος σπουδών, υποθέτουμε ελάχιστες γνώσεις μαθηματικών και προσπαθούμε να το κάνουμε προσιτό σε φοιτητές από άλλα πεδία, οπότε δώστε προσοχή σε σημειώσεις, 🧮 υπομνήσεις, διαγράμματα και άλλα εργαλεία μάθησης για να βοηθήσουν στην κατανόηση.

Προαπαιτούμενα

Πρέπει να είστε πλέον εξοικειωμένοι με τη δομή των δεδομένων κολοκύθας που εξετάζουμε. Μπορείτε να τα βρείτε προφορτωμένα και προ-καθαρισμένα στο αρχείο notebook.ipynb αυτού του μαθήματος. Στο αρχείο, η τιμή της κολοκύθας εμφανίζεται ανά μπούσελ σε νέο πλαίσιο δεδομένων. Βεβαιωθείτε ότι μπορείτε να εκτελέσετε αυτά τα notebooks σε πυρήνες στο Visual Studio Code.

Προετοιμασία

Ως υπενθύμιση, φορτώνετε αυτά τα δεδομένα για να κάνετε ερωτήσεις σχετικά με αυτά.

  • Ποια είναι η καλύτερη στιγμή για να αγοράσετε κολοκύθες;
  • Ποια τιμή μπορώ να περιμένω για μια συσκευασία μικρών κολοκυθών;
  • Πρέπει να τις αγοράσω σε καλάθια μισού μπούσελ ή σε κουτί 1 1/9 μπούσελ; Ας συνεχίσουμε να ερευνούμε αυτά τα δεδομένα.

Στο προηγούμενο μάθημα, δημιουργήσατε ένα Pandas data frame και το συμπληρώσατε με μέρος του αρχικού συνόλου δεδομένων, τυποποιώντας την τιμή ανά μπούσελ. Με αυτόν τον τρόπο, όμως, μαζέψατε μόνο περίπου 400 σημεία δεδομένων και μόνο για τους φθινοπωρινούς μήνες.

Ρίξτε μια ματιά στα δεδομένα που έχουμε προφορτώσει στο συνοδευτικό notebook αυτού του μαθήματος. Τα δεδομένα είναι προφορτωμένα και αρχικό scatterplot σχεδιάζεται για να δείξει δεδομένα μήνα. Ίσως να πάρουμε λίγες περισσότερες λεπτομέρειες για τη φύση των δεδομένων καθαρίζοντάς τα περισσότερο.

Μια γραμμική γραμμή παλινδρόμησης

Όπως μάθατε στο Μάθημα 1, ο στόχος μιας άσκησης γραμμικής παλινδρόμησης είναι να μπορέσετε να σχεδιάσετε μια γραμμή για να:

  • Δείξετε τις σχέσεις μεταξύ μεταβλητών. Δείξτε τη σχέση μεταξύ των μεταβλητών
  • Κάνετε προβλέψεις. Κάνετε ακριβείς προβλέψεις για το που θα τοποθετηθεί ένα νέο σημείο δεδομένων σε σχέση με αυτή τη γραμμή.

Είναι τυπικό της Παλινδρόμησης Ελαχίστων Τετραγώνων να σχεδιάζετε αυτού του τύπου τη γραμμή. Ο όρος "Ελαχίστων Τετραγώνων" αναφέρεται στη διαδικασία ελαχιστοποίησης του συνολικού σφάλματος στο μοντέλο μας. Για κάθε σημείο δεδομένων μετράμε την κατακόρυφη απόσταση (ονομάζεται υπόλοιπο) μεταξύ του πραγματικού σημείου και της γραμμής παλινδρόμησής μας.

Τετρώνουμε αυτές τις αποστάσεις για δύο βασικούς λόγους:

  1. Μέγεθος έναντι Κατεύθυνσης: Θέλουμε ένα σφάλμα -5 να θεωρείται το ίδιο με ένα σφάλμα +5. Η τετραγωνική κάνει όλες τις τιμές θετικές.

  2. Τιμωρία Ακραίων Τιμών: Το τετράγωνο δίνει μεγαλύτερο βάρος στα μεγαλύτερα σφάλματα, αναγκάζοντας τη γραμμή να παραμείνει πιο κοντά σε σημεία που είναι μακριά.

Στη συνέχεια, προσθέτουμε όλες αυτές τις τετραγωνισμένες τιμές. Ο στόχος μας είναι να βρούμε τη συγκεκριμένη γραμμή όπου το τελικό άθροισμα είναι το ελάχιστο (η μικρότερη δυνατή τιμή)—εξού και το όνομα "Ελαχίστων Τετραγώνων".

🧮 Δείξε μου τα μαθηματικά

Αυτή η γραμμή, που ονομάζεται γραμμή της καλύτερης εφαρμογής μπορεί να εκφραστεί με μια εξίσωση:

Y = a + bX

Το X είναι η 'εξηγηματική μεταβλητή'. Το Y είναι η 'εξαρτημένη μεταβλητή'. Η κλίση της γραμμής είναι το b και το a είναι η διασταύρωση y, που αναφέρεται στην τιμή του Y όταν X = 0.

υπολογισμός της κλίσης

Πρώτα, υπολογίστε την κλίση b. Infographic από Jen Looper

Με άλλα λόγια, και αναφερόμενοι στην αρχική ερώτηση των δεδομένων μας για την κολοκύθα: "προβλέψτε την τιμή μιας κολοκύθας ανά μπούσελ ανά μήνα", το X θα αναφερόταν στην τιμή και το Y στον μήνα πώλησης.

συμπλήρωση της εξίσωσης

Υπολογίστε την τιμή του Y. Αν πληρώνετε γύρω στα 4 δολάρια, πρέπει να είναι Απρίλιος! Infographic από Jen Looper

Τα μαθηματικά που υπολογίζουν τη γραμμή πρέπει να δείξουν την κλίση της γραμμής, που επίσης εξαρτάται από τη διασταύρωση, ή πού βρίσκεται το Y όταν X = 0.

Μπορείτε να δείτε τη μέθοδο υπολογισμού αυτών των τιμών στην ιστοσελίδα Math is Fun. Επίσης επισκεφτείτε αυτόν τον Υπολογιστή Ελαχίστων Τετραγώνων για να δείτε πώς οι τιμές επηρεάζουν τη γραμμή.

Συνάφεια (Correlation)

Ένας ακόμα όρος που πρέπει να κατανοήσετε είναι ο Συντελεστής συσχέτισης μεταξύ των δεδομένων μεταβλητών X και Y. Χρησιμοποιώντας ένα scatterplot, μπορείτε γρήγορα να οπτικοποιήσετε αυτόν τον συντελεστή. Ένα διάγραμμα με σημεία διασκορπισμένα σε μια καθαρή γραμμή έχει υψηλή συσχέτιση, ενώ ένα διάγραμμα με σημεία διασκορπισμένα παντού ανάμεσα σε X και Y έχει χαμηλή συσχέτιση.

Ένα καλό μοντέλο γραμμικής παλινδρόμησης θα έχει υψηλό (πιο κοντά στο 1 παρά στο 0) Συντελεστή Συσχέτισης χρησιμοποιώντας τη μέθοδο Ελαχίστων Τετραγώνων με μια γραμμή παλινδρόμησης.

Εκτελέστε το notebook που συνοδεύει αυτό το μάθημα και εξετάστε το διάγραμμα διασποράς Μήνας προς Τιμή. Φαίνεται ότι η συσχέτιση των δεδομένων Μήνα με Τιμή για τις πωλήσεις κολοκύθας έχει υψηλή ή χαμηλή συσχέτιση, σύμφωνα με την οπτική σας ερμηνεία του διαγράμματος; Αλλάζει αυτό αν χρησιμοποιήσετε μια πιο λεπτομερή μέτρηση αντί για Μήνα, π.χ. ημέρα του έτους (δηλαδή, αριθμός ημερών από την αρχή του έτους);

Στον κώδικα παρακάτω, θα υποθέσουμε ότι έχουμε καθαρίσει τα δεδομένα και έχουμε λάβει ένα πλαίσιο δεδομένων που ονομάζεται new_pumpkins, παρόμοιο με το ακόλουθο:

ID Month DayOfYear Variety City Package Low Price High Price Price
70 9 267 PIE TYPE BALTIMORE 1 1/9 bushel cartons 15.0 15.0 13.636364
71 9 267 PIE TYPE BALTIMORE 1 1/9 bushel cartons 18.0 18.0 16.363636
72 10 274 PIE TYPE BALTIMORE 1 1/9 bushel cartons 18.0 18.0 16.363636
73 10 274 PIE TYPE BALTIMORE 1 1/9 bushel cartons 17.0 17.0 15.454545
74 10 281 PIE TYPE BALTIMORE 1 1/9 bushel cartons 15.0 15.0 13.636364

Ο κώδικας για τον καθαρισμό των δεδομένων είναι διαθέσιμος στο notebook.ipynb. Έχουμε πραγματοποιήσει τα ίδια βήματα καθαρισμού όπως στο προηγούμενο μάθημα και έχουμε υπολογίσει τη στήλη DayOfYear χρησιμοποιώντας την ακόλουθη έκφραση:

day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)

Τώρα που έχετε κατανοήσει τα μαθηματικά πίσω από τη γραμμική παλινδρόμηση, ας δημιουργήσουμε ένα μοντέλο παλινδρόμησης για να δούμε αν μπορούμε να προβλέψουμε ποιο πακέτο κολοκύθας θα έχει τις καλύτερες τιμές. Κάποιος που αγοράζει κολοκύθες για ένα φθινοπωρινό παρτέρι κολοκύθας θα ήθελε αυτές τις πληροφορίες για να βελτιστοποιήσει τις αγορές του.

Αναζήτηση συσχέτισης

Μηχανική Μάθηση για αρχάριους - Αναζήτηση συσχέτισης: Το κλειδί για τη γραμμική παλινδρόμηση

🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα σύντομο βίντεο επισκόπησης για τη συσχέτιση.

Από το προηγούμενο μάθημα μάλλον έχετε δει ότι η μέση τιμή για διαφορετικούς μήνες μοιάζει ως εξής:

Μέση τιμή ανά μήνα

Αυτό υποδηλώνει ότι θα πρέπει να υπάρχει κάποια συσχέτιση και μπορούμε να δοκιμάσουμε να εκπαιδεύσουμε ένα γραμμικό μοντέλο παλινδρόμησης για να προβλέψουμε τη σχέση μεταξύ Month και Price, ή μεταξύ DayOfYear και Price. Να το scatter plot που δείχνει τη δεύτερη σχέση:

Scatter plot τιμής έναντι ημέρας του έτους

Ας δούμε αν υπάρχει συσχέτιση χρησιμοποιώντας τη συνάρτηση corr:

print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))

Φαίνεται ότι η συσχέτιση είναι αρκετά μικρή, -0.15 ανά Month και -0.17 ανά DayOfMonth, αλλά μπορεί να υπάρχει μια άλλη σημαντική σχέση. Φαίνεται ότι υπάρχουν διαφορετικά σύνολα τιμών που αντιστοιχούν σε διαφορετικές ποικιλίες κολοκύθας. Για να επιβεβαιώσουμε αυτήν την υπόθεση, ας σχεδιάσουμε κάθε κατηγορία κολοκύθας με διαφορετικό χρώμα. Δίνοντας μια παράμετρο ax στη συνάρτηση σχεδίασης scatter μπορούμε να σχεδιάσουμε όλα τα σημεία στο ίδιο γράφημα:

ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
    df = new_pumpkins[new_pumpkins['Variety']==var]
    ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
Scatter plot τιμής έναντι ημέρας του έτους με χρώματα

Η έρευνά μας υποδηλώνει ότι η ποικιλία έχει μεγαλύτερη επίδραση στην τελική τιμή από την πραγματική ημερομηνία πώλησης. Αυτό φαίνεται και σε ένα γράφημα ράβδων:

new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
Γράφημα ράβδων τιμής ανά ποικιλία

Ας εστιάσουμε προς στιγμή μόνο σε μια ποικιλία κολοκύθας, τον 'τύπο για πίτα', και ας δούμε τι επίδραση έχει η ημερομηνία στην τιμή:

pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price') 
Scatter plot τιμής έναντι ημέρας του έτους για κολοκύθες πίτας

Εάν τώρα υπολογίσουμε τη συσχέτιση μεταξύ Price και DayOfYear χρησιμοποιώντας τη συνάρτηση corr, θα πάρουμε κάτι σαν -0.27 - που σημαίνει ότι η εκπαίδευση ενός προγνωστικού μοντέλου έχει νόημα.

Πριν εκπαιδεύσετε ένα μοντέλο γραμμικής παλινδρόμησης, είναι σημαντικό να βεβαιωθείτε ότι τα δεδομένα μας είναι καθαρά. Η γραμμική παλινδρόμηση δεν λειτουργεί καλά με ελλιπή δεδομένα, οπότε είναι λογικό να απαλλαγούμε από όλα τα κενά κελιά:

pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()

Μια άλλη προσέγγιση θα ήταν να γεμίσετε αυτές τις κενές τιμές με μέσες τιμές από την αντίστοιχη στήλη.

Απλή γραμμική παλινδρόμηση

Μηχανική Μάθηση για αρχάριους - Γραμμική και πολυωνυμική παλινδρόμηση με Scikit-learn

🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα σύντομο βίντεο επισκόπησης της γραμμικής και πολυωνυμικής παλινδρόμησης.

Για να εκπαιδεύσουμε το μοντέλο Γραμμικής Παλινδρόμησης, θα χρησιμοποιήσουμε τη βιβλιοθήκη Scikit-learn.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

Ξεκινάμε διαχωρίζοντας τις εισερχόμενες τιμές (χαρακτηριστικά) και την αναμενόμενη έξοδο (ετικέτα) σε ξεχωριστά numpy arrays:

X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']

Σημειώστε ότι έπρεπε να κάνουμε reshape στα δεδομένα εισόδου ώστε το πακέτο Γραμμικής Παλινδρόμησης να τα κατανοήσει σωστά. Η Γραμμική Παλινδρόμηση περιμένει έναν 2D array ως είσοδο, όπου κάθε γραμμή του πίνακα αντιστοιχεί σε διάνυσμα χαρακτηριστικών εισόδου. Στην περίπτωσή μας, αφού έχουμε μόνο μία είσοδο, χρειάζεται ένας πίνακας σχήματος N×1, όπου το Ν είναι το μέγεθος του συνόλου δεδομένων.

Στη συνέχεια, πρέπει να χωρίσουμε τα δεδομένα σε σύνολα εκπαίδευσης και δοκιμής, ώστε να μπορέσουμε να επαληθεύσουμε το μοντέλο μετά την εκπαίδευση:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Τέλος, η εκπαίδευση του πραγματικού μοντέλου Γραμμικής Παλινδρόμησης παίρνει μόνο δύο γραμμές κώδικα. Ορίζουμε το αντικείμενο LinearRegression, και το προσαρμόζουμε στα δεδομένα μας χρησιμοποιώντας τη μέθοδο fit:

lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)

Το αντικείμενο LinearRegression μετά το fit-άρισμα περιέχει όλους τους συντελεστές της παλινδρόμησης, στους οποίους μπορούμε να έχουμε πρόσβαση χρησιμοποιώντας την ιδιότητα .coef_. Στην περίπτωσή μας, υπάρχει μόνο ένας συντελεστής, ο οποίος θα πρέπει να είναι περίπου -0.017. Αυτό σημαίνει ότι οι τιμές φαίνεται να πέφτουν λίγο με το χρόνο, αλλά όχι πολύ, περίπου 2 σεντ ανά ημέρα. Μπορούμε επίσης να έχουμε πρόσβαση στο σημείο τομής της παλινδρόμησης με τον άξονα Υ χρησιμοποιώντας το lin_reg.intercept_ - που θα είναι γύρω στο 21 στην περίπτωσή μας, υποδεικνύοντας την τιμή στην αρχή του έτους.

Για να δούμε πόσο ακριβές είναι το μοντέλο μας, μπορούμε να προβλέψουμε τις τιμές σε ένα σύνολο δεδομένων δοκιμής και στη συνέχεια να μετρήσουμε πόσο κοντά είναι οι προβλέψεις μας στις αναμενόμενες τιμές. Αυτό μπορεί να γίνει χρησιμοποιώντας το μέτρο root mean square error (RMSE), που είναι η τετραγωνική ρίζα του μέσου όρου όλων των τετραγωνισμένων διαφορών μεταξύ αναμενόμενης και προβλεπόμενης τιμής.

pred = lin_reg.predict(X_test)

rmse = np.sqrt(mean_squared_error(y_test,pred))
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')

Το σφάλμα μας φαίνεται να είναι γύρω στις 2 μονάδες, που είναι ~17%. Όχι και τόσο καλό. Ένας άλλος δείκτης ποιότητας του μοντέλου είναι ο συντελεστής καθορισμού (coefficient of determination), ο οποίος μπορεί να ληφθεί ως εξής:

score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)

Αν η τιμή είναι 0, σημαίνει ότι το μοντέλο δεν λαμβάνει υπόψη τα εισερχόμενα δεδομένα και λειτουργεί ως ο χειρότερος γραμμικός προβλέπων, δηλαδή απλά η μέση τιμή του αποτελέσματος. Η τιμή 1 σημαίνει ότι μπορούμε να προβλέψουμε τέλεια όλες τις αναμενόμενες εξόδους. Στην περίπτωσή μας, ο συντελεστής είναι περίπου 0.06, που είναι αρκετά χαμηλός.

Μπορούμε επίσης να σχεδιάσουμε τα δεδομένα δοκιμής μαζί με τη γραμμή παλινδρόμησης για να δούμε καλύτερα πώς λειτουργεί η παλινδρόμηση στην περίπτωσή μας:

plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
Γραμμική παλινδρόμηση

Πολυωνυμική Παλινδρόμηση

Ένας άλλος τύπος γραμμικής παλινδρόμησης είναι η Πολυωνυμική Παλινδρόμηση. Ενώ μερικές φορές υπάρχει γραμμική σχέση μεταξύ των μεταβλητών - όσο μεγαλύτερη είναι η κολοκύθα σε όγκο, τόσο υψηλότερη η τιμή - κάποιες φορές αυτές οι σχέσεις δεν μπορούν να σχεδιαστούν ως επίπεδο ή ευθεία γραμμή.

Εδώ είναι μερικά ακόμα παραδείγματα δεδομένων που θα μπορούσαν να χρησιμοποιήσουν Πολυωνυμική Παλινδρόμηση.

Ρίξτε άλλη μια ματιά στη σχέση μεταξύ της Ημερομηνίας και της Τιμής. Αυτό το διασποράς φαίνεται να πρέπει κατ’ ανάγκη να αναλυθεί με μια ευθεία γραμμή; Δεν μπορεί η τιμή να κυμαίνεται; Σε αυτή την περίπτωση, μπορείτε να δοκιμάσετε πολυωνυμική παλινδρόμηση.

Τα πολυώνυμα είναι μαθηματικές εκφράσεις που μπορεί να αποτελούνται από μία ή περισσότερες μεταβλητές και συντελεστές.

Η πολυωνυμική παλινδρόμηση δημιουργεί μια καμπύλη γραμμή για να ταιριάξει καλύτερα δεδομένα που δεν είναι γραμμικά. Στην περίπτωσή μας, αν συμπεριλάβουμε μια μεταβλητή DayOfYear υψωμένη στο τετράγωνο στα εισερχόμενα δεδομένα, θα μπορούσαμε να προσαρμόσουμε τα δεδομένα μας με μια παραβολική καμπύλη, που θα έχει ένα ελάχιστο σε ένα συγκεκριμένο σημείο μέσα στο έτος.

Η Scikit-learn περιλαμβάνει ένα χρήσιμο pipeline API για να συνδυάζει διαφορετικά βήματα επεξεργασίας δεδομένων μαζί. Ένα pipeline είναι μια αλυσίδα εκτιμητών (estimators). Στην περίπτωσή μας, θα δημιουργήσουμε ένα pipeline που πρώτα προσθέτει πολυωνυμικά χαρακτηριστικά στο μοντέλο μας και στη συνέχεια εκπαιδεύει την παλινδρόμηση:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())

pipeline.fit(X_train,y_train)

Η χρήση του PolynomialFeatures(2) σημαίνει ότι θα συμπεριλάβουμε όλα τα πολυώνυμα δευτέρου βαθμού από τα εισερχόμενα δεδομένα. Στην περίπτωσή μας, θα σημαίνει απλά DayOfYear2, αλλά δεδομένων δύο εισερχόμενων μεταβλητών X και Y, αυτό θα προσθέσει X2, XY και Y2. Μπορούμε επίσης να χρησιμοποιήσουμε πολυώνυμα υψηλότερου βαθμού αν το επιθυμούμε.

Τα pipelines μπορούν να χρησιμοποιηθούν με τον ίδιο τρόπο όπως το αρχικό αντικείμενο LinearRegression, δηλαδή μπορούμε να κάνουμε fit στο pipeline και στη συνέχεια να χρησιμοποιήσουμε predict για να πάρουμε τα αποτελέσματα της πρόβλεψης. Εδώ είναι το γράφημα που δείχνει τα δεδομένα δοκιμής και την προσεγγιστική καμπύλη:

Πολυωνυμική παλινδρόμηση

Χρησιμοποιώντας πολυωνυμική παλινδρόμηση, μπορούμε να πετύχουμε ελαφρώς χαμηλότερο MSE και μεγαλύτερο συντελεστή καθορισμού, αλλά όχι σημαντικά. Πρέπει να λάβουμε υπόψη και άλλα χαρακτηριστικά!

Μπορείτε να δείτε ότι οι ελάχιστες τιμές των κολοκυθών παρατηρούνται κάπου γύρω στο Halloween. Πώς μπορείτε να εξηγήσετε αυτό;

🎃 Συγχαρητήρια, μόλις δημιουργήσατε ένα μοντέλο που μπορεί να βοηθήσει στην πρόβλεψη της τιμής για τις κολοκύθες τύπου πίτας. Πιθανότατα μπορείτε να επαναλάβετε την ίδια διαδικασία για όλους τους τύπους κολοκύθας, αλλά αυτό θα ήταν κουραστικό. Ας μάθουμε τώρα πώς να λαμβάνουμε υπόψη τη ποικιλία κολοκύθας στο μοντέλο μας!

Κατηγορικά Χαρακτηριστικά

Σε έναν ιδανικό κόσμο, θέλουμε να μπορούμε να προβλέπουμε τιμές για διαφορετικές ποικιλίες κολοκύθας χρησιμοποιώντας το ίδιο μοντέλο. Ωστόσο, η στήλη Variety είναι κάπως διαφορετική από στήλες όπως το Month, επειδή περιέχει μη αριθμητικές τιμές. Τέτοιες στήλες ονομάζονται κατηγορικές.

Μηχανική Μάθηση για αρχάριους - Προβλέψεις κατηγορικών χαρακτηριστικών με γραμμική παλινδρόμηση

🎥 Πατήστε την εικόνα παραπάνω για μια σύντομη βίντεο-επισκόπηση της χρήσης κατηγορικών χαρακτηριστικών.

Εδώ μπορείτε να δείτε πώς η μέση τιμή εξαρτάται από την ποικιλία:

Μέση τιμή ανά ποικιλία

Για να λάβουμε υπόψη την ποικιλία, αρχικά πρέπει να την μετατρέψουμε σε αριθμητική μορφή ή να την κωδικοποιήσουμε. Υπάρχουν διάφοροι τρόποι να το κάνουμε:

  • Απλή αριθμητική κωδικοποίηση θα δημιουργήσει έναν πίνακα διαφορετικών ποικιλιών και στη συνέχεια θα αντικαταστήσει το όνομα της ποικιλίας με έναν δείκτη σε αυτόν τον πίνακα. Αυτό δεν είναι η καλύτερη ιδέα για γραμμική παλινδρόμηση, επειδή η γραμμική παλινδρόμηση λαμβάνει την πραγματική αριθμητική τιμή του δείκτη και την προσθέτει στο αποτέλεσμα, πολλαπλασιάζοντας την με κάποιο συντελεστή. Στην περίπτωσή μας, η σχέση μεταξύ του αριθμού δείκτη και της τιμής είναι σαφώς μη γραμμική, ακόμα και αν φροντίσουμε οι δείκτες να είναι ταξινομημένοι με κάποιο συγκεκριμένο τρόπο.
  • Η one-hot κωδικοποίηση θα αντικαταστήσει τη στήλη Variety με 4 διαφορετικές στήλες, μία για κάθε ποικιλία. Κάθε στήλη θα περιέχει 1 αν η αντίστοιχη γραμμή ανήκει σε μια συγκεκριμένη ποικιλία, και 0 αλλιώς. Αυτό σημαίνει ότι θα υπάρχουν τέσσερις συντελεστές στη γραμμική παλινδρόμηση, ένας για κάθε ποικιλία κολοκύθας, υπεύθυνος για την "αρχική τιμή" (ή μάλλον την "επιπλέον τιμή") για αυτή τη συγκεκριμένη ποικιλία.

Ο παρακάτω κώδικας δείχνει πώς μπορούμε να κάνουμε one-hot κωδικοποίηση μιας ποικιλίας:

pd.get_dummies(new_pumpkins['Variety'])
ID FAIRYTALE MINIATURE MIXED HEIRLOOM VARIETIES PIE TYPE
70 0 0 0 1
71 0 0 0 1
... ... ... ... ...
1738 0 1 0 0
1739 0 1 0 0
1740 0 1 0 0
1741 0 1 0 0
1742 0 1 0 0

Για να εκπαιδεύσουμε τη γραμμική παλινδρόμηση χρησιμοποιώντας one-hot κωδικοποιημένη ποικιλία ως είσοδο, απλά πρέπει να ορίσουμε σωστά τα δεδομένα X και y:

X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']

Ο υπόλοιπος κώδικας είναι ο ίδιος όπως αυτός που χρησιμοποιήσαμε παραπάνω για να εκπαιδεύσουμε τη γραμμική παλινδρόμηση. Αν το δοκιμάσετε, θα δείτε ότι το μέσο τετραγωνικό σφάλμα είναι περίπου το ίδιο, αλλά παίρνουμε πολύ υψηλότερο συντελεστή καθορισμού (~77%). Για να πάρουμε ακόμα πιο ακριβείς προβλέψεις, μπορούμε να λάβουμε υπόψη και περισσότερα κατηγορικά χαρακτηριστικά, καθώς και αριθμητικά χαρακτηριστικά, όπως το Month ή το DayOfYear. Για να δημιουργήσουμε έναν μεγάλο πίνακα χαρακτηριστικών, μπορούμε να χρησιμοποιήσουμε το join:

X = pd.get_dummies(new_pumpkins['Variety']) \
        .join(new_pumpkins['Month']) \
        .join(pd.get_dummies(new_pumpkins['City'])) \
        .join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']

Εδώ λαμβάνουμε υπόψη επίσης το City και τον τύπο Package, που μας δίνει MSE 2.84 (10%) και συντελεστή καθορισμού 0.94!

Όλα μαζί

Για να φτιάξουμε το καλύτερο μοντέλο, μπορούμε να χρησιμοποιήσουμε συνδυασμένα (one-hot κωδικοποιημένα κατηγορικά + αριθμητικά) δεδομένα από το παραπάνω παράδειγμα μαζί με την πολυωνυμική παλινδρόμηση. Εδώ είναι ο πλήρης κώδικας για τη διευκόλυνσή σας:

# ρύθμιση δεδομένων εκπαίδευσης
X = pd.get_dummies(new_pumpkins['Variety']) \
        .join(new_pumpkins['Month']) \
        .join(pd.get_dummies(new_pumpkins['City'])) \
        .join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']

# δημιουργία διαχωρισμού εκπαίδευσης-δοκιμής
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# ρύθμιση και εκπαίδευση της αλυσίδας
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)

# πρόβλεψη αποτελεσμάτων για τα δεδομένα δοκιμής
pred = pipeline.predict(X_test)

# υπολογισμός MSE και προσδιορισμού
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')

score = pipeline.score(X_train,y_train)
print('Model determination: ', score)

Αυτό θα μας δώσει τον καλύτερο συντελεστή καθορισμού κοντά στο 97%, και MSE=2.23 (~8% σφάλμα πρόβλεψης).

Μοντέλο MSE Συντελεστής καθορισμού
Γραμμική DayOfYear 2.77 (17.2%) 0.07
Πολυωνυμική DayOfYear 2.73 (17.0%) 0.08
Γραμμική Variety 5.24 (19.7%) 0.77
Γραμμική με όλα τα χαρακτηριστικά 2.84 (10.5%) 0.94
Πολυωνυμική με όλα τα χαρακτηριστικά 2.23 (8.25%) 0.97

🏆 Μπράβο! Δημιουργήσατε τέσσερα μοντέλα παλινδρόμησης σε ένα μάθημα και βελτιώσατε την ποιότητα του μοντέλου στο 97%. Στο τελικό κεφάλαιο για την Παλινδρόμηση θα μάθετε για τη λογιστική παλινδρόμηση για την κατηγοριοποίηση.


🚀Πρόκληση

Δοκιμάστε διάφορες μεταβλητές σε αυτό το notebook για να δείτε πώς η συσχέτιση σχετίζεται με την ακρίβεια του μοντέλου.

Τεστ μετά το μάθημα

Ανασκόπηση & Αυτο-μελέτη

Σε αυτό το μάθημα μάθαμε για τη γραμμική παλινδρόμηση. Υπάρχουν και άλλοι σημαντικοί τύποι παλινδρόμησης. Διαβάστε για τις τεχνικές Stepwise, Ridge, Lasso και Elasticnet. Ένα καλό μάθημα για να μάθετε περισσότερα είναι το Stanford Statistical Learning course

Εργασία

Κατασκευή μοντέλου


Αποποίηση ευθυνών:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης AI Co-op Translator. Παρόλο που επιδιώκουμε την ακρίβεια, παρακαλούμε να γνωρίζετε ότι οι αυτοματοποιημένες μεταφράσεις μπορεί να περιέχουν σφάλματα ή ανακρίβειες. Το αρχικό έγγραφο στην μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε καμία ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.