Γραμμική παλινδρόμηση TensorFlow με Όρος Όψης & Αλληλεπίδρασης
⚡ Έξυπνη Σύνοψη
Η γραμμική παλινδρόμηση στα δεδομένα κατοικιών της Βοστώνης βελτιώνεται όταν βρεθούν πρώτα οι σωστοί όροι αλληλεπίδρασης. Google Το Facets εκθέτει αυτές τις σχέσεις οπτικά και δύο διασταυρούμενα χαρακτηριστικά μειώνουν την απώλεια της δοκιμής TensorFlow από 1650 σε 1515.

Γραμμική Παλινδρόμηση TensorFlow
Σε αυτό το σεμινάριο, θα μάθετε πώς να ελέγχετε τα δεδομένα και να τα προετοιμάζετε για να δημιουργήσετε μια απλή εργασία γραμμικής παλινδρόμησης.
Αυτό το σεμινάριο χωρίζεται σε δύο μέρη:
- Ψάξτε για αλληλεπίδραση
- Δοκιμάστε το μοντέλο
Στο προηγούμενο σεμινάριο, χρησιμοποιήσατε το σύνολο δεδομένων της Βοστώνης για να υπολογίσετε τη διάμεση τιμή ενός σπιτιού. Το σύνολο δεδομένων της Βοστώνης έχει μικρό μέγεθος, με μόνο 506 παρατηρήσεις. Αυτό το σύνολο δεδομένων θεωρείται ως σημείο αναφοράς για τη δοκιμή νέων αλγορίθμων γραμμικής παλινδρόμησης.
Το σύνολο δεδομένων αποτελείται από:
| Μεταβλητός | Περιγραφή |
|---|---|
| zn | Το ποσοστό της οικιστικής γης που χωροθετείται για οικόπεδα άνω των 25,000 τ.μ. |
| Ινδός | Το ποσοστό των μη λιανικών επιχειρηματικών στρεμμάτων ανά πόλη. |
| nox | συγκέντρωση νιτρικών οξειδίων |
| rm | μέσος αριθμός δωματίων ανά κατοικία |
| την ηλικία του | το ποσοστό των ιδιοκατοικούμενων μονάδων που κατασκευάστηκαν πριν από το 1940 |
| dis | σταθμισμένες αποστάσεις σε πέντε κέντρα απασχόλησης της Βοστώνης |
| φόρος | συντελεστής φόρου ακινήτων πλήρους αξίας ανά 10,000 δολάρια |
| ptratio | η αναλογία μαθητών-δασκάλων ανά πόλη |
| medv | Η διάμεση αξία των κατοικιών σε χιλιάδες δολάρια |
| εγκληματικότητα | κατά κεφαλήν ποσοστό εγκληματικότητας ανά πόλη |
| chas | εικονική μεταβλητή Charles River (1 εάν οριοθετείται το ποτάμι, 0 διαφορετικά) |
| B | το ποσοστό των μαύρων στην πόλη |
Σε αυτό το σεμινάριο, θα εκτιμήσουμε τη διάμεση τιμή χρησιμοποιώντας έναν γραμμικό παλινδρομητή, αλλά η εστίαση είναι σε μια συγκεκριμένη διαδικασία μάθηση μηχανής: «Προετοιμασία δεδομένων».
Ένα μοντέλο γενικεύει το μοτίβο στα δεδομένα. Για να καταγράψετε ένα τέτοιο μοτίβο, πρέπει πρώτα να το βρείτε. Μια καλή πρακτική είναι να εκτελείτε μια ανάλυση δεδομένων πριν εκτελέσετε οποιονδήποτε αλγόριθμο μηχανικής εκμάθησης.
Η επιλογή των σωστών χαρακτηριστικών κάνει τη διαφορά στην επιτυχία του μοντέλου σας. Φανταστείτε ότι προσπαθείτε να υπολογίσετε τον μισθό ενός λαού, αν δεν συμπεριλάβετε το φύλο ως συμμεταβλητή, καταλήγετε σε μια κακή εκτίμηση.
Ένας άλλος τρόπος βελτίωσης του μοντέλου είναι να εξετάσουμε τη συσχέτιση μεταξύ της ανεξάρτητης μεταβλητής. Πίσω στο παράδειγμα, μπορείτε να σκεφτείτε την εκπαίδευση ως έναν εξαιρετικό υποψήφιο για να προβλέψετε τον μισθό αλλά και το επάγγελμα. Είναι δίκαιο να πούμε ότι το επάγγελμα εξαρτάται από το επίπεδο εκπαίδευσης, δηλαδή η τριτοβάθμια εκπαίδευση συχνά οδηγεί σε ένα καλύτερο επάγγελμα. Εάν γενικεύσουμε αυτήν την ιδέα, μπορούμε να πούμε ότι η συσχέτιση μεταξύ της εξαρτημένης μεταβλητής και μιας επεξηγηματικής μεταβλητής μπορεί να μεγεθυνθεί με μια άλλη επεξηγηματική μεταβλητή.
Για να συλλάβουμε την περιορισμένη επίδραση της εκπαίδευσης στο επάγγελμα, μπορούμε να χρησιμοποιήσουμε έναν όρο αλληλεπίδρασης.
Αν κοιτάξετε την εξίσωση του μισθού, γίνεται:
If είναι θετικό, τότε σημαίνει ότι ένα πρόσθετο επίπεδο εκπαίδευσης αποφέρει υψηλότερη αύξηση στη διάμεση αξία ενός σπιτιού για υψηλό επίπεδο απασχόλησης. Με άλλα λόγια, υπάρχει μια επίδραση αλληλεπίδρασης μεταξύ εκπαίδευσης και επαγγέλματος.
Η ίδια οικογένεια εκτιμητών τροφοδοτεί επίσης το γραμμικός ταξινομητής όταν η ετικέτα είναι μια κλάση και όχι μια τιμή. Σε αυτό το σεμινάριο, θα προσπαθήσουμε να δούμε ποιες μεταβλητές μπορούν να είναι καλές υποψήφιες για όρους αλληλεπίδρασης. Θα ελέγξουμε αν η προσθήκη αυτού του είδους πληροφοριών οδηγεί σε καλύτερη πρόβλεψη τιμών.
Συνοπτικά στατιστικά στοιχεία
Υπάρχουν μερικά βήματα που μπορείτε να ακολουθήσετε πριν προχωρήσετε στο μοντέλο. Όπως αναφέρθηκε προηγουμένως, το μοντέλο είναι μια γενίκευση των δεδομένων. Η καλύτερη πρακτική είναι να κατανοήσετε πρώτα τα δεδομένα και στη συνέχεια να κάνετε μια πρόβλεψη. Εάν δεν γνωρίζετε τα δεδομένα σας, έχετε ελάχιστες πιθανότητες να βελτιώσετε το μοντέλο σας.
Ως πρώτο βήμα, φορτώστε τα δεδομένα ως πλαίσιο δεδομένων pandas και δημιουργήστε ένα σετ εκπαίδευσης και σετ δοκιμών.
Συμβουλές: Για αυτό το σεμινάριο, πρέπει να έχετε εγκατεστημένα τα matplotlib και seaborn στο PythonΜπορείτε να εγκαταστήσετε ένα Python πακέτο εν κινήσει με Jupyter. Εσείς Δεν θα έπρεπε Κάνε αυτό
!conda install -- yes matplotlib
αλλά
import sys !{sys.executable} -m pip install matplotlib # Already installed !{sys.executable} -m pip install seaborn
Σημειώστε ότι αυτό το βήμα δεν είναι απαραίτητο εάν έχετε εγκαταστήσει τα matplotlib και seaborn.
Το Matplotlib είναι η βιβλιοθήκη στην οποία δημιουργείται ένα γράφημα PythonΤο Seaborn είναι μια βιβλιοθήκη στατιστικής οπτικοποίησης που βασίζεται στο matplotlib. Παρέχει...tracεντυπωσιακά και όμορφα οικόπεδα.
Ο παρακάτω κώδικας εισάγει τις απαραίτητες βιβλιοθήκες.
import pandas as pd from sklearn import datasets import tensorflow as tf from sklearn.datasets import load_boston import numpy as np
Το sklearn της βιβλιοθήκης περιλαμβάνει το σύνολο δεδομένων της Βοστώνης. Μπορείτε να καλέσετε το API του για να εισαγάγετε τα δεδομένα.
Σημείωση έκδοσης: load_boston είχε καταργηθεί στο scikit-learn 1.0 και αφαιρέθηκε στο scikit-learn 1.2 επειδή το σύνολο δεδομένων κωδικοποιεί μια φυλετικά φορτωμένη λειτουργία. Σε μια τρέχουσα εγκατάσταση, χρησιμοποιήστε fetch_california_housing αντίθετα, ή φορτώστε το αρχείο raw μόνοι σας. Η ροή εργασίας που φαίνεται παρακάτω δεν έχει αλλάξει. Διαφέρει μόνο το πρόγραμμα φόρτωσης.
boston = load_boston() df = pd.DataFrame(boston.data)
Τα ονόματα των χαρακτηριστικών αποθηκεύονται στο αντικείμενο feature_names ως πίνακας.
boston.feature_names
Παραγωγή
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
Μπορείτε να μετονομάσετε τις στήλες.
df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)
Μετατρέπετε τη μεταβλητή CHAS ως μεταβλητή συμβολοσειράς και την επισημαίνετε με ναι εάν CHAS = 1 και όχι εάν CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'}) df['CHAS'].head(5) 0 no 1 no 2 no 3 no 4 no Name: CHAS, dtype: object
Με τα πάντα, είναι εύκολο να χωρίσετε το σύνολο δεδομένων. Διαιρείτε τυχαία το σύνολο δεδομένων με 80 τοις εκατό σύνολο εκπαίδευσης και 20 τοις εκατό σύνολο δοκιμών. Πάντα έχει ενσωματωμένη συνάρτηση δειγματοληψίας για τη διαίρεση ενός πλαισίου δεδομένων.
Η πρώτη παράμετρος frac είναι μια τιμή από 0 έως 1. Μπορείτε να την ορίσετε σε 0.8 για να επιλέξετε τυχαία το 80 τοις εκατό του πλαισίου δεδομένων.
Η συνάρτηση random_state διορθώνει την ανακάτεμα, έτσι ώστε να επιστρέφονται οι ίδιες γραμμές για όλους.
### Create train/test set
df_train=df.sample(frac=0.8,random_state=200)
df_test=df.drop(df_train.index)
Μπορείτε να πάρετε το σχήμα των δεδομένων. Θα έπρεπε να είναι:
- Σετ τρένου: 506*0.8 = 405
- Δοκιμαστικό σύνολο: 506*0.2 = 101
print(df_train.shape, df_test.shape)
Παραγωγή
(405, 14) (101, 14)
df_test.head(5)
Παραγωγή
| ΕΓΚΛΗΜΑ | ZN | ΙΝΔΟΣ | CHAS | NOX | RM | Ηλικία | DIS | RAD | ΦΟΡΟΣ | ΠΤΡΑΤΙΟ | B | LSTAT | ΤΙΜΗ | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.00632 | 18.0 | 2.31 | Όχι. | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 |
| 1 | 0.02731 | 0.0 | 7.07 | Όχι. | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 |
| 3 | 0.03237 | 0.0 | 2.18 | Όχι. | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 |
| 6 | 0.08829 | 12.5 | 7.87 | Όχι. | 0.524 | 6.012 | 66.6 | 5.5605 | 5.0 | 311.0 | 15.2 | 395.60 | 12.43 | 22.9 |
| 7 | 0.14455 | 12.5 | 7.87 | Όχι. | 0.524 | 6.172 | 96.1 | 5.9505 | 5.0 | 311.0 | 15.2 | 396.90 | 19.15 | 27.1 |
Τα δεδομένα είναι ακατάστατα. Είναι συχνά μη ισορροπημένο και πασπαλισμένο με ακραίες τιμές που απορρίπτουν την κατάρτιση ανάλυσης και μηχανικής μάθησης.
Το πρώτο βήμα για να καθαρίσετε το σύνολο δεδομένων είναι να κατανοήσετε πού χρειάζεται καθαρισμός. Η εκκαθάριση ενός συνόλου δεδομένων μπορεί να είναι δύσκολη, ειδικά με οποιονδήποτε γενικεύσιμο τρόπο
The Google Η ερευνητική ομάδα έχει αναπτύξει ένα εργαλείο για αυτήν την εργασία που ονομάζεται Όψεις που σας βοηθά να οπτικοποιήσετε τα δεδομένα και να τα αναλύσετε με κάθε είδους τρόπους. Αυτό είναι ένα καλό σημείο εκκίνησης για να κατανοήσετε πώς είναι διαμορφωμένο το σύνολο δεδομένων.
Το Facets σάς επιτρέπει να εντοπίσετε πού τα δεδομένα δεν φαίνονται ακριβώς όπως τα περιμένετε.
Εκτός από την εφαρμογή ιστού τους, Google διευκολύνει την ενσωμάτωση του κιτ εργαλείων σε ένα Jupyter σημειωματάριο.
Υπάρχουν δύο μέρη στις όψεις:
- Επισκόπηση όψεων
- Facets Deep Dive
Επισκόπηση όψεων
Η Επισκόπηση όψεων παρέχει μια επισκόπηση του συνόλου δεδομένων. Η Επισκόπηση όψεων χωρίζει τις στήλες των δεδομένων σε σειρές με εμφανείς πληροφορίες
- το ποσοστό της παρατήρησης που λείπει
- ελάχιστες και μέγιστες τιμές
- στατιστικά όπως ο μέσος όρος, η διάμεσος και η τυπική απόκλιση.
- Προσθέτει επίσης μια στήλη που δείχνει το ποσοστό των τιμών που είναι μηδενικά, κάτι που είναι χρήσιμο όταν οι περισσότερες από τις τιμές είναι μηδενικές.
- Είναι δυνατό να δείτε αυτές τις κατανομές στο σύνολο δεδομένων δοκιμής καθώς και στο σετ εκπαίδευσης για κάθε χαρακτηριστικό. Σημαίνει ότι μπορείτε να ελέγξετε ξανά ότι το τεστ έχει παρόμοια κατανομή με τα δεδομένα εκπαίδευσης.
Αυτό είναι τουλάχιστον το ελάχιστο που πρέπει να κάνετε πριν από οποιαδήποτε εργασία μηχανικής εκμάθησης. Με αυτό το εργαλείο, δεν χάνετε αυτό το κρίσιμο βήμα και υπογραμμίζει ορισμένες ανωμαλίες.
Facets Deep Dive
Το Facets Deep Dive είναι ένα εξαιρετικό εργαλείο. Σας επιτρέπει να κατανοήσετε καλύτερα το σύνολο δεδομένων σας και να κάνετε ζουμ μέχρι το τέλος για να δείτε ένα μεμονωμένο κομμάτι δεδομένων. Αυτό σημαίνει ότι μπορείτε να όψεις τα δεδομένα ανά γραμμή και στήλη σε οποιαδήποτε από τις λειτουργίες του συνόλου δεδομένων.
Θα χρησιμοποιήσουμε αυτά τα δύο εργαλεία με το σύνολο δεδομένων της Βοστώνης.
Σημείωση: Δεν μπορείτε να χρησιμοποιήσετε το Facets Overview και το Facets Deep Dive ταυτόχρονα. Πρέπει πρώτα να καθαρίσετε το σημειωματάριο για να αλλάξετε το εργαλείο.
Πριν από τη χρήση οποιουδήποτε από τα δύο εργαλεία, το Facets πρέπει να εγκατασταθεί στο περιβάλλον του φορητού υπολογιστή.
Εγκαταστήστε το Facet
Μπορείτε να χρησιμοποιήσετε την εφαρμογή web Facet για το μεγαλύτερο μέρος της ανάλυσης. Σε αυτό το σεμινάριο, θα δείτε πώς να το χρησιμοποιήσετε μέσα σε ένα Jupyter Σημειωματάριο.
Πρώτα απ 'όλα, πρέπει να εγκαταστήσετε nbextensions. Γίνεται με αυτόν τον κωδικό. Αντιγράφετε και επικολλάτε τον παρακάτω κωδικό στο τερματικό του μηχανήματος σας.
pip install jupyter_contrib_nbextensions
Αμέσως μετά, πρέπει να κλωνοποιήσετε τα αποθετήρια στον υπολογιστή σας. Έχετε δύο επιλογές:
Επιλογή 1) Αντιγράψτε και επικολλήστε αυτόν τον κωδικό στο τερματικό (Συνιστάται)
Αν δεν έχετε εγκατεστημένο το Git στον υπολογιστή σας, παρακαλούμε μεταβείτε σε αυτό URL Git για Windows κατεβάστε σελίδα και ακολουθήστε τις οδηγίες. Μόλις τελειώσετε, μπορείτε να χρησιμοποιήσετε την εντολή git στο τερματικό για Mac User ή Anaconda Windows χρήστη
git clone https://github.com/PAIR-code/facets
Επιλογή 2) Πηγαίνετε στο το αποθετήριο PAIR-code/facets και κατεβάστε τα αποθετήρια.
Η σελίδα του αποθετηρίου παραπάνω περιέχει το κουμπί λήψης που χρησιμοποιείται από την επιλογή 2. Εάν επιλέξετε την πρώτη επιλογή, το αρχείο καταλήγει στον φάκελο λήψης. Μπορείτε είτε να αφήσετε το αρχείο να μεταφερθεί στη λήψη είτε να το σύρετε σε άλλη διαδρομή.
Μπορείτε να ελέγξετε πού είναι αποθηκευμένα τα Facets με αυτήν τη γραμμή εντολών:
echo `pwd`/`ls facets`
Τώρα που εντοπίσατε το Facets, πρέπει να το εγκαταστήσετε Jupyter Σημειωματάριο. Πρέπει να ορίσετε τον κατάλογο εργασίας στη διαδρομή όπου βρίσκονται οι πτυχές.
Ο τρέχων κατάλογος εργασίας και η τοποθεσία του zip Facets θα πρέπει να είναι ίδια.
Η παραπάνω λίστα τερματικού επιβεβαιώνει ότι το facets βρίσκεται στον τρέχοντα κατάλογο εργασίας. Πρέπει να κατευθύνετε τον κατάλογο εργασίας στο Facet:
cd facets
Για να εγκαταστήσετε το Facets Jupyter, έχετε δύο επιλογές. Εάν έχετε εγκαταστήσει Jupyter με το Conda για όλους τους χρήστες, αντιγράψτε αυτόν τον κωδικό:
jupyter nbextension install facets-dist/
Διαφορετικά, χρησιμοποιήστε:
jupyter nbextension install facets-dist/ --user
Εντάξει, είστε έτοιμοι. Ας ανοίξουμε το Facet Overview.
Εκτέλεση επισκόπησης Facets σε Jupyter
Επισκόπηση χρήσεις α Python σενάριο για τον υπολογισμό των στατιστικών. Πρέπει να εισαγάγετε το σενάριο που ονομάζεται generic_feature_statistics_generator Jupyter. Μην ανησυχείς. το σενάριο βρίσκεται στα αρχεία όψεων.
Πρέπει να εντοπίσετε τη διαδρομή του. Γίνεται εύκολα. Ανοίγετε facets, ανοίγετε το αρχείο facets_overview και μετά python. Αντιγράψτε τη διαδρομή
Μετά από αυτό, επιστρέψτε στο Jupyterκαι γράψτε τον παρακάτω κώδικα. Αλλάξτε τη διαδρομή '/Users/Thomas/facets/facets_overview/python' στη διαδρομή σας.
# Add the facets overview python code to the python path# Add t import sys sys.path.append('/Users/Thomas/facets/facets_overview/python')
Μπορείτε να εισαγάγετε το σενάριο με τον παρακάτω κώδικα.
from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator
Στα windows γίνεται ο ίδιος κωδικός
import sys sys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python") from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator
Για να υπολογίσετε τα στατιστικά στοιχεία χαρακτηριστικών, πρέπει να χρησιμοποιήσετε τη συνάρτηση GenericFeatureStatisticsGenerator(), και χρησιμοποιείτε το αντικείμενο ProtoFromDataFrames. Μπορείτε να περάσετε το πλαίσιο δεδομένων σε ένα λεξικό. Για παράδειγμα, εάν θέλουμε να δημιουργήσουμε μια συνοπτική στατιστική για το σύνολο τρένων, μπορούμε να αποθηκεύσουμε τις πληροφορίες σε ένα λεξικό και να τις χρησιμοποιήσουμε στο αντικείμενο «ProtoFromDataFrames»
'name': 'train', 'table': df_train
Όνομα είναι το όνομα του πίνακα που εμφανίζεται και χρησιμοποιείτε το όνομα του πίνακα που θέλετε να υπολογίσετε τη σύνοψη. Στο παράδειγμά σας, ο πίνακας που περιέχει τα δεδομένα είναι df_train
# Calculate the feature statistics proto from the datasets and stringify it for use in facets overview import base64 gfsg = GenericFeatureStatisticsGenerator() proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}, {'name': 'test', 'table': df_test}]) #proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}]) protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")
Τέλος, απλώς αντιγράψτε και επικολλήστε τον παρακάτω κώδικα. Ο κώδικας προέρχεται απευθείας από το GitHub. Θα πρέπει να μπορείτε να δείτε αυτό:
# Display the facets overview visualization for this data# Displ from IPython.core.display import display, HTML HTML_TEMPLATE = """<link rel="import" href="/nbextensions/facets-dist/facets-jupyter.html" > <facets-overview id="elem"></facets-overview> <script> document.querySelector("#elem").protoInput = "{protostr}"; </script>""" html = HTML_TEMPLATE.format(protostr=protostr) display(HTML(html))
Γράφημα συσχέτισης και πλέγμα ζευγών
Αφού ελέγξετε τα δεδομένα και την κατανομή τους, μπορείτε να σχεδιάσετε έναν πίνακα συσχέτισης. Ο πίνακας συσχέτισης υπολογίζει τον συντελεστή Pearson. Αυτός ο συντελεστής οριοθετείται μεταξύ -1 και 1, όπου μια θετική τιμή υποδηλώνει θετική συσχέτιση και μια αρνητική τιμή αρνητική συσχέτιση.
Σας ενδιαφέρει να δείτε ποιες μεταβλητές μπορούν να είναι καλοί υποψήφιοι για όρους αλληλεπίδρασης.
Σημείωση έκδοσης: η μάσκα από κάτω καλεί np.bool, ένα ψευδώνυμο που είχε καταργηθεί στο NumPy 1.20 και αφαιρέθηκε στο NumPy 1.24Σε μια πρόσφατη NumPy η ίδια γραμμή ανεβαίνει AttributeError: module 'numpy' has no attribute 'bool'; το ενσωματωμένο bool είναι η αντικατάσταση drop-in.
## Choose important feature and further check with Dive %matplotlib inline import matplotlib.pyplot as plt import seaborn as sns sns.set(style="ticks") # Compute the correlation matrix corr = df.corr('pearson') # Generate a mask for the upper triangle mask = np.zeros_like(corr, dtype=np.bool) mask[np.triu_indices_from(mask)] = True # Set up the matplotlib figure f, ax = plt.subplots(figsize=(11, 9)) # Generate a custom diverging colormap cmap = sns.diverging_palette(220, 10, as_cmap=True) # Draw the heatmap with the mask and correct aspect ratio sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True, square=True, linewidths=.5, cbar_kws={"shrink": .5})
Παραγωγή
<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>
Στον παραπάνω θερμικό χάρτη, τα πιο σκούρα τετράγωνα υποδεικνύουν ισχυρότερες συσχετίσεις. Από τον πίνακα, μπορείτε να δείτε:
- LSTAT
- RM
Συσχετίζονται έντονα με την PRICE. Ένα άλλο ενδιαφέρον χαρακτηριστικό είναι η ισχυρή θετική συσχέτιση μεταξύ NOX και INDUS, που σημαίνει ότι αυτές οι δύο μεταβλητές κινούνται προς την ίδια κατεύθυνση. Και οι δύο συσχετίζονται επίσης με την PRICE. Η DIS συσχετίζεται επίσης σε μεγάλο βαθμό με την INDUS και την NOX.
Έχετε μια πρώτη υπόδειξη ότι οι όροι INDUS και NOX μπορούν να είναι καλοί υποψήφιοι για έναν όρο αλληλεπίδρασης και ο όρος DIS μπορεί επίσης να είναι ενδιαφέρον να εστιάσουμε.
Μπορείτε να πάτε λίγο βαθύτερα σχεδιάζοντας ένα πλέγμα ζεύγους. Θα επεξηγήσει λεπτομερέστερα τον χάρτη συσχέτισης που σχεδιάσατε πριν.
Το πλέγμα ζευγαριών αποτελείται ως εξής:
- Επάνω μέρος: Οικόπεδο διασποράς με εφαρμοστή γραμμή
- Διαγώνιος: Διάγραμμα πυκνότητας πυρήνα
- Κάτω μέρος: Πολυμεταβλητή γραφική παράσταση πυκνότητας πυρήνα
Εστιάζετε σε τέσσερις ανεξάρτητες μεταβλητές. Η επιλογή αντιστοιχεί στις μεταβλητές με ισχυρή συσχέτιση με την PRICE.
- ΙΝΔΟΣ
- NOX
- RM
- LSTAT
επιπλέον η ΤΙΜΗ.
Σημείωση ότι το τυπικό σφάλμα προστίθεται από προεπιλογή στο διάγραμμα διασποράς.
attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"] g = sns.PairGrid(df[attributes]) g = g.map_upper(sns.regplot, color="g") g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False) g = g.map_diag(sns.kdeplot)
Παραγωγή
Ας ξεκινήσουμε με το πάνω μέρος:
- Η τιμή συσχετίζεται αρνητικά με τα INDUS, NOX και LSTAT. συσχετίζεται θετικά με το RM.
- Υπάρχει μια μικρή μη γραμμικότητα μεταξύ LSTAT και PRICE
- Υπάρχει σαν μια ευθεία γραμμή όταν η τιμή είναι ίση με 50. Από την περιγραφή του συνόλου δεδομένων, το PRICE έχει περικοπεί στην τιμή του 50
Διαγώνιος: Το NOX φαίνεται να έχει δύο συστάδες, ένα γύρω στο 0.5 και ένα γύρω στο 0.85.
Για να ελέγξετε περισσότερα σχετικά με αυτό, μπορείτε να δείτε το κάτω μέρος. Η Πολυμεταβλητή Πυκνότητα Πυρήνα είναι ενδιαφέρουσα από μια άποψη χρωματίζει εκεί που βρίσκονται τα περισσότερα σημεία. Η διαφορά με το διάγραμμα διασποράς σχεδιάζει μια πυκνότητα πιθανότητας, παρόλο που δεν υπάρχει σημείο στο σύνολο δεδομένων για μια δεδομένη συντεταγμένη. Όταν το χρώμα είναι πιο δυνατό, υποδηλώνει υψηλή συγκέντρωση σημείου γύρω από αυτήν την περιοχή.
Εάν ελέγξετε την πολυμεταβλητή πυκνότητα για INDUS και NOX, μπορείτε να δείτε τη θετική συσχέτιση και τις δύο συστάδες. Όταν το μερίδιο της βιομηχανίας είναι πάνω από 18, η συγκέντρωση των οξειδίων του αζώτου είναι πάνω από 0.6.
Μπορείτε να σκεφτείτε να προσθέσετε μια αλληλεπίδραση μεταξύ INDUS και NOX στη γραμμική σχέση.
Τέλος, μπορείτε να χρησιμοποιήσετε το δεύτερο εργαλείο που δημιουργήθηκε από Google, Βαθιά Κατάδυση στις Όψεις. Η διεπαφή χωρίζεται σε τέσσερα κύρια τμήματα. Η κεντρική περιοχή στο κέντρο είναι μια μεγεθυμένη απεικόνιση των δεδομένων. Στο επάνω μέρος του πίνακα, υπάρχει το αναπτυσσόμενο μενού όπου μπορείτε να αλλάξετε τη διάταξη των δεδομένων για να ελέγξετε την όψειωση, την τοποθέτηση και το χρώμα. Στα δεξιά, υπάρχει μια λεπτομερής προβολή μιας συγκεκριμένης γραμμής δεδομένων. Αυτό σημαίνει ότι μπορείτε να κάνετε κλικ σε οποιαδήποτε κουκκίδα δεδομένων στην κεντρική απεικόνιση για να δείτε τις λεπτομέρειες σχετικά με αυτό το συγκεκριμένο σημείο δεδομένων.
Κατά το βήμα της οπτικοποίησης δεδομένων, σας ενδιαφέρει να αναζητήσετε τη συσχέτιση ανά ζεύγη μεταξύ της ανεξάρτητης μεταβλητής στην τιμή του σπιτιού. Ωστόσο, περιλαμβάνει τουλάχιστον τρεις μεταβλητές και η εργασία με τα τρισδιάστατα σχέδια είναι πολύπλοκη.
Ένας τρόπος για να αντιμετωπίσουμε αυτό το πρόβλημα είναι να δημιουργήσουμε μια κατηγορική μεταβλητή. Δηλαδή, μπορούμε να δημιουργήσουμε ένα δισδιάστατο διάγραμμα και να χρωματίσουμε τις τελείες. Μπορείτε να χωρίσετε τη μεταβλητή PRICE σε τέσσερις κατηγορίες, με κάθε κατηγορία να είναι ένα τεταρτημόριο (δηλαδή, 0.25, 0.5, 0.75). Ονομάζετε αυτήν τη νέα μεταβλητή Q_PRICE.
## Check non linearity with important features df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"]) ## Show non linearity between RM and LSTAT ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")
Χρησιμοποιώντας την ανάλυση Facets Deep Dive
Για να ανοίξετε το Deep Dive, πρέπει να μετατρέψετε τα δεδομένα σε μορφή json. Το Pandas έχει μια μέθοδο για αυτό: την κλήση της συνάρτησης to_json στο DataFrame.
Η πρώτη γραμμή κώδικα ορίζει το μέγεθος του sprite ανάλογα με τον αριθμό των γραμμών που περιέχει το σύνολο δεδομένων.
df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"]) sprite_size = 32 if len(df.index)>50000 else 64 jsonstr = df.to_json(orient='records')
Ο παρακάτω κώδικας προέρχεται από Google GitHub. Αφού εκτελέσετε τον κώδικα, θα πρέπει να μπορείτε να δείτε τα εξής:
# Display thde Dive visualization for this data from IPython.core.display import display, HTML # Create Facets template HTML_TEMPLATE = """<link rel="import" href="/nbextensions/facets-dist/facets-jupyter.html"> <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive> <script> document.querySelector("#elem").data = {jsonstr}; </script>""" # Load the json dataset and the sprite_size into the template html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size) # Display the template display(HTML(html))
Σας ενδιαφέρει να δείτε αν υπάρχει σχέση μεταξύ του ποσοστού βιομηχανίας, της συγκέντρωσης οξειδίων, της απόστασης από το κέντρο εργασίας και της τιμής του σπιτιού.
Για αυτό, πρώτα διαχωρίζετε τα δεδομένα ανά εύρος κλάδου και χρώματος με το τεταρτημόριο τιμής:
- Επιλέξτε την πρόσοψη X και επιλέξτε INDUS.
- Επιλέξτε Εμφάνιση και επιλέξτε DIS. Θα χρωματίσει τις τελείες με το τεταρτημόριο της τιμής του σπιτιού
Εδώ, τα πιο σκούρα χρώματα σημαίνουν ότι η απόσταση από το πρώτο κέντρο εργασίας είναι μεγαλύτερη.
Μέχρι στιγμής, δείχνει ξανά αυτό που γνωρίζετε, χαμηλότερο ποσοστό βιομηχανίας, υψηλότερη τιμή. Τώρα μπορείτε να δείτε την ανάλυση ανά INDUX, κατά NOX.
Επιλέξτε την πρόσοψη Y και επιλέξτε NOX.
Τώρα μπορείτε να δείτε το σπίτι μακριά από το πρώτο κέντρο εργασίας να έχει το χαμηλότερο μερίδιο βιομηχανίας και επομένως τη χαμηλότερη συγκέντρωση οξειδίου. Εάν επιλέξετε να εμφανίσετε τον τύπο με Q_PRICE και να κάνετε ζουμ στην κάτω αριστερή γωνία, μπορείτε να δείτε τι είδους τιμή είναι.
Έχετε μια άλλη υπόδειξη ότι η αλληλεπίδραση μεταξύ IND, NOX και DIS μπορεί να είναι καλοί υποψήφιοι για τη βελτίωση του μοντέλου.
Η εξερεύνηση έχει οδηγήσει σε δύο υποψήφιες αλληλεπιδράσεις, επομένως το επόμενο βήμα είναι να τις δοκιμάσουμε σε ένα πραγματικό μοντέλο.
Γραμμική παλινδρόμηση με TensorFlow
Σε αυτήν την ενότητα, θα εκτιμήσετε το γραμμικό μοντέλο παλινδρόμησης με το TensorFlow API Εκτιμητή. Θα προχωρήσετε ως εξής:
- Προετοιμάστε τα δεδομένα
- Υπολογίστε ένα μοντέλο αναφοράς: Καμία αλληλεπίδραση
- Υπολογίστε ένα μοντέλο με αλληλεπίδραση
Σημείωση έκδοσης: ο tf-estimator Το πακέτο κυκλοφόρησε την τελική του έκδοση με το TensorFlow 2.15 και απουσιάζει από το TensorFlow 2.16 και μετά, επομένως tf.estimator.LinearRegressor εκτελείται μόνο στο TensorFlow 1.x εκτός εάν το μετεγκαταστήσετε σε ένα γραμμικό μοντέλο Keras.
Να θυμάστε ότι ο στόχος της μηχανικής μάθησης είναι η ελαχιστοποίηση του σφάλματος. Σε αυτήν την περίπτωση, το μοντέλο με το χαμηλότερο μέσο τετραγωνικό σφάλμα θα κερδίσει. Ο εκτιμητής TensorFlow υπολογίζει αυτόματα αυτήν τη μετρική.
Δεδομένα προετοιμασίας
Στις περισσότερες περιπτώσεις, χρειάζεται να μετασχηματίσετε τα δεδομένα σας. Γι' αυτό το Facets Overview είναι συναρπαστικό. Από το συνοπτικό στατιστικό στοιχείο, είδατε ότι υπάρχουν ακραίες τιμές. Αυτές οι τιμές επηρεάζουν τις εκτιμήσεις επειδή δεν μοιάζουν με τον πληθυσμό που αναλύετε. Οι ακραίες τιμές συνήθως επηρεάζουν τα αποτελέσματα. Για παράδειγμα, μια θετική ακραία τιμή τείνει να υπερεκτιμά τον συντελεστή.
Μια καλή λύση για την αντιμετώπιση αυτού του προβλήματος είναι η τυποποίηση της μεταβλητής. Τυποποίηση σημαίνει τυπική απόκλιση ίση με ένα και μέσο όρο μηδέν. Η διαδικασία τυποποίησης περιλαμβάνει δύο βήματα. Πρώτα απ 'όλα, υποδιαιρείται σεtracts είναι η μέση τιμή της μεταβλητής. Δεύτερον, διαιρεί με την τυπική απόκλιση έτσι ώστε η κατανομή να έχει μοναδιαία τυπική απόκλιση.
Η βιβλιοθήκη scikit-μάθετε είναι χρήσιμο για την τυποποίηση μεταβλητών. Μπορείτε να χρησιμοποιήσετε την προεπεξεργασία της ενότητας με την κλίμακα αντικειμένου για αυτόν τον σκοπό.
Μπορείτε να χρησιμοποιήσετε την παρακάτω συνάρτηση για να κλιμακώσετε ένα σύνολο δεδομένων. Σημειώστε ότι δεν κλιμακώνετε τη στήλη της ετικέτας και τις κατηγορίες μεταβλητών.
from sklearn import preprocessing def standardize_data(df): X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']]) X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']) df_scale = pd.concat([X_scaled_df, df['CHAS'], df['PRICE']],axis=1, join='inner') return df_scale
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση για να δημιουργήσετε το σετ κλιμακωτών αμαξοστοιχιών/δοκιμών.
df_train_scale = standardize_data(df_train) df_test_scale = standardize_data(df_test)
Βασική παλινδρόμηση: Σημείο αναφοράς
Πρώτα απ 'όλα, εκπαιδεύετε και δοκιμάζετε ένα μοντέλο χωρίς αλληλεπίδραση. Ο σκοπός είναι να δούμε τη μέτρηση απόδοσης του μοντέλου.
Ο τρόπος εκπαίδευσης του μοντέλου είναι ακριβώς όπως στο tutorial στο API υψηλού επιπέδου. Θα χρησιμοποιήσετε τον εκτιμητή TensorFlow LinearRegressor.
Ως υπενθύμιση, πρέπει να επιλέξετε:
- τα χαρακτηριστικά που πρέπει να βάλετε στο μοντέλο
- μετατρέψει τα χαρακτηριστικά
- κατασκευάστε τον γραμμικό παλινδρομητή
- κατασκευάστε τη συνάρτηση input_fn
- εκπαιδεύστε το μοντέλο
- δοκιμάστε το μοντέλο
Χρησιμοποιείτε όλες τις μεταβλητές στο σύνολο δεδομένων για να εκπαιδεύσετε το μοντέλο. Συνολικά, υπάρχουν δώδεκα συνεχείς μεταβλητές και μία κατηγορική μεταβλητή.
## Add features to the bucket: ### Define continuous list CONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'] CATE_FEATURES = ['CHAS']
Μετατρέπετε τα χαρακτηριστικά σε αριθμητική στήλη ή στήλη κατηγοριών
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES] #categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000) categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]
Δημιουργείτε το μοντέλο με το linearRegressor. Αποθηκεύετε το μοντέλο στον φάκελο train_Boston
model = tf.estimator.LinearRegressor(
model_dir="train_Boston",
feature_columns=categorical_features + continuous_features)
Παραγωγή
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_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 0x1a19e76ac8>, '_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}
Κάθε στήλη στο τρένο ή στα δεδομένα δοκιμής μετατρέπεται σε Tensor με τη συνάρτηση get_input_fn
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS'] LABEL= 'PRICE' 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)
Υπολογίζετε το μοντέλο στα δεδομένα του τρένου.
model.train(input_fn=get_input_fn(df_train_scale,
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_Boston/model.ckpt. INFO:tensorflow:loss = 56417.703, step = 1 INFO:tensorflow:global_step/sec: 144.457 INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec) INFO:tensorflow:global_step/sec: 258.392 INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec) INFO:tensorflow:global_step/sec: 227.998 INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec) INFO:tensorflow:global_step/sec: 210.739 INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec) INFO:tensorflow:global_step/sec: 234.237 INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec) INFO:tensorflow:global_step/sec: 238.1 INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec) INFO:tensorflow:global_step/sec: 237.934 INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec) INFO:tensorflow:global_step/sec: 220.687 INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec) INFO:tensorflow:global_step/sec: 232.702 INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec) INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt. INFO:tensorflow:Loss for final step: 23228.568. <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>
Επιτέλους, υπολογίζετε τις επιδόσεις του μοντέλου στο δοκιμαστικό σετ
model.evaluate(input_fn=get_input_fn(df_test_scale,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43 INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785 {'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}
Η απώλεια του μοντέλου είναι 1650.9785. Αυτή είναι η μέτρηση που πρέπει να νικήσετε στην επόμενη ενότητα
Βελτιώστε το μοντέλο: Όρος αλληλεπίδρασης
Κατά τη διάρκεια του πρώτου μέρους του σεμιναρίου, είδατε μια ενδιαφέρουσα σχέση μεταξύ των μεταβλητών. Οι διαφορετικές τεχνικές οπτικοποίησης αποκάλυψαν ότι οι μεταβλητές INDUS και NOX συνδέονται μεταξύ τους και μεγεθύνουν την επίδραση ο ένας του άλλου στην τιμή. Η αλληλεπίδραση μεταξύ INDUS και NOX όχι μόνο επηρεάζει την τιμή, αλλά και αυτή η επίδραση είναι ισχυρότερη όταν αλληλεπιδρά με το DIS.
Είναι καιρός να γενικεύσουμε αυτήν την ιδέα και να δούμε αν μπορούμε να βελτιώσουμε την πρόβλεψη του μοντέλου.
Πρέπει να προσθέσετε δύο νέες στήλες σε κάθε σύνολο δεδομένων: train και test. Για αυτό, δημιουργείτε μία συνάρτηση για να υπολογίσετε τον όρο αλληλεπίδρασης και μια άλλη για να υπολογίσετε τον όρο τριπλής αλληλεπίδρασης. Κάθε συνάρτηση παράγει μία μόνο στήλη. Αφού δημιουργηθούν οι νέες μεταβλητές, μπορείτε να τις συνενώσετε στο σύνολο δεδομένων εκπαίδευσης και στο σύνολο δεδομένων δοκιμής.
Πρώτα απ 'όλα, πρέπει να δημιουργήσετε μια νέα μεταβλητή για την αλληλεπίδραση μεταξύ INDUS και NOX.
Η παρακάτω συνάρτηση επιστρέφει δύο πλαίσια δεδομένων, εκπαίδευση και δοκιμή, με την αλληλεπίδραση μεταξύ var_1 και var_2, στην περίπτωσή σας INDUS και NOX.
def interaction_term(var_1, var_2, name): t_train = df_train_scale[var_1]*df_train_scale[var_2] train = t_train.rename(name) t_test = df_test_scale[var_1]*df_test_scale[var_2] test = t_test.rename(name) return train, test
Αποθηκεύετε τις δύο νέες στήλες
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS') interation_ind_ns_train.shape (325,)
Δεύτερον, δημιουργείτε μια δεύτερη συνάρτηση για να υπολογίσετε τον όρο της τριπλής αλληλεπίδρασης.
def triple_interaction_term(var_1, var_2,var_3, name): t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3] train = t_train.rename(name) t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3] test = t_test.rename(name) return train, test interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')
Τώρα που έχετε όλες τις απαραίτητες στήλες, μπορείτε να τις προσθέσετε στο σύνολο δεδομένων εκπαίδευσης και δοκιμής. Ονομάζετε αυτά τα δύο νέα πλαίσια δεδομένων:
- df_train_new
- df_test_new
df_train_new = pd.concat([df_train_scale,
interation_ind_ns_train,
interation_ind_ns_dis_train],
axis=1, join='inner')
df_test_new = pd.concat([df_test_scale,
interation_ind_ns_test,
interation_ind_ns_dis_test],
axis=1, join='inner')
df_train_new.head(5)
Παραγωγή
Αυτό είναι όλο: μπορείτε να εκτιμήσετε το νέο μοντέλο με τους όρους αλληλεπίδρασης και να δείτε πώς είναι η μέτρηση απόδοσης.
CONTI_FEATURES_NEW = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'INDUS_NOS', 'INDUS_NOS_DIS'] ### Define categorical list continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW] model = tf.estimator.LinearRegressor( model_dir="train_Boston_1", feature_columns= categorical_features + continuous_features_new)
Παραγωγή
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_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 0x1a1a5d5860>, '_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}
Code
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS'] LABEL= 'PRICE' 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)
model.train(input_fn=get_input_fn(df_train_new,
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_Boston_1/model.ckpt. INFO:tensorflow:loss = 56417.703, step = 1 INFO:tensorflow:global_step/sec: 124.844 INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec) INFO:tensorflow:global_step/sec: 182.704 INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec) INFO:tensorflow:global_step/sec: 208.189 INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec) INFO:tensorflow:global_step/sec: 213.855 INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec) INFO:tensorflow:global_step/sec: 209.758 INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec) INFO:tensorflow:global_step/sec: 196.618 INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec) INFO:tensorflow:global_step/sec: 196.472 INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec) INFO:tensorflow:global_step/sec: 172.82 INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec) INFO:tensorflow:global_step/sec: 168.916 INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec) INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt. INFO:tensorflow:Loss for final step: 19598.387. <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
model.evaluate(input_fn=get_input_fn(df_test_new,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)
Παραγωγή
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14 INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863 {'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}
Η νέα απώλεια είναι 1515.9863. Απλά προσθέτοντας δύο νέες μεταβλητές, μπορέσατε να μειώσετε την απώλεια. Σημαίνει ότι μπορείτε να κάνετε καλύτερη πρόβλεψη από ό,τι με το μοντέλο αναφοράς.
| Μοντέλο | Χαρακτηριστικό | Κατάλογος μοντέλου | μέση_απώλεια | off |
|---|---|---|---|---|
| αναφοράς | 12 τυποποιημένες συνεχείς στήλες συν CHAS | τρένο_Βοστώνη | 86.89361 | 1650.9785 |
| Με αλληλεπίδραση | Συγκριτική αξιολόγηση συν INDUS_NOS και INDUS_NOS_DIS | τρένο_Βοστώνη_1 | 79.78876 | 1515.9863 |
Και τα δύο στοιχεία προέρχονται από το ίδιο τεστ 101 γραμμών, επομένως η μείωση περίπου 8% στη μέση απώλεια αποδίδεται μόνο στις δύο στήλες αλληλεπίδρασης.











