Εκμάθηση γραμμικής παλινδρόμησης με TensorFlow [Παραδείγματα]
⚡ Έξυπνη Σύνοψη
Η Γραμμική Παλινδρόμηση στο TensorFlow μοντελοποιεί τη σχέση μεταξύ αριθμητικών χαρακτηριστικών και μιας συνεχούς τιμής-στόχου. Αυτή η αναλυτική παρουσίαση εκπαιδεύει έναν προγνωστικό τιμών κατοικιών στη Βοστώνη με τρεις ξεχωριστούς τρόπους, χρησιμοποιώντας Pandas, NumPy και εγγενείς αγωγούς εισόδου TensorFlow με τον εκτιμητή LinearRegressor.
Τι είναι η γραμμική παλινδρόμηση;
γραμμική Παλινδρόμηση είναι μια προσέγγιση στη στατιστική για τη μοντελοποίηση σχέσεων μεταξύ δύο μεταβλητών. Αυτή η μοντελοποίηση γίνεται μεταξύ μιας βαθμωτής απόκρισης και μίας ή περισσότερων επεξηγηματικών μεταβλητών. Η σχέση με μία επεξηγηματική μεταβλητή ονομάζεται απλή γραμμική παλινδρόμηση, ενώ με περισσότερες από μία επεξηγηματικές μεταβλητές ονομάζεται πολλαπλή γραμμική παλινδρόμηση.
Το TensorFlow παρέχει εργαλεία για τον πλήρη έλεγχο των υπολογισμών. Αυτό γίνεται με το API χαμηλού επιπέδου. Επιπλέον, το TensorFlow είναι εξοπλισμένο με μια τεράστια γκάμα API για την εκτέλεση πολλών μάθηση μηχανής αλγόριθμοι. Αυτό είναι το API υψηλού επιπέδου και το TensorFlow τα αποκαλεί εκτιμητές.
- API χαμηλού επιπέδουΔημιουργήστε την αρχιτεκτονική και τη βελτιστοποίηση του μοντέλου από την αρχή. Είναι περίπλοκο για έναν αρχάριο.
- API υψηλού επιπέδου: Ορίστε τον αλγόριθμο. Είναι φιλικός προς τον χρήστη. Το TensorFlow παρέχει μια εργαλειοθήκη που ονομάζεται εκτιμητής να κατασκευάσει, να εκπαιδεύσει, να αξιολογήσει και να κάνει μια πρόβλεψη.
Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε το μόνο εκτιμητέςΟι υπολογισμοί είναι ταχύτεροι και πιο εύκολοι στην εφαρμογή. Το πρώτο μέρος εξηγεί πώς να χρησιμοποιήσετε τον βελτιστοποιητή κλίσης για να εκπαιδεύσετε μια γραμμική παλινδρόμηση στο TensorFlow. Σε ένα δεύτερο μέρος, θα χρησιμοποιήσετε το σύνολο δεδομένων της Βοστώνης για να προβλέψετε την τιμή ενός σπιτιού χρησιμοποιώντας έναν εκτιμητή TensorFlow.
Πώς να εκπαιδεύσετε ένα μοντέλο γραμμικής παλινδρόμησης
Πριν ξεκινήσουμε την εκπαίδευση του μοντέλου, ας ρίξουμε μια ματιά στο τι ακριβώς είναι μια γραμμική παλινδρόμηση.
Φανταστείτε ότι έχετε δύο μεταβλητές, x και y, και η εργασία σας είναι να προβλέψετε την τιμή του y γνωρίζοντας την τιμή του x. Αν απεικονίσετε τα δεδομένα, μπορείτε να δείτε μια θετική σχέση μεταξύ της ανεξάρτητης μεταβλητής σας, x, και της εξαρτημένης μεταβλητής σας, y, όπως δείχνει το παρακάτω διάγραμμα διασποράς.
Μπορείτε να παρατηρήσετε ότι αν x=1, το y θα είναι περίπου ίσο με 6, και αν x=2, το y θα είναι περίπου ίσο με 8.5.
Αυτή δεν είναι μια πολύ ακριβής μέθοδος και είναι επιρρεπής σε σφάλματα, ειδικά με ένα σύνολο δεδομένων που περιέχει εκατοντάδες χιλιάδες σημεία.
Μια γραμμική παλινδρόμηση αξιολογείται με μια εξίσωση. Η μεταβλητή y εξηγείται με μία ή πολλές συμμεταβλητές. Στο παράδειγμά σας, υπάρχει μόνο μία εξαρτημένη μεταβλητή. Εάν πρέπει να γράψετε αυτήν την εξίσωση, θα είναι:
Με:
είναι η μεροληψία. Δηλαδή, αν x=0, y=
είναι το βάρος που σχετίζεται με το x
είναι το υπόλοιπο ή το σφάλμα του μοντέλου. Περιλαμβάνει ό,τι το μοντέλο δεν μπορεί να μάθει από τα δεδομένα
Φανταστείτε ότι ταιριάζει με το μοντέλο και βρίσκετε την ακόλουθη λύση για:
= 3.8
= 2.78
Μπορείτε να αντικαταστήσετε αυτούς τους αριθμούς στην εξίσωση και θα γίνει:
y= 3.8 + 2.78x
Τώρα έχετε έναν καλύτερο τρόπο να βρείτε τις τιμές για το y. Δηλαδή, μπορείτε να αντικαταστήσετε το x με οποιαδήποτε τιμή θέλετε για να προβλέψετε το y. Στην παρακάτω εικόνα, έχουμε αντικαταστήσει το x στην εξίσωση με όλες τις τιμές στο σύνολο δεδομένων και έχουμε απεικονίσει το αποτέλεσμα.
Η κόκκινη γραμμή αντιπροσωπεύει την προσαρμοσμένη τιμή, δηλαδή τις τιμές του y για κάθε τιμή του x. Δεν χρειάζεται να δείτε την τιμή του x για να προβλέψετε το y. Για κάθε x υπάρχει μια τιμή που ανήκει στην κόκκινη γραμμή. Μπορείτε επίσης να προβλέψετε για τιμές του x μεγαλύτερες από 2.
Αν θέλετε να επεκτείνετε τη γραμμική παλινδρόμηση σε περισσότερες συνμεταβλητές, μπορείτε να το κάνετε προσθέτοντας περισσότερες μεταβλητές στο μοντέλο. Η διαφορά μεταξύ της παραδοσιακής ανάλυσης και της γραμμικής παλινδρόμησης είναι ότι η γραμμική παλινδρόμηση εξετάζει πώς θα αντιδράσει το y για κάθε μεταβλητή x που λαμβάνεται ανεξάρτητα.
Ας δούμε ένα παράδειγμα. Φανταστείτε ότι θέλετε να προβλέψετε τις πωλήσεις ενός καταστήματος παγωτού. Το σύνολο δεδομένων περιέχει διαφορετικές πληροφορίες όπως τον καιρό (βροχερός, ηλιόλουστος, συννεφιασμένος) και πληροφορίες πελατών (μισθός, φύλο, οικογενειακή κατάσταση).
Η παραδοσιακή ανάλυση θα προσπαθήσει να προβλέψει την πώληση, ας πούμε, υπολογίζοντας τον μέσο όρο για κάθε μεταβλητή και προσπαθώντας να εκτιμήσει την πώληση για διαφορετικά σενάρια. Αυτό θα οδηγήσει σε κακές προβλέψεις και θα περιορίσει την ανάλυση στο επιλεγμένο σενάριο.
Εάν χρησιμοποιείτε γραμμική παλινδρόμηση, μπορείτε να γράψετε αυτήν την εξίσωση:
Ο αλγόριθμος θα βρει την καλύτερη λύση για τα βάρη, δηλαδή θα προσπαθήσει να ελαχιστοποιήσει το κόστος, το οποίο είναι η διαφορά μεταξύ της προσαρμοσμένης γραμμής και των σημείων δεδομένων.
Πώς λειτουργεί ο αλγόριθμος
Το παρακάτω διάγραμμα συνοψίζει τον βρόχο που επαναλαμβάνει ο αλγόριθμος: επιλογή βαρών, πρόβλεψη του y, μέτρηση του σφάλματος και διόρθωση των βαρών.
Ο αλγόριθμος θα επιλέξει έναν τυχαίο αριθμό για τον καθένα και
και αντικαταστήστε την τιμή του x για να πάρετε την προβλεπόμενη τιμή του y. Εάν το σύνολο δεδομένων έχει 100 παρατηρήσεις, ο αλγόριθμος υπολογίζει 100 προβλεπόμενες τιμές.
Μπορούμε να υπολογίσουμε το σφάλμα, σημειώθηκε , του μοντέλου, η οποία είναι η διαφορά μεταξύ της προβλεπόμενης τιμής και της πραγματικής τιμής. Ένα θετικό σφάλμα σημαίνει ότι το μοντέλο υποεκτιμά την πρόβλεψη του y, και ένα αρνητικό σφάλμα σημαίνει ότι το μοντέλο υπερεκτιμά την πρόβλεψη του y.
Στόχος σας είναι να ελαχιστοποιήσετε το τετράγωνο του σφάλματος. Ο αλγόριθμος υπολογίζει τον μέσο όρο του τετραγωνικού σφάλματος. Αυτό το βήμα ονομάζεται ελαχιστοποίηση του σφάλματος. Για γραμμική παλινδρόμηση, αυτό είναι το Μέσο τετράγωνο σφάλμα, που ονομάζεται επίσης MSE. Μαθηματικά είναι:
Που:
είναι τα βάρη, άρα
αναφέρεται στην προβλεπόμενη τιμή
- y είναι οι πραγματικές τιμές
- m είναι ο αριθμός των παρατηρήσεων
Σημειώστε ότι σημαίνει ότι χρησιμοποιεί τη μετάθεση των πινάκων. ο
είναι η μαθηματική σημειογραφία του μέσου όρου.
Στόχος είναι να βρεις το καλύτερο που ελαχιστοποιεί το MSE.
Εάν το μέσο σφάλμα είναι μεγάλο, σημαίνει ότι το μοντέλο έχει κακή απόδοση και τα βάρη δεν έχουν επιλεγεί σωστά. Για να διορθώσετε τα βάρη, πρέπει να χρησιμοποιήσετε έναν βελτιστοποιητή. Ο παραδοσιακός βελτιστοποιητής ονομάζεται Κάθοδος κλίσης.
Η καθοδική κλίση λαμβάνει την παράγωγο και μειώνει ή αυξάνει το βάρος. Εάν η παράγωγος είναι θετική, το βάρος μειώνεται. Εάν η παράγωγος είναι αρνητική, το βάρος αυξάνεται. Το μοντέλο θα ενημερώσει τα βάρη και θα υπολογίσει ξανά το σφάλμα. Αυτή η διαδικασία επαναλαμβάνεται μέχρι το σφάλμα να μην αλλάζει πλέον. Κάθε πέρασμα ονομάζεται επανάληψηΕπιπλέον, οι διαβαθμίσεις πολλαπλασιάζονται με έναν ρυθμό εκμάθησης, ο οποίος υποδεικνύει την ταχύτητα της εκμάθησης.
Εάν ο ρυθμός εκμάθησης είναι πολύ μικρός, θα χρειαστεί πολύς χρόνος για να συγκλίνει ο αλγόριθμος, επειδή απαιτεί πολύ περισσότερες επαναλήψεις. Εάν ο ρυθμός εκμάθησης είναι πολύ υψηλός, ο αλγόριθμος ενδέχεται να μην συγκλίνει ποτέ. Η καμπύλη απωλειών παρακάτω απεικονίζει το σφάλμα σε σχέση με τον αριθμό επαναλήψεων για αυτό το σύνολο δεδομένων.
Μπορείτε να δείτε από την παραπάνω εικόνα ότι το μοντέλο επαναλαμβάνει τη διαδικασία περίπου 20 φορές πριν βρει μια σταθερή τιμή για τα βάρη, φτάνοντας έτσι στο χαμηλότερο σφάλμα.
Σημειώστε ότι το σφάλμα δεν είναι ίσο με μηδέν, αλλά σταθεροποιείται γύρω στο 5. Αυτό σημαίνει ότι το μοντέλο κάνει ένα τυπικό σφάλμα 5. Εάν θέλετε να μειώσετε το σφάλμα, πρέπει να προσθέσετε περισσότερες πληροφορίες στο μοντέλο, όπως περισσότερες μεταβλητές, ή να χρησιμοποιήσετε διαφορετικούς εκτιμητές.
Θυμάστε την πρώτη εξίσωση:
Τα τελικά βάρη είναι 3.8 και 2.78. Το παρακάτω βίντεο σας δείχνει πώς η κλίση κατάβασης βελτιστοποιεί τη συνάρτηση απώλειας για να βρει αυτά τα βάρη.
Πώς να εκπαιδεύσετε μια Γραμμική παλινδρόμηση με το TensorFlow
Τώρα που έχετε καλύτερη κατανόηση του τι συμβαίνει πίσω από την κουκούλα, είστε έτοιμοι να χρησιμοποιήσετε το API εκτιμητή που παρέχεται από το TensorFlow για να εκπαιδεύσετε την πρώτη σας γραμμική παλινδρόμηση χρησιμοποιώντας το TensorFlow.
Σημείωση έκδοσης: Η ροή εργασίας του εκτιμητή που φαίνεται παρακάτω γράφτηκε σε TensorFlow 1.x και στις πρώτες εκδόσεις 2.x. Το TensorFlow σηματοδότησε το tf.estimator και tf.feature_column Τα API καταργήθηκαν πλήρως στην έκδοση 2.12 και οι Εκτιμητές καταργήθηκαν στην έκδοση 2.16. Σε μια τρέχουσα εγκατάσταση, εκτελέστε αυτόν τον κώδικα μέσα σε ένα TensorFlow 1.15 ή 2.x-with-tf.compat.v1 περιβάλλον, ή να το μεταφέρετε στο Κέρας, όπου tf.keras.layers.Dense(1) ενώ τα επίπεδα προεπεξεργασίας αντικαθιστούν το LinearRegressor και τις στήλες χαρακτηριστικών. Οι έννοιες — χαρακτηριστικά, ετικέτες, παρτίδες, εποχές, MSE και κλίση κλίσης — παραμένουν αμετάβλητες.
Θα χρησιμοποιήσετε το σύνολο δεδομένων της Βοστώνης, το οποίο περιλαμβάνει τις ακόλουθες μεταβλητές.
| Μεταβλητός | Περιγραφή |
| εγκληματικότητα | κατά κεφαλήν ποσοστό εγκληματικότητας ανά πόλη |
| zn | αναλογία γης οικιστικής ζώνης για οικόπεδα άνω των 25,000 τ.μ. |
| Ινδός | αναλογία των στρεμμάτων επιχειρήσεων μη λιανικής ανά πόλη. |
| nox | συγκέντρωση νιτρικών οξειδίων |
| rm | μέσος αριθμός δωματίων ανά κατοικία |
| την ηλικία του | ποσοστό των ιδιοκατοικούμενων μονάδων που κατασκευάστηκαν πριν από το 1940 |
| dis | σταθμισμένες αποστάσεις σε πέντε κέντρα απασχόλησης της Βοστώνης |
| φόρος | συντελεστής φόρου ακινήτων πλήρους αξίας ανά 10,000 δολάρια |
| ptratio | αναλογία μαθητών-δασκάλων ανά πόλη |
| medv | Διάμεση αξία κατοικιών σε χιλιάδες δολάρια |
Θα δημιουργήσετε τρία διαφορετικά σύνολα δεδομένων:
| σύνολο δεδομένων | σκοπός | σχήμα |
| Προπόνηση | Εκπαιδεύστε το μοντέλο και αποκτήστε τα βάρη | 400, 10 |
| Εκτίμηση | Αξιολογήστε την απόδοση του μοντέλου σε αόρατα δεδομένα | 100, 10 |
| Προλέγω | Χρησιμοποιήστε το μοντέλο για να προβλέψετε την αξία κατοικίας σε νέα δεδομένα | 6, 10 |
Ο στόχος είναι να χρησιμοποιηθούν τα χαρακτηριστικά του συνόλου δεδομένων για την πρόβλεψη της αξίας του σπιτιού.
Κατά τη διάρκεια του δεύτερου μέρους του σεμιναρίου, θα μάθετε πώς να χρησιμοποιείτε το TensorFlow με τρεις διαφορετικούς τρόπους εισαγωγής δεδομένων:
- Με Πάντα
- Με μουδιασμένος
- Μόνο TensorFlow
Σημειώστε ότι και οι τρεις επιλογές παρέχουν τα ίδια αποτελέσματα.
Θα μάθετε πώς να χρησιμοποιείτε το API υψηλού επιπέδου για να δημιουργήσετε, να εκπαιδεύσετε και να αξιολογήσετε ένα γραμμικό μοντέλο παλινδρόμησης TensorFlow. Εάν χρησιμοποιούσατε το API χαμηλού επιπέδου, θα έπρεπε να ορίσετε χειροκίνητα τα εξής:
- Λειτουργία απώλειας
- Βελτιστοποιητής: κλίση κατάβασης
- Πολλαπλασιασμός πίνακα
- Γράφημα και τανυστής
Αυτό είναι κουραστικό και πιο περίπλοκο για έναν αρχάριο.
Λύση Pandas
Πρέπει να εισαγάγετε τις απαραίτητες βιβλιοθήκες για να εκπαιδεύσετε το μοντέλο.
import pandas as pd from sklearn import datasets import tensorflow as tf import itertools
Βήμα 1) Εισαγάγετε τα δεδομένα με Πάντα.
Ορίζετε τα ονόματα των στηλών και τα αποθηκεύετε σε ΣΤΗΛΕΣ. Μπορείτε να χρησιμοποιήσετε την pd.read_csv() για να εισαγάγετε τα δεδομένα.
COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age", "dis", "tax", "ptratio", "medv"]
Στρέψτε κάθε κλήση στα αρχεία CSV που κατεβάσατε νωρίτερα.
training_set = pd.read_csv("E:/boston_train.csv", skipinitialspace=True,skiprows=1, names=COLUMNS) test_set = pd.read_csv("E:/boston_test.csv", skipinitialspace=True,skiprows=1, names=COLUMNS) prediction_set = pd.read_csv("E:/boston_predict.csv", skipinitialspace=True,skiprows=1, names=COLUMNS)
Μπορείτε να εκτυπώσετε το σχήμα των δεδομένων.
print(training_set.shape, test_set.shape, prediction_set.shape)
Παραγωγή
(400, 10) (100, 10) (6, 10)
Σημειώστε ότι η ετικέτα, δηλαδή το y σας, περιλαμβάνεται στο σύνολο δεδομένων. Επομένως, πρέπει να ορίσετε δύο άλλες λίστες: μία που να περιέχει μόνο τα χαρακτηριστικά και μία μόνο το όνομα της ετικέτας. Αυτές οι δύο λίστες θα πουν στον εκτιμητή σας ποια είναι τα χαρακτηριστικά στο σύνολο δεδομένων και ποιο όνομα στήλης είναι η ετικέτα.
Γίνεται με τον παρακάτω κωδικό.
FEATURES = ["crim", "zn", "indus", "nox", "rm", "age", "dis", "tax", "ptratio"] LABEL = "medv"
Βήμα 2) Μετατρέψτε τα δεδομένα
Πρέπει να μετατρέψετε τις αριθμητικές μεταβλητές στην κατάλληλη μορφή. Το TensorFlow παρέχει μια μέθοδο για τη μετατροπή μιας συνεχούς μεταβλητής: tf.feature_column.numeric_column().
Στο προηγούμενο βήμα, ορίσατε μια λίστα με χαρακτηριστικά που θέλετε να συμπεριλάβετε στο μοντέλο. Τώρα μπορείτε να χρησιμοποιήσετε αυτήν τη λίστα για να τα μετατρέψετε σε αριθμητικά δεδομένα. Εάν θέλετε να εξαιρέσετε χαρακτηριστικά από το μοντέλο σας, μη διστάσετε να αφαιρέσετε μία ή περισσότερες μεταβλητές από τη λίστα FEATURES πριν κατασκευάσετε τη συνάρτηση feature_cols.
Σημειώστε ότι θα χρησιμοποιήσετε ένα Python Κατανόηση λίστας με τη λίστα FEATURES για να δημιουργήσετε μια νέα λίστα με όνομα feature_cols. Σας βοηθά να αποφύγετε την εγγραφή της tf.feature_column.numeric_column() εννέα φορές. Η κατανόηση λίστας είναι ένας ταχύτερος και καθαρότερος τρόπος για να δημιουργήσετε νέες λίστες.
feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]
Βήμα 3) Ορίστε τον εκτιμητή
Σε αυτό το βήμα, πρέπει να ορίσετε τον εκτιμητή. Το TensorFlow παρέχει έξι προκατασκευασμένους εκτιμητές, τρεις για εργασίες ταξινόμησης και τρεις για εργασίες παλινδρόμησης TensorFlow:
- Αναδρομικός
- DNN Regressor
- LinearRegressor
- DNNΓραμμική Συνδυασμένη Παλινδρόμηση
- ταξινόμηση
- DNNClassifier
- LinearClassifier
- DNNLinearCombinedClassifier
Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε το Linear Regressor. Για να αποκτήσετε πρόσβαση σε αυτήν τη λειτουργία, πρέπει να χρησιμοποιήσετε το tf.estimator.
Η συνάρτηση χρειάζεται δύο ορίσματα:
- feature_columns: περιέχει τις μεταβλητές που θα συμπεριληφθούν στο μοντέλο
- model_dir: διαδρομή για την αποθήκευση του γραφήματος, την αποθήκευση των παραμέτρων του μοντέλου και ούτω καθεξής
Το TensorFlow θα δημιουργήσει αυτόματα έναν φάκελο με το όνομα train στον κατάλογο εργασίας σας. Πρέπει να χρησιμοποιήσετε αυτήν τη διαδρομή για να αποκτήσετε πρόσβαση. TensorBoard, όπως φαίνεται στο παράδειγμα παλινδρόμησης TensorFlow παρακάτω.
estimator = tf.estimator.LinearRegressor(
feature_columns=feature_cols,
model_dir="train")
Παραγωγή
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a215dc550>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
Το δύσκολο κομμάτι με το TensorFlow είναι ο τρόπος τροφοδοσίας του μοντέλου. Το TensorFlow έχει σχεδιαστεί για να λειτουργεί με παράλληλη υπολογιστική και πολύ μεγάλα σύνολα δεδομένων. Λόγω του περιορισμού των πόρων του μηχανήματος, είναι αδύνατο να τροφοδοτήσετε το μοντέλο με όλα τα δεδομένα ταυτόχρονα. Για αυτό, πρέπει να τροφοδοτείτε μια δέσμη δεδομένων κάθε φορά. Σημειώστε ότι μιλάμε για τεράστια σύνολα δεδομένων με εκατομμύρια ή περισσότερες εγγραφές. Εάν δεν προσθέσετε μια δέσμη, θα καταλήξετε με σφάλμα μνήμης.
Για παράδειγμα, εάν τα δεδομένα σας περιέχουν 100 παρατηρήσεις και ορίσετε ένα μέγεθος παρτίδας 10, σημαίνει ότι το μοντέλο θα δει 10 παρατηρήσεις για κάθε επανάληψη (10*10).
Όταν το μοντέλο έχει δει όλα τα δεδομένα, ολοκληρώνει μια εποχή. Μια εποχή ορίζει πόσες φορές θέλετε το μοντέλο να δει τα δεδομένα. Είναι καλύτερο να ορίσετε αυτό το βήμα σε "καμία" και να αφήσετε το μοντέλο να εκτελέσει έναν καθορισμένο αριθμό επαναλήψεων.
Μια δεύτερη πληροφορία που πρέπει να προσθέσετε είναι εάν θέλετε να ανακατέψετε τα δεδομένα πριν από κάθε επανάληψη. Κατά τη διάρκεια της εκπαίδευσης, είναι σημαντικό να ανακατέψετε τα δεδομένα, ώστε το μοντέλο να μην μάθει ένα συγκεκριμένο μοτίβο του συνόλου δεδομένων. Εάν το μοντέλο μάθει τις λεπτομέρειες του υποκείμενου μοτίβου των δεδομένων, θα δυσκολευτεί να γενικεύσει την πρόβλεψη για μη ορατά δεδομένα. Αυτό ονομάζεται υπερπροσαρμογή. Το μοντέλο αποδίδει καλά στα δεδομένα εκπαίδευσης, αλλά δεν μπορεί να προβλέψει σωστά για μη ορατά δεδομένα.
Το TensorFlow διευκολύνει την εκτέλεση αυτών των δύο βημάτων. Όταν τα δεδομένα φτάσουν στον αγωγό, γνωρίζει πόσες παρατηρήσεις χρειάζεται (ομαδικά) και αν πρέπει να ανακατέψει τα δεδομένα.
Για να δώσετε οδηγίες στο TensorFlow για τον τρόπο τροφοδοσίας του μοντέλου, μπορείτε να χρησιμοποιήσετε την εντολή pandas_input_fn. Αυτό το αντικείμενο χρειάζεται πέντε παραμέτρους:
- x: δεδομένα χαρακτηριστικών
- y: δεδομένα ετικέτας
- batch_size: παρτίδα. Από προεπιλογή 128
- num_epoch: αριθμός εποχών, από προεπιλογή 1
- ανακάτεμα: ανακάτεμα των δεδομένων ή όχι. Από προεπιλογή, Κανένα
Πρέπει να τροφοδοτήσετε το μοντέλο πολλές φορές, επομένως ορίζετε μια συνάρτηση για να επαναλάβει αυτήν τη διαδικασία. Καλέστε αυτήν τη συνάρτηση get_input_fn.
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True): return tf.estimator.inputs.pandas_input_fn( x=pd.DataFrame({k: data_set[k].values for k in FEATURES}), y = pd.Series(data_set[LABEL].values), batch_size=n_batch, num_epochs=num_epochs, shuffle=shuffle)
Η συνήθης μέθοδος για την αξιολόγηση της απόδοσης ενός μοντέλου είναι:
- Εκπαιδεύστε το μοντέλο
- Αξιολόγηση του μοντέλου σε διαφορετικό σύνολο δεδομένων
- Κάντε μια πρόβλεψη
Ο εκτιμητής TensorFlow παρέχει τρεις διαφορετικές λειτουργίες για την εύκολη εκτέλεση αυτών των τριών βημάτων.
Βήμα 4) Εκπαιδεύστε το μοντέλο
Μπορείτε να χρησιμοποιήσετε τη μέθοδο εκμάθησης εκτιμητή για να προσαρμόσετε το μοντέλο. Ο εκτιμητής εκμάθησης χρειάζεται ένα input_fn και έναν αριθμό βημάτων. Μπορείτε να χρησιμοποιήσετε τη συνάρτηση που δημιουργήσατε παραπάνω για να τροφοδοτήσετε το μοντέλο. Στη συνέχεια, δίνετε εντολή στο μοντέλο να επαναληφθεί 1000 φορές. Σημειώστε ότι δεν καθορίζετε τον αριθμό των εποχών. αφήνετε το μοντέλο να επαναληφθεί 1000 φορές. Εάν ορίσετε τον αριθμό των εποχών σε 1, τότε το μοντέλο θα επαναληφθεί τέσσερις φορές, επειδή υπάρχουν 400 εγγραφές στο σύνολο εκπαίδευσης και το μέγεθος της παρτίδας είναι 128:
- Γραμμές 128
- Γραμμές 128
- Γραμμές 128
- Γραμμές 16
Επομένως, είναι ευκολότερο να ορίσετε τον αριθμό των εποχών σε καμία και να ορίσετε τον αριθμό των επαναλήψεων, όπως φαίνεται στο παράδειγμα ταξινόμησης TensorFlow παρακάτω.
estimator.train(input_fn=get_input_fn(training_set,
num_epochs=None,
n_batch = 128,
shuffle=False),
steps=1000)
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Saving checkpoints for 1 into train/model.ckpt. INFO:tensorflow:loss = 83729.64, step = 1 INFO:tensorflow:global_step/sec: 238.616 INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec) INFO:tensorflow:global_step/sec: 314.293 INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec) INFO:tensorflow:global_step/sec: 303.863 INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec) INFO:tensorflow:global_step/sec: 308.782 INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec) INFO:tensorflow:global_step/sec: 244.969 INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec) INFO:tensorflow:global_step/sec: 155.966 INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec) INFO:tensorflow:global_step/sec: 263.256 INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec) INFO:tensorflow:global_step/sec: 254.112 INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec) INFO:tensorflow:global_step/sec: 292.405 INFO:tensorflow:loss = 10845.855, step = 901 (0.341 sec) INFO:tensorflow:Saving checkpoints for 1000 into train/model.ckpt. INFO:tensorflow:Loss for final step: 5925.9873.
Μπορείτε να ελέγξετε το TensorBoard με την ακόλουθη εντολή:
activate hello-tf # For MacOS tensorboard --logdir=./train # For Windows tensorboard --logdir=train
Βήμα 5) Αξιολογήστε το μοντέλο σας
Μπορείτε να αξιολογήσετε την προσαρμογή του μοντέλου σας στο δοκιμαστικό σετ με τον παρακάτω κωδικό:
ev = estimator.evaluate(
input_fn=get_input_fn(test_set,
num_epochs=1,
n_batch = 128,
shuffle=False))
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-05-13-01:43:13 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13 INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896
Μπορείτε να εκτυπώσετε την απώλεια με τον παρακάτω κωδικό:
loss_score = ev["loss"] print("Loss: {0:f}".format(loss_score))
Παραγωγή
Loss: 3215.895996
Το μοντέλο έχει απώλεια 3215. Μπορείτε να ελέγξετε τα συνοπτικά στατιστικά στοιχεία για να πάρετε μια ιδέα για το μέγεθος του σφάλματος.
training_set['medv'].describe()
Παραγωγή
count 400.000000 mean 22.625500 std 9.572593 min 5.000000 25% 16.600000 50% 21.400000 75% 25.025000 max 50.000000 Name: medv, dtype: float64
Από τα παραπάνω συνοπτικά στατιστικά στοιχεία, γνωρίζετε ότι η μέση τιμή για ένα σπίτι είναι 22 χιλιάδες, με ελάχιστη τιμή 5 χιλιάδες και μέγιστη 50 χιλιάδες. Επειδή η αναφερόμενη ζημία είναι το μέσο τετραγωνικό σφάλμα, το τυπικό σφάλμα στις αρχικές μονάδες είναι περίπου η τετραγωνική ρίζα του 32.16, που είναι περίπου 5.7 χιλιάδες δολάρια.
Βήμα 6) Κάντε την πρόβλεψη
Τέλος, μπορείτε να χρησιμοποιήσετε την εκτιμητική μέθοδο TensorFlow για να εκτιμήσετε την αξία έξι σπιτιών στη Βοστώνη.
y = estimator.predict(
input_fn=get_input_fn(prediction_set,
num_epochs=1,
n_batch = 128,
shuffle=False))
Για να εκτυπώσετε τις εκτιμώμενες τιμές, μπορείτε να χρησιμοποιήσετε αυτόν τον κώδικα:
predictions = list(p["predictions"] for p in itertools.islice(y, 6)) print("Predictions: {}".format(str(predictions)))
Παραγωγή
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.96125], dtype=float32), array([27.270979], dtype=float32), array([29.299236], dtype=float32), array([16.436684], dtype=float32), array([21.460876], dtype=float32)]
Το μοντέλο προβλέπει τις ακόλουθες τιμές:
| Σπίτι | Πρόβλεψη |
| 1 | 32.29 |
| 2 | 18.96 |
| 3 | 27.27 |
| 4 | 29.29 |
| 5 | 16.43 |
| 6 | 21.46 |
Σημειώστε ότι δεν γνωρίζουμε την πραγματική αξία αυτών των έξι σπιτιών. Στο σεμινάριο βαθιάς μάθησης, θα προσπαθήσετε να ξεπεράσετε το γραμμικό μοντέλο.
Λύση NumPy
Αυτή η ενότητα εξηγεί πώς να εκπαιδεύσετε το μοντέλο χρησιμοποιώντας έναν εκτιμητή NumPy για την τροφοδοσία των δεδομένων. Η μέθοδος είναι η ίδια, εκτός από το ότι θα χρησιμοποιήσετε τον εκτιμητή numpy_input_fn.
Διαβάστε τα ίδια τρία αρχεία CSV, αλλά διατηρήστε μόνο τους ακατέργαστους πίνακες NumPy με .values.
training_set_n = pd.read_csv("E:/boston_train.csv").values test_set_n = pd.read_csv("E:/boston_test.csv").values prediction_set_n = pd.read_csv("E:/boston_predict.csv").values
Βήμα 1) Εισαγάγετε τα δεδομένα
Πρώτα απ 'όλα, πρέπει να διαφοροποιήσετε τις μεταβλητές χαρακτηριστικών από την ετικέτα. Πρέπει να το κάνετε αυτό για τα δεδομένα εκπαίδευσης και τα δεδομένα αξιολόγησης. Είναι πιο γρήγορο να ορίσετε μια συνάρτηση για να διαχωρίσετε τα δεδομένα.
def prepare_data(df): X_train = df[:, :-3] y_train = df[:,-3] return X_train, y_train
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση για να διαχωρίσετε την ετικέτα από τα χαρακτηριστικά της αμαξοστοιχίας και να αξιολογήσετε σύνολα δεδομένων.
X_train, y_train = prepare_data(training_set_n) X_test, y_test = prepare_data(test_set_n)
Πρέπει να εξαιρέσετε την τελευταία στήλη του συνόλου δεδομένων πρόβλεψης, επειδή περιέχει μόνο NaN.
x_predict = prediction_set_n[:, :-2]
Επιβεβαιώστε το σχήμα του πίνακα. Σημειώστε ότι η ετικέτα δεν πρέπει να έχει δεύτερη διάσταση, που σημαίνει (400,).
print(X_train.shape, y_train.shape, x_predict.shape)
Παραγωγή
(400, 9) (400,) (6, 9)
Μπορείτε να δημιουργήσετε τις στήλες χαρακτηριστικών ως εξής:
feature_columns = [ tf.feature_column.numeric_column('x', shape=X_train.shape[1:])]
Ο εκτιμητής ορίζεται όπως πριν: καθορίζετε τις στήλες χαρακτηριστικών και πού θα αποθηκευτεί το γράφημα.
estimator = tf.estimator.LinearRegressor(
feature_columns=feature_columns,
model_dir="train1")
Παραγωγή
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a218d8f28>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
Μπορείτε να χρησιμοποιήσετε τον εκτιμητή NumPy για να τροφοδοτήσετε τα δεδομένα στο μοντέλο και στη συνέχεια να το εκπαιδεύσετε. Σημειώστε ότι ορίζουμε εκ των προτέρων τη συνάρτηση input_fn για να διευκολύνουμε την αναγνωσιμότητα.
# Train the estimator train_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_train}, y=y_train, batch_size=128, shuffle=False, num_epochs=None) estimator.train(input_fn = train_input,steps=5000)
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Saving checkpoints for 1 into train1/model.ckpt. INFO:tensorflow:loss = 83729.64, step = 1 INFO:tensorflow:global_step/sec: 490.057 INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec) INFO:tensorflow:global_step/sec: 788.986 INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec) INFO:tensorflow:global_step/sec: 736.339 INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec) INFO:tensorflow:global_step/sec: 383.305 INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec) INFO:tensorflow:global_step/sec: 859.832 INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec) INFO:tensorflow:global_step/sec: 804.394 INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec) INFO:tensorflow:global_step/sec: 753.059 INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec) INFO:tensorflow:global_step/sec: 402.165 INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec) INFO:tensorflow:global_step/sec: 344.022 INFO:tensorflow:loss = 10845.854, step = 901 (0.288 sec) INFO:tensorflow:Saving checkpoints for 1000 into train1/model.ckpt. INFO:tensorflow:Loss for final step: 5925.985. Out[23]: <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1b6ea860>
Αναπαράγετε το ίδιο βήμα με μια διαφορετική συνάρτηση εισόδου για να αξιολογήσετε το μοντέλο σας.
eval_input = tf.estimator.inputs.numpy_input_fn(
x={"x": X_test},
y=y_test,
shuffle=False,
batch_size=128,
num_epochs=1)
estimator.evaluate(eval_input,steps=None)
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-05-13-01:44:00 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00 INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945 Out[24]: {'average_loss': 32.158947, 'global_step': 1000, 'loss': 3215.8945}
Τέλος, μπορείτε να υπολογίσετε την πρόβλεψη. Θα πρέπει να είναι παρόμοια με το αποτέλεσμα Pandas.
test_input = tf.estimator.inputs.numpy_input_fn(
x={"x": x_predict},
batch_size=128,
num_epochs=1,
shuffle=False)
y = estimator.predict(test_input)
predictions = list(p["predictions"] for p in itertools.islice(y, 6))
print("Predictions: {}".format(str(predictions)))
Παραγωγή
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.961248], dtype=float32), array([27.270979], dtype=float32), array([29.299242], dtype=float32), array([16.43668], dtype=float32), array([21.460878], dtype=float32)]
Λύση TensorFlow
Το τελευταίο τμήμα είναι αφιερωμένο σε ένα καθαρό TensorFlow λύση. Αυτή η μέθοδος είναι ελαφρώς πιο περίπλοκη από τις άλλες δύο.
Σημειώστε ότι εάν χρησιμοποιείτε ένα Jupyter σημειωματάριο, πρέπει να κάνετε επανεκκίνηση και να καθαρίσετε τον πυρήνα για να εκτελέσετε αυτήν την συνεδρία.
Το TensorFlow έχει δημιουργήσει ένα εξαιρετικό εργαλείο για τη μεταφορά δεδομένων στη διοχέτευση. Σε αυτήν την ενότητα, θα δημιουργήσετε μόνοι σας τη συνάρτηση input_fn.
Βήμα 1) Καθορίστε τη διαδρομή και τη μορφή των δεδομένων
Πρώτα απ 'όλα, δηλώνετε δύο μεταβλητές με τη διαδρομή των αρχείων CSV. Σημειώστε ότι έχετε δύο αρχεία, ένα για το σύνολο εκπαίδευσης και ένα για το σύνολο δοκιμών.
import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"
Στη συνέχεια, πρέπει να ορίσετε τις στήλες που θέλετε να χρησιμοποιήσετε από το αρχείο CSV. Θα τις χρησιμοποιήσουμε όλες. Στη συνέχεια, πρέπει να δηλώσετε τον τύπο κάθε μεταβλητής.
Οι μεταβλητές float ορίζονται από [0.]
COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age", "dis", "tax", "ptratio", "medv"] RECORDS_ALL = [[0.0], [0.0], [0.0], [0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]
Βήμα 2) Καθορίστε τη συνάρτηση input_fn
Η λειτουργία μπορεί να χωριστεί σε τρία μέρη:
- Εισαγάγετε τα δεδομένα
- Δημιουργήστε τον επαναλήπτη
- Καταναλώστε τα δεδομένα
Παρακάτω είναι ο συνολικός κώδικας για τον ορισμό της συνάρτησης. Ο κώδικας θα εξηγηθεί στη συνέχεια.
def input_fn(data_file, batch_size, num_epoch = None): # Step 1 def parse_csv(value): columns = tf.decode_csv(value, record_defaults= RECORDS_ALL) features = dict(zip(COLUMNS, columns)) #labels = features.pop('median_house_value') labels = features.pop('medv') return features, labels # Extract lines from input files using the Dataset API. dataset = (tf.data.TextLineDataset(data_file) # Read text file .skip(1) # Skip header row .map(parse_csv)) dataset = dataset.repeat(num_epoch) dataset = dataset.batch(batch_size) # Step 3 iterator = dataset.make_one_shot_iterator() features, labels = iterator.get_next() return features, labels
Εισαγάγετε τα δεδομένα
Για ένα αρχείο CSV, η μέθοδος dataset διαβάζει μία γραμμή κάθε φορά. Για να δημιουργήσετε το σύνολο δεδομένων, πρέπει να χρησιμοποιήσετε το αντικείμενο TextLineΣύνολο δεδομένων. Το σύνολο δεδομένων σας έχει κεφαλίδα, επομένως πρέπει να χρησιμοποιήσετε την skip(1) για να παραλείψετε την πρώτη γραμμή. Σε αυτό το σημείο, διαβάζετε μόνο τα δεδομένα και εξαιρείτε την κεφαλίδα από τη διοχέτευση. Για να τροφοδοτήσετε το μοντέλο, πρέπει να διαχωρίσετε τα χαρακτηριστικά από την ετικέτα. Η μέθοδος που χρησιμοποιείται για την εφαρμογή οποιουδήποτε μετασχηματισμού στα δεδομένα είναι η map.
Αυτή η μέθοδος καλεί μια συνάρτηση που θα δημιουργήσετε για να σας καθοδηγήσει πώς να μετασχηματίσετε τα δεδομένα. Με λίγα λόγια, πρέπει να περάσετε τα δεδομένα στο TextLineαντικείμενο συνόλου δεδομένων, εξαιρέστε την κεφαλίδα και εφαρμόστε έναν μετασχηματισμό που δίνεται από μια συνάρτηση.
Code εξήγηση
- tf.data.TextLineDataset(data_file): αυτή η γραμμή διαβάζει το αρχείο CSV
- .skip(1): παραλείπει την κεφαλίδα
- .map(parse_csv)): αναλύει τις εγγραφές στους τανσόρους
Πρέπει να ορίσετε μια συνάρτηση για να δώσει οδηγίες στο αντικείμενο map. Μπορείτε να καλέσετε αυτήν τη συνάρτηση parse_csv.
Αυτή η συνάρτηση αναλύει το αρχείο CSV με τη μέθοδο tf.decode_csv και δηλώνει τα χαρακτηριστικά και την ετικέτα. Τα χαρακτηριστικά μπορούν να δηλωθούν ως λεξικό ή πλειάδα. Χρησιμοποιείτε τη μέθοδο λεξικού επειδή είναι πιο βολική.
Code εξήγηση
- tf.decode_csv(value, record_defaults= RECORDS_ALL): η μέθοδος decode_csv χρησιμοποιεί την έξοδο του TextLineΣύνολο δεδομένων για την ανάγνωση του αρχείου CSV. Η συνάρτηση record_defaults δίνει οδηγίες στο TensorFlow σχετικά με τους τύπους στηλών. Στο TensorFlow 2.x, αυτό το σύμβολο βρίσκεται στο tf.io.decode_csv.
- dict(zip(ΣΤΗΛΕΣ, στήλες)): συμπληρώνει το λεξικό με όλες τις στήλες π.χ.tracκατά τη διάρκεια αυτής της επεξεργασίας δεδομένων
- features.pop('medv'): εξαιρεί τη μεταβλητή-στόχο από τις μεταβλητές χαρακτηριστικών και δημιουργεί μια μεταβλητή ετικέτας
Το σύνολο δεδομένων χρειάζεται περαιτέρω στοιχεία για την επαναληπτική τροφοδότηση των τανυστών. Πράγματι, πρέπει να προσθέσετε τη μέθοδο repeat για να επιτρέψετε στο σύνολο δεδομένων να συνεχίσει επ' αόριστον να τροφοδοτεί το μοντέλο. Εάν δεν προσθέσετε τη μέθοδο, το μοντέλο θα επαναληφθεί μόνο μία φορά και στη συνέχεια θα εμφανίσει ένα σφάλμα επειδή δεν τροφοδοτούνται άλλα δεδομένα στη διοχέτευση.
Στη συνέχεια, μπορείτε να ελέγξετε το μέγεθος της παρτίδας με τη μέθοδο παρτίδας. Αυτό σημαίνει ότι λέτε στο σύνολο δεδομένων πόσα δεδομένα θέλετε να περάσετε στη διοχέτευση για κάθε επανάληψη. Εάν ορίσετε ένα μεγάλο μέγεθος παρτίδας, το μοντέλο θα είναι αργό.
Βήμα 3) Δημιουργήστε τον επαναλήπτη
Τώρα είστε έτοιμοι για το δεύτερο βήμα: δημιουργήστε έναν επαναλήπτη για να επιστρέψετε τα στοιχεία στο σύνολο δεδομένων.
Ο απλούστερος τρόπος δημιουργίας ενός τελεστή είναι με τη μέθοδο make_one_shot_iterator.
Μετά από αυτό, μπορείτε να δημιουργήσετε τα χαρακτηριστικά και τις ετικέτες από τον επαναλήπτη.
Βήμα 4) Καταναλώστε τα δεδομένα
Μπορείτε να ελέγξετε τι συμβαίνει με τη συνάρτηση input_fn. Πρέπει να καλέσετε τη συνάρτηση σε μια συνεδρία για να καταναλώσετε τα δεδομένα. Δοκιμάστε με μέγεθος παρτίδας ίσο με 1.
Σημειώστε ότι εκτυπώνει τα χαρακτηριστικά σε ένα λεξικό και την ετικέτα ως πίνακα.
Θα εμφανιστεί η πρώτη γραμμή του αρχείου CSV. Μπορείτε να δοκιμάσετε να εκτελέσετε αυτόν τον κώδικα πολλές φορές με διαφορετικά μεγέθη παρτίδας.
next_batch = input_fn(df_train, batch_size = 1, num_epoch = None) with tf.Session() as sess: first_batch = sess.run(next_batch) print(first_batch)
Παραγωγή
({'crim': array([2.3004], dtype=float32), 'zn': array([0.], dtype=float32), 'indus': array([19.58], dtype=float32), 'nox': array([0.605], dtype=float32), 'rm': array([6.319], dtype=float32), 'age': array([96.1], dtype=float32), 'dis': array([2.1], dtype=float32), 'tax': array([403.], dtype=float32), 'ptratio': array([14.7], dtype=float32)}, array([23.8], dtype=float32))
Βήμα 5) Καθορίστε τη στήλη χαρακτηριστικών
Πρέπει να ορίσετε τις αριθμητικές στήλες ως εξής:
X1= tf.feature_column.numeric_column('crim') X2= tf.feature_column.numeric_column('zn') X3= tf.feature_column.numeric_column('indus') X4= tf.feature_column.numeric_column('nox') X5= tf.feature_column.numeric_column('rm') X6= tf.feature_column.numeric_column('age') X7= tf.feature_column.numeric_column('dis') X8= tf.feature_column.numeric_column('tax') X9= tf.feature_column.numeric_column('ptratio')
Σημειώστε ότι πρέπει να συνδυάσετε όλες τις μεταβλητές σε έναν κάδο.
base_columns = [X1, X2, X3,X4, X5, X6,X7, X8, X9]
Βήμα 6) Δημιουργήστε το μοντέλο
Μπορείτε να εκπαιδεύσετε το μοντέλο με τον εκτιμητή LinearRegressor.
model = tf.estimator.LinearRegressor(feature_columns=base_columns, model_dir='train3')
Παραγωγή
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'train3', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820a010f0>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
Πρέπει να χρησιμοποιήσετε α συνάρτηση λάμδα για να σας επιτρέψει να γράψετε τα ορίσματα για τη συνάρτηση input_fn. Εάν δεν χρησιμοποιήσετε μια συνάρτηση λάμδα, δεν μπορείτε να εκπαιδεύσετε το μοντέλο.
# Train the estimator model.train(steps =1000, input_fn= lambda : input_fn(df_train,batch_size=128, num_epoch = None))
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Saving checkpoints for 1 into train3/model.ckpt. INFO:tensorflow:loss = 83729.64, step = 1 INFO:tensorflow:global_step/sec: 72.5646 INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec) INFO:tensorflow:global_step/sec: 101.355 INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec) INFO:tensorflow:global_step/sec: 109.293 INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec) INFO:tensorflow:global_step/sec: 102.235 INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec) INFO:tensorflow:global_step/sec: 104.656 INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec) INFO:tensorflow:global_step/sec: 106.697 INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec) INFO:tensorflow:global_step/sec: 118.454 INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec) INFO:tensorflow:global_step/sec: 114.947 INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec) INFO:tensorflow:global_step/sec: 111.484 INFO:tensorflow:loss = 10845.855, step = 901 (0.897 sec) INFO:tensorflow:Saving checkpoints for 1000 into train3/model.ckpt. INFO:tensorflow:Loss for final step: 5925.9873. Out[8]: <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x18225eb8d0>
Μπορείτε να αξιολογήσετε την προσαρμογή του μοντέλου σας στο δοκιμαστικό σετ με τον παρακάτω κωδικό:
results = model.evaluate(steps =None,input_fn=lambda: input_fn(df_eval, batch_size =128, num_epoch = 1)) for key in results: print(" {}, was: {}".format(key, results[key]))
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-05-13-02:06:02 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02 INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896 average_loss, was: 32.158958435058594 loss, was: 3215.89599609375 global_step, was: 1000
Το τελευταίο βήμα είναι η πρόβλεψη της τιμής του στόχου με βάση την τιμή του πίνακα χαρακτηριστικών. Μπορείτε να γράψετε ένα λεξικό με τις τιμές που θέλετε να προβλέψετε. Το μοντέλο σας έχει εννέα χαρακτηριστικά, επομένως πρέπει να δώσετε μια τιμή για το καθένα. Το μοντέλο θα παρέχει μια πρόβλεψη για καθένα από αυτά.
Στον παρακάτω κώδικα, γράφετε τις τιμές κάθε χαρακτηριστικού που περιέχεται στο αρχείο CSV df_predict.
Πρέπει να γράψετε μια νέα συνάρτηση input_fn επειδή δεν υπάρχει ετικέτα στο σύνολο δεδομένων. Μπορείτε να χρησιμοποιήσετε το API from_tensors από το αντικείμενο Dataset.
prediction_input = {
'crim': [0.03359,5.09017,0.12650,0.05515,8.15174,0.24522],
'zn': [75.0,0.0,25.0,33.0,0.0,0.0],
'indus': [2.95,18.10,5.13,2.18,18.10,9.90],
'nox': [0.428,0.713,0.453,0.472,0.700,0.544],
'rm': [7.024,6.297,6.762,7.236,5.390,5.782],
'age': [15.8,91.8,43.4,41.1,98.9,71.7],
'dis': [5.4011,2.3682,7.9809,4.0220,1.7281,4.0317],
'tax': [252,666,284,222,666,304],
'ptratio': [18.3,20.2,19.7,18.4,20.2,18.4]
}
def test_input_fn():
dataset = tf.data.Dataset.from_tensors(prediction_input)
return dataset
# Predict all our prediction_input
pred_results = model.predict(input_fn=test_input_fn)
Τέλος, εκτυπώνετε τις προβλέψεις.
for pred in enumerate(pred_results): print(pred)
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([32.297546], dtype=float32)}) (1, {'predictions': array([18.96125], dtype=float32)}) (2, {'predictions': array([27.270979], dtype=float32)}) (3, {'predictions': array([29.299236], dtype=float32)}) (4, {'predictions': array([16.436684], dtype=float32)}) (5, {'predictions': array([21.460876], dtype=float32)}) INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([35.60663], dtype=float32)}) (1, {'predictions': array([22.298521], dtype=float32)}) (2, {'predictions': array([25.74533], dtype=float32)}) (3, {'predictions': array([35.126694], dtype=float32)}) (4, {'predictions': array([17.94416], dtype=float32)}) (5, {'predictions': array([22.606628], dtype=float32)})
Και οι τρεις αγωγοί επιστρέφουν τις ίδιες έξι προβλέψεις, γεγονός που επιβεβαιώνει ότι η επιλογή μεταξύ Pandas, NumPy και ενός εγγενούς συνόλου δεδομένων TensorFlow είναι θέμα ευκολίας και όχι ακρίβειας.





