Εκμάθηση γραμμικής παλινδρόμησης με TensorFlow [Παραδείγματα]
Τι είναι η γραμμική παλινδρόμηση;
γραμμική Παλινδρόμηση είναι μια προσέγγιση στα στατιστικά για τη μοντελοποίηση σχέσεων μεταξύ δύο μεταβλητών. Αυτή η μοντελοποίηση γίνεται μεταξύ μιας κλιμακωτής απόκρισης και μιας ή περισσότερων επεξηγηματικών μεταβλητών. Η σχέση με μία επεξηγηματική μεταβλητή ονομάζεται απλή γραμμική παλινδρόμηση και για περισσότερες από μία επεξηγηματικές μεταβλητές ονομάζεται πολλαπλή γραμμική παλινδρόμηση.
Το TensorFlow παρέχει εργαλεία για τον πλήρη έλεγχο των υπολογισμών. Αυτό γίνεται με το API χαμηλού επιπέδου. Επιπλέον, το TensorFlow είναι εξοπλισμένο με μια τεράστια γκάμα API για την εκτέλεση πολλών μάθηση μηχανής αλγόριθμους. Αυτό είναι το API υψηλού επιπέδου. Το TensorFlow τους αποκαλεί εκτιμητές
- API χαμηλού επιπέδου: Κατασκευάστε την αρχιτεκτονική, βελτιστοποίηση του μοντέλου από την αρχή. Είναι περίπλοκο για έναν αρχάριο
- API υψηλού επιπέδου: Ορίστε τον αλγόριθμο. Είναι πιο εύκολο. Το TensorFlow παρέχει μια εργαλειοθήκη που ονομάζεται εκτιμητής να κατασκευάσει, να εκπαιδεύσει, να αξιολογήσει και να κάνει μια πρόβλεψη.
Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε το μόνο εκτιμητές. Οι υπολογισμοί είναι ταχύτεροι και ευκολότεροι στην εφαρμογή τους. Το πρώτο μέρος του σεμιναρίου εξηγεί πώς να χρησιμοποιήσετε το βελτιστοποιητή κατάβασης κλίσης για να εκπαιδεύσετε μια Γραμμική παλινδρόμηση στο TensorFlow. Σε ένα δεύτερο μέρος, θα χρησιμοποιήσετε το σύνολο δεδομένων της Βοστώνης για να προβλέψετε την τιμή ενός σπιτιού χρησιμοποιώντας τον εκτιμητή TensorFlow.
Πώς να εκπαιδεύσετε ένα μοντέλο γραμμικής παλινδρόμησης
Πριν αρχίσουμε να εκπαιδεύουμε το μοντέλο, ας ρίξουμε μια ματιά στο τι είναι μια γραμμική παλινδρόμηση.
Φανταστείτε ότι έχετε δύο μεταβλητές, x και y και η αποστολή σας είναι να προβλέψετε την τιμή της γνώσης της τιμής του . Εάν σχεδιάσετε τα δεδομένα, μπορείτε να δείτε μια θετική σχέση μεταξύ της ανεξάρτητης μεταβλητής σας, 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 που λαμβάνεται ανεξάρτητα.
Ας δούμε ένα παράδειγμα. Φανταστείτε ότι θέλετε να προβλέψετε τις πωλήσεις ενός καταστήματος παγωτού. Το σύνολο δεδομένων περιέχει διαφορετικές πληροφορίες όπως ο καιρός (π.χ. βροχερός, ηλιόλουστος, συννεφιασμένος), πληροφορίες πελατών (π.χ. μισθός, φύλο, οικογενειακή κατάσταση).
Η παραδοσιακή ανάλυση θα προσπαθήσει να προβλέψει την πώληση υπολογίζοντας ας πούμε τον μέσο όρο για κάθε μεταβλητή και θα προσπαθήσει να εκτιμήσει την πώληση για διαφορετικά σενάρια. Θα οδηγήσει σε κακές προβλέψεις και θα περιορίσει την ανάλυση στο επιλεγμένο σενάριο.
Εάν χρησιμοποιείτε γραμμική παλινδρόμηση, μπορείτε να γράψετε αυτήν την εξίσωση:
Ο αλγόριθμος θα βρει την καλύτερη λύση για τα βάρη. σημαίνει ότι θα προσπαθήσει να ελαχιστοποιήσει το κόστος (τη διαφορά μεταξύ της προσαρμοσμένης γραμμής και των σημείων δεδομένων).
Πώς λειτουργεί ο αλγόριθμος
Ο αλγόριθμος θα επιλέξει έναν τυχαίο αριθμό για τον καθένα και
και αντικαταστήστε την τιμή του x για να πάρετε την προβλεπόμενη τιμή του y. Εάν το σύνολο δεδομένων έχει 100 παρατηρήσεις, ο αλγόριθμος υπολογίζει 100 προβλεπόμενες τιμές.
Μπορούμε να υπολογίσουμε το σφάλμα, σημειώθηκε του μοντέλου, που είναι η διαφορά μεταξύ της προβλεπόμενης και της πραγματικής τιμής. Ένα θετικό σφάλμα σημαίνει ότι το μοντέλο υποτιμά την πρόβλεψη του y και ένα αρνητικό σφάλμα σημαίνει ότι το μοντέλο υπερεκτιμά την πρόβλεψη του y.
Ο στόχος σας είναι να ελαχιστοποιήσετε το τετράγωνο του σφάλματος. Ο αλγόριθμος υπολογίζει τη μέση τιμή του τετραγώνου σφάλματος. Αυτό το βήμα ονομάζεται ελαχιστοποίηση του σφάλματος. Για τη γραμμική παλινδρόμηση είναι το Μέσο τετράγωνο σφάλμα, που ονομάζεται επίσης MSE. Μαθηματικά είναι:
Που:
είναι τα βάρη έτσι
αναφέρεται στην προβλεπόμενη τιμή
- y είναι οι πραγματικές τιμές
- m είναι ο αριθμός των παρατηρήσεων
Σημειώστε ότι σημαίνει ότι χρησιμοποιεί τη μετάθεση των πινάκων. ο
είναι η μαθηματική σημειογραφία του μέσου όρου.
Στόχος είναι να βρεις το καλύτερο που ελαχιστοποιούν το MSE
Εάν το μέσο σφάλμα είναι μεγάλο, σημαίνει ότι το μοντέλο έχει κακή απόδοση και τα βάρη δεν έχουν επιλεγεί σωστά. Για να διορθώσετε τα βάρη, πρέπει να χρησιμοποιήσετε έναν βελτιστοποιητή. Ο παραδοσιακός βελτιστοποιητής ονομάζεται Κάθοδος κλίσης.
Η βαθμιδωτή κάθοδος παίρνει την παράγωγο και μειώνει ή αυξάνει το βάρος. Εάν το παράγωγο είναι θετικό, το βάρος μειώνεται. Εάν το παράγωγο είναι αρνητικό, το βάρος αυξάνεται. Το μοντέλο θα ενημερώσει τα βάρη και θα υπολογίσει ξανά το σφάλμα. Αυτή η διαδικασία επαναλαμβάνεται έως ότου το σφάλμα δεν αλλάξει πλέον. Κάθε διαδικασία ονομάζεται an επανάληψη. Εξάλλου, οι κλίσεις πολλαπλασιάζονται με ένα ρυθμό μάθησης. Δείχνει την ταχύτητα της μάθησης.
Εάν ο ρυθμός εκμάθησης είναι πολύ μικρός, θα χρειαστεί πολύς χρόνος για να συγκλίνει ο αλγόριθμος (δηλαδή απαιτεί πολλές επαναλήψεις). Εάν το ποσοστό εκμάθησης είναι πολύ υψηλό, ο αλγόριθμος ενδέχεται να μην συγκλίνει ποτέ.
Μπορείτε να δείτε από την παραπάνω εικόνα, το μοντέλο επαναλαμβάνει τη διαδικασία περίπου 20 φορές πριν για να βρει μια σταθερή τιμή για τα βάρη, φτάνοντας επομένως στο χαμηλότερο σφάλμα.
Σημειώστε ότι, το σφάλμα δεν είναι ίσο με μηδέν αλλά σταθεροποιείται γύρω στο 5. Αυτό σημαίνει ότι το μοντέλο κάνει ένα τυπικό σφάλμα 5. Εάν θέλετε να μειώσετε το σφάλμα, πρέπει να προσθέσετε περισσότερες πληροφορίες στο μοντέλο, όπως περισσότερες μεταβλητές ή να χρησιμοποιήσετε διαφορετικούς εκτιμητές .
Θυμάσαι την πρώτη εξίσωση
Τα τελικά βάρη είναι 3.8 και 2.78. Το παρακάτω βίντεο σάς δείχνει πώς η κλίση κατάβασης βελτιστοποιεί τη συνάρτηση απώλειας για να βρείτε αυτά τα βάρη
Πώς να εκπαιδεύσετε μια Γραμμική παλινδρόμηση με το TensorFlow
Τώρα που έχετε καλύτερη κατανόηση του τι συμβαίνει πίσω από την κουκούλα, είστε έτοιμοι να χρησιμοποιήσετε το API εκτιμητή που παρέχεται από το TensorFlow για να εκπαιδεύσετε την πρώτη σας γραμμική παλινδρόμηση χρησιμοποιώντας το TensorFlow.
Θα χρησιμοποιήσετε το σύνολο δεδομένων Boston, το οποίο περιλαμβάνει τις ακόλουθες μεταβλητές
εγκληματικότητα | κατά κεφαλήν ποσοστό εγκληματικότητας ανά πόλη |
---|---|
zn | αναλογία γης οικιστικής ζώνης για οικόπεδα άνω των 25,000 τ.μ. |
Ινδός | αναλογία των στρεμμάτων επιχειρήσεων μη λιανικής ανά πόλη. |
nox | συγκέντρωση νιτρικών οξειδίων |
rm | μέσος αριθμός δωματίων ανά κατοικία |
την ηλικία του | ποσοστό των ιδιοκατοικούμενων μονάδων που κατασκευάστηκαν πριν από το 1940 |
dis | σταθμισμένες αποστάσεις σε πέντε κέντρα απασχόλησης της Βοστώνης |
φόρος | συντελεστής φόρου ακινήτων πλήρους αξίας ανά 10,000 δολάρια |
ptratio | αναλογία μαθητών-δασκάλων ανά πόλη |
medv | Διάμεση αξία κατοικιών σε χιλιάδες δολάρια |
Θα δημιουργήσετε τρία διαφορετικά σύνολα δεδομένων:
σύνολο δεδομένων | σκοπός | σχήμα |
---|---|---|
Προπόνηση | Εκπαιδεύστε το μοντέλο και αποκτήστε τα βάρη | 400, 10 |
Εκτίμηση | Αξιολογήστε την απόδοση του μοντέλου σε αόρατα δεδομένα | 100, 10 |
Προλέγω | Χρησιμοποιήστε το μοντέλο για να προβλέψετε την αξία κατοικίας σε νέα δεδομένα | 6, 10 |
Ο στόχος είναι να χρησιμοποιηθούν τα χαρακτηριστικά του συνόλου δεδομένων για την πρόβλεψη της αξίας του σπιτιού.
Κατά τη διάρκεια του δεύτερου μέρους του σεμιναρίου, θα μάθετε πώς να χρησιμοποιείτε το TensorFlow με τρεις διαφορετικούς τρόπους εισαγωγής των δεδομένων:
- Με Πάντα
- Με Νούμπι
- Μόνο TF
Σημειώστε ότι, όλες οι επιλογές παρέχουν τα ίδια αποτελέσματα.
Θα μάθετε πώς να χρησιμοποιείτε το API υψηλού επιπέδου για τη δημιουργία, την εκπαίδευση ενός μοντέλου γραμμικής παλινδρόμησης TensorFlow. Εάν χρησιμοποιούσατε το API χαμηλού επιπέδου, έπρεπε να ορίσετε με το χέρι τα εξής:
- Λειτουργία απώλειας
- Βελτιστοποίηση: Κάθοδος με κλίση
- Πολλαπλασιασμός πινάκων
- Γράφημα και τανυστής
Αυτό είναι κουραστικό και πιο περίπλοκο για αρχάριους.
Πάντα
Πρέπει να εισαγάγετε τις απαραίτητες βιβλιοθήκες για να εκπαιδεύσετε το μοντέλο.
import pandas as pd from sklearn import datasets import tensorflow as tf import itertools
Βήμα 1) Εισαγάγετε τα δεδομένα με αρκτοειδές ζώο της ασίας.
Ορίζετε τα ονόματα των στηλών και τα αποθηκεύετε σε COLUMNS. Μπορείτε να χρησιμοποιήσετε το pd.read_csv() για να εισαγάγετε τα δεδομένα.
COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age", "dis", "tax", "ptratio", "medv"]
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 παρέχει επί του παρόντος 6 προκατασκευασμένους εκτιμητές, συμπεριλαμβανομένων 3 για εργασία ταξινόμησης και 3 για εργασία παλινδρόμησης TensorFlow:
- Αναδρομικός
- DNN Regressor
- LinearRegressor
- DNNLineaCombinedRegressor
- ταξινόμηση
- DNNClassifier
- LinearClassifier
- DNNLineaCombinedClassifier
Σε αυτό το σεμινάριο, θα χρησιμοποιήσετε το 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. Αυτό το αντικείμενο χρειάζεται 5 παραμέτρους:
- x: δεδομένα χαρακτηριστικών
- y: δεδομένα ετικέτας
- batch_size: παρτίδα. Από προεπιλογή 128
- num_epoch: Αριθμός εποχής, από προεπιλογή 1
- shuffle: Ανακατέψτε ή όχι τα δεδομένα. Από προεπιλογή, Κανένα
Πρέπει να τροφοδοτήσετε το μοντέλο πολλές φορές, ώστε να ορίσετε μια συνάρτηση για την επανάληψη αυτής της διαδικασίας. όλη αυτή η συνάρτηση 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, τότε το μοντέλο θα επαναληφθεί 4 φορές: Υπάρχουν 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 χιλιάδες, με ελάχιστη τιμή 9 χιλιάδες και μέγιστη 50 χιλιάδες. Το μοντέλο κάνει ένα τυπικό σφάλμα 3 χιλιάδων δολαρίων.
Βήμα 6) Κάντε την πρόβλεψη
Τέλος, μπορείτε να χρησιμοποιήσετε τον εκτιμητή TensorFlow predict για να υπολογίσετε την αξία 6 κατοικιών στη Βοστώνη.
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 | |
7 | 21.46 |
Σημειώστε ότι δεν γνωρίζουμε την πραγματική τιμή του . Στο σεμινάριο της βαθιάς μάθησης, θα προσπαθήσετε να νικήσετε το γραμμικό μοντέλο
Λύση Numpy
Αυτή η ενότητα εξηγεί πώς να εκπαιδεύσετε το μοντέλο χρησιμοποιώντας έναν εκτιμητή numpy για την τροφοδοσία των δεδομένων. Η μέθοδος είναι η ίδια εκτός από την οποία θα χρησιμοποιήσετε τον εκτιμητή numpy_input_fn.
training_set_n = pd.read_csv("E:/boston_train.csv").τιμές
test_set_n = pd.read_csv("E:/boston_test.csv").τιμές
prediction_set_n = pd.read_csv("E:/boston_predict.csv").τιμές
Βήμα 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 estimapor για να τροφοδοτήσετε τα δεδομένα στο μοντέλο και στη συνέχεια να εκπαιδεύσετε το μοντέλο. Σημειώστε ότι, ορίζουμε τη συνάρτηση input_fn πριν για να διευκολύνουμε την αναγνωσιμότητα.
# Train the estimatortrain_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}
Τέλος, μπορείτε να υπολογίσετε την πρόβλεψη. Θα πρέπει να είναι παρόμοιο με τα πάντα.
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, η μέθοδος δεδομένων διαβάζει μία γραμμή κάθε φορά. Για να δημιουργήσετε το σύνολο δεδομένων, πρέπει να χρησιμοποιήσετε το αντικείμενο TextLineΣύνολο δεδομένων. Το σύνολο δεδομένων σας έχει μια κεφαλίδα, επομένως πρέπει να χρησιμοποιήσετε το skip(1) για να παραλείψετε την πρώτη γραμμή. Σε αυτό το σημείο, διαβάζετε μόνο τα δεδομένα και αποκλείετε την κεφαλίδα στη διοχέτευση. Για να τροφοδοτήσετε το μοντέλο, πρέπει να διαχωρίσετε τα χαρακτηριστικά από την ετικέτα. Η μέθοδος που χρησιμοποιείται για την εφαρμογή οποιουδήποτε μετασχηματισμού στα δεδομένα είναι ο χάρτης.
Αυτή η μέθοδος καλεί μια συνάρτηση που θα δημιουργήσετε για να σας δώσει οδηγίες για τον μετασχηματισμό των δεδομένων. Με λίγα λόγια, πρέπει να περάσετε τα δεδομένα στο TextLineΑντικείμενο συνόλου δεδομένων, εξαιρέστε την κεφαλίδα και εφαρμόστε έναν μετασχηματισμό που δίδεται από μια συνάρτηση. Εξήγηση κώδικα
- tf.data.TextLineΣύνολο δεδομένων(αρχείο_δεδομένων): Αυτή η γραμμή διαβάζει το αρχείο csv
- .skip(1) : παράλειψη της κεφαλίδας
- .map(parse_csv)): αναλύστε τις εγγραφές στους τανυστέςΠρέπει να ορίσετε μια συνάρτηση για την εντολή στο αντικείμενο του χάρτη. Μπορείτε να καλέσετε αυτή τη συνάρτηση parse_csv.
Αυτή η συνάρτηση αναλύει το αρχείο csv με τη μέθοδο tf.decode_csv και δηλώνει τα χαρακτηριστικά και την ετικέτα. Τα χαρακτηριστικά μπορούν να δηλωθούν ως λεξικό ή πλειάδα. Χρησιμοποιείτε τη μέθοδο λεξικού γιατί είναι πιο βολική.Εξήγηση κώδικα
- tf.decode_csv(value, record_defaults= RECORDS_ALL): η μέθοδος decode_csv χρησιμοποιεί την έξοδο του TextLineΣύνολο δεδομένων για ανάγνωση του αρχείου csv. Το record_defaults δίνει οδηγίες στο TensorFlow σχετικά με τον τύπο στηλών.
- dict(zip(_CSV_COLUMNS, στήλες)): Συμπληρώστε το λεξικό με όλες τις στήλες που εξήχθησαν κατά τη διάρκεια αυτής της επεξεργασίας δεδομένων
- features.pop('median_house_value'): Εξαιρέστε τη μεταβλητή στόχο από τη μεταβλητή χαρακτηριστικό και δημιουργήστε μια μεταβλητή ετικέτας
Το σύνολο δεδομένων χρειάζεται περαιτέρω στοιχεία για την επαναληπτική τροφοδοσία των τανυστήρων. Πράγματι, πρέπει να προσθέσετε τη μέθοδο επανάληψης για να επιτρέψετε στο σύνολο δεδομένων να συνεχίσει επ' αόριστον για να τροφοδοτήσει το μοντέλο. Εάν δεν προσθέσετε τη μέθοδο, το μοντέλο θα επαναλάβει μόνο μία φορά και στη συνέχεια θα εμφανίσει ένα σφάλμα επειδή δεν τροφοδοτούνται περισσότερα δεδομένα στη διοχέτευση.
Μετά από αυτό, μπορείτε να ελέγξετε το μέγεθος της παρτίδας με τη μέθοδο παρτίδας. Σημαίνει ότι λέτε στο σύνολο δεδομένων πόσα δεδομένα θέλετε να διαβιβάσετε στον αγωγό για κάθε επανάληψη. Εάν ορίσετε ένα μεγάλο μέγεθος παρτίδας, το μοντέλο θα είναι αργό.
Βήμα 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))
Βήμα 4) Καθορίστε τη στήλη χαρακτηριστικών
Πρέπει να ορίσετε τις αριθμητικές στήλες ως εξής:
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]
Βήμα 5) Δημιουργήστε το μοντέλο
Μπορείτε να εκπαιδεύσετε το μοντέλο με τον εκτιμητή 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}
Πρέπει να χρησιμοποιήσετε μια συνάρτηση λάμδα για να επιτρέψετε να γράψετε το όρισμα στη συνάρτηση inpu_fn. Εάν δεν χρησιμοποιείτε α συνάρτηση λάμδα, δεν μπορείτε να εκπαιδεύσετε το μοντέλο.
# Train the estimatormodel.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
Το τελευταίο βήμα είναι η πρόβλεψη της τιμής του με βάση την τιμή του , οι πίνακες των χαρακτηριστικών. Μπορείτε να γράψετε ένα λεξικό με τις τιμές που θέλετε να προβλέψετε. Το μοντέλο σας έχει 9 χαρακτηριστικά, επομένως πρέπει να δώσετε μια τιμή για το καθένα. Το μοντέλο θα παρέχει μια πρόβλεψη για καθένα από αυτά.
Στον παρακάτω κώδικα, γράψατε τις τιμές για κάθε χαρακτηριστικό που περιέχεται στο αρχείο csv df_predict.
Πρέπει να γράψετε μια νέα συνάρτηση input_fn επειδή δεν υπάρχει ετικέτα στο σύνολο δεδομένων. Μπορείτε να χρησιμοποιήσετε το API from_tensor από το σύνολο δεδομένων.
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_inputpred_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)})
Σύνοψη
Για να εκπαιδεύσετε ένα μοντέλο, πρέπει:
- Ορίστε τα χαρακτηριστικά: Ανεξάρτητες μεταβλητές: X
- Ορίστε την ετικέτα: Εξαρτημένη μεταβλητή: y
- Κατασκευάστε ένα τρένο/σετ δοκιμής
- Καθορίστε το αρχικό βάρος
- Ορίστε τη συνάρτηση απώλειας: MSE
- Βελτιστοποιήστε το μοντέλο: Κάθοδος με κλίση
- Καθορίζω:
- Ποσοστό εκμάθησης
- Αριθμός εποχής
- Μέγεθος παρτίδας
Σε αυτό το σεμινάριο, μάθατε πώς να χρησιμοποιείτε το API υψηλού επιπέδου για έναν εκτιμητή γραμμικής παλινδρόμησης TensorFlow. Πρέπει να ορίσετε:
- Στήλες χαρακτηριστικών. Εάν είναι συνεχές: tf.feature_column.numeric_column(). Μπορείτε να συμπληρώσετε μια λίστα με κατανόηση λίστας python
- Ο εκτιμητής: tf.estimator.LinearRegressor(feature_columns, model_dir)
- Μια συνάρτηση για την εισαγωγή των δεδομένων, το μέγεθος παρτίδας και την εποχή: input_fn()
Μετά από αυτό, είστε έτοιμοι να εκπαιδεύσετε, να αξιολογήσετε και να κάνετε πρόβλεψη με την train(), την αξιολόγηση() και την πρόβλεψη()