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
leestott e4050807fb
🌐 Update translations via Co-op Translator
2 weeks ago
..
solution 🌐 Update translations via Co-op Translator 2 weeks ago
README.md 🌐 Update translations via Co-op Translator 2 weeks ago
assignment.md 🌐 Update translations via Co-op Translator 2 weeks ago
notebook.ipynb 🌐 Update translations via Co-op Translator 2 weeks ago

README.md

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

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

Infographic από Dasani Madipalli

Προ-μάθημα quiz

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

Εισαγωγή

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

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

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

ML για αρχάριους - Κατανόηση της Γραμμικής Παλινδρόμησης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Y = a + bX

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

υπολογίστε την κλίση

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

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

ολοκληρώστε την εξίσωση

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

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

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

Συσχέτιση

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

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

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

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

ID Μήνας ΗμέραΈτους Ποικιλία Πόλη Συσκευασία Χαμηλή Τιμή Υψηλή Τιμή Τιμή
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. Έχουμε εκτελέσει τα ίδια βήματα καθαρισμού όπως στο προηγούμενο μάθημα και έχουμε υπολογίσει τη στήλη ΗμέραΈτους χρησιμοποιώντας την ακόλουθη έκφραση:

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

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

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

ML για αρχάριους - Αναζήτηση Συσχέτισης: Το Κλειδί για τη Γραμμική Παλινδρόμηση

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

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

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

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

Scatter plot Τιμής vs Ημέρα του Έτους

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

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

Φαίνεται ότι η συσχέτιση είναι αρκετά μικρή, -0.15 για τον Μήνα και -0.17 για την ΗμέραΈτους, αλλά μπορεί να υπάρχει μια άλλη σημαντική σχέση. Φαίνεται ότι υπάρχουν διαφορετικά clusters τιμών που αντιστοιχούν σε διαφορετικές ποικιλίες κολοκύθας. Για να επιβεβαιώσουμε αυτήν την υπόθεση, ας σχεδιάσουμε κάθε κατηγορία κολοκύθας χρησιμοποιώντας διαφορετικό χρώμα. Με τη χρήση της παραμέτρου 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 Τιμής vs Ημέρα του Έτους

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

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

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

pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price') 
Scatter plot Τιμής vs Ημέρα του Έτους

Αν τώρα υπολογίσουμε τη συσχέτιση μεταξύ Τιμής και ΗμέραΈτους χρησιμοποιώντας τη συνάρτηση corr, θα πάρουμε κάτι σαν -0.27 - που σημαίνει ότι η εκπαίδευση ενός προβλεπτικού μοντέλου έχει νόημα.

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

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

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

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

ML για αρχάριους - Γραμμική και Πολυωνυμική Παλινδρόμηση με χρήση 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

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

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 περιλαμβάνει ένα χρήσιμο API pipeline για να συνδυάσει διαφορετικά βήματα επεξεργασίας δεδομένων. Ένα pipeline είναι μια αλυσίδα από εκτιμητές. Στην περίπτωσή μας, θα δημιουργήσουμε ένα 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, επειδή περιέχει μη αριθμητικές τιμές. Τέτοιες στήλες ονομάζονται κατηγορικές.

ML για αρχάριους - Προβλέψεις με κατηγορικά χαρακτηριστικά μέσω Γραμμικής Παλινδρόμησης

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

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

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

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

  • Η απλή αριθμητική κωδικοποίηση θα δημιουργήσει έναν πίνακα με διαφορετικές ποικιλίες και στη συνέχεια θα αντικαταστήσει το όνομα της ποικιλίας με έναν δείκτη στον πίνακα. Αυτό δεν είναι η καλύτερη ιδέα για τη γραμμική παλινδρόμηση, επειδή η γραμμική παλινδρόμηση λαμβάνει την πραγματική αριθμητική τιμή του δείκτη και την προσθέτει στο αποτέλεσμα, πολλαπλασιάζοντας με κάποιο συντελεστή. Στην περίπτωσή μας, η σχέση μεταξύ του αριθμού δείκτη και της τιμής είναι σαφώς μη γραμμική, ακόμα κι αν βεβαιωθούμε ότι οι δείκτες είναι ταξινομημένοι με κάποιο συγκεκριμένο τρόπο.
  • Η 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 κωδικοποιημένα κατηγορικά + αριθμητικά) δεδομένα από το παραπάνω παράδειγμα μαζί με την Πολυωνυμική Παλινδρόμηση. Εδώ είναι ο πλήρης κώδικας για ευκολία:

# set up training data
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']

# make train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# setup and train the pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)

# predict results for test data
pred = pipeline.predict(X_test)

# calculate MSE and determination
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.

Εργασία

Δημιουργήστε ένα Μοντέλο


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