Γραμμική παλινδρόμηση TensorFlow με Όρος Όψης & Αλληλεπίδρασης

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

Αυτό το σεμινάριο χωρίζεται σε δύο μέρη:

  • Ψάξτε για αλληλεπίδραση
  • Δοκιμάστε το μοντέλο

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

Το σύνολο δεδομένων αποτελείται από:

Μεταβλητός Descriptιόν
zn Το ποσοστό της οικιστικής γης που χωροθετείται για οικόπεδα άνω των 25,000 τ.μ.
Ινδός Το ποσοστό των μη λιανικών επιχειρηματικών στρεμμάτων ανά πόλη.
nox συγκέντρωση νιτρικών οξειδίων
rm μέσος αριθμός δωματίων ανά κατοικία
την ηλικία του το ποσοστό των ιδιοκατοικούμενων μονάδων που κατασκευάστηκαν πριν από το 1940
dis σταθμισμένες αποστάσεις σε πέντε κέντρα απασχόλησης της Βοστώνης
φόρος συντελεστής φόρου ακινήτων πλήρους αξίας ανά 10,000 δολάρια
ptratio η αναλογία μαθητών-δασκάλων ανά πόλη
medv Η διάμεση αξία των κατοικιών σε χιλιάδες δολάρια
εγκληματικότητα κατά κεφαλήν ποσοστό εγκληματικότητας ανά πόλη
chas εικονική μεταβλητή Charles River (1 εάν οριοθετείται το ποτάμι, 0 διαφορετικά)
B το ποσοστό των μαύρων στην πόλη

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

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

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

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

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

Όρος αλληλεπίδρασης

Αν κοιτάξετε την εξίσωση του μισθού, γίνεται:

Όρος αλληλεπίδρασης

If Όρος αλληλεπίδρασης είναι θετικό, τότε σημαίνει ότι ένα πρόσθετο επίπεδο εκπαίδευσης αποφέρει υψηλότερη αύξηση στη διάμεση αξία ενός σπιτιού για υψηλό επίπεδο απασχόλησης. Με άλλα λόγια, υπάρχει μια επίδραση αλληλεπίδρασης μεταξύ εκπαίδευσης και επαγγέλματος.

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

Συνοπτικά στατιστικά στοιχεία

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

Ως πρώτο βήμα, φορτώστε τα δεδομένα ως πλαίσιο δεδομένων pandas και δημιουργήστε ένα σετ εκπαίδευσης και σετ δοκιμών.

Συμβουλές: Για αυτό το σεμινάριο, πρέπει να έχετε εγκαταστήσει το matplotlit και το 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. Παρέχει ελκυστικά και όμορφα οικόπεδα.

Ο παρακάτω κώδικας εισάγει τις απαραίτητες βιβλιοθήκες.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as np

Το sklearn της βιβλιοθήκης περιλαμβάνει το σύνολο δεδομένων της Βοστώνης. Μπορείτε να καλέσετε το API του για να εισαγάγετε τα δεδομένα.

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

Τα δεδομένα είναι ακατάστατα. Είναι συχνά μη ισορροπημένο και πασπαλισμένο με ακραίες τιμές που απορρίπτουν την κατάρτιση ανάλυσης και μηχανικής μάθησης.

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

Η ομάδα Έρευνας της Google έχει αναπτύξει ένα εργαλείο για αυτήν την εργασία που ονομάζεται Όψεις που βοηθούν στην οπτικοποίηση των δεδομένων και στην κοπή τους με κάθε είδους τρόπους. Αυτό είναι ένα καλό σημείο εκκίνησης για να κατανοήσετε πώς είναι διαρρυθμισμένο το σύνολο δεδομένων.

Οι όψεις σάς επιτρέπουν να βρείτε πού τα δεδομένα δεν φαίνονται ακριβώς όπως σκέφτεστε.

Εκτός από την εφαρμογή Ιστού της, η Google διευκολύνει την ενσωμάτωση της εργαλειοθήκης σε ένα Jupyter σημειωματάριο.

Υπάρχουν δύο μέρη στις όψεις:

  • Επισκόπηση όψεων
  • Facets Deep Dive

Επισκόπηση όψεων

Η Επισκόπηση όψεων παρέχει μια επισκόπηση του συνόλου δεδομένων. Η Επισκόπηση όψεων χωρίζει τις στήλες των δεδομένων σε σειρές με εμφανείς πληροφορίες

  1. το ποσοστό της παρατήρησης που λείπει
  2. ελάχιστες και μέγιστες τιμές
  3. στατιστικά όπως ο μέσος όρος, η διάμεσος και η τυπική απόκλιση.
  4. Προσθέτει επίσης μια στήλη που δείχνει το ποσοστό των τιμών που είναι μηδενικά, κάτι που είναι χρήσιμο όταν οι περισσότερες από τις τιμές είναι μηδενικές.
  5. Είναι δυνατό να δείτε αυτές τις κατανομές στο σύνολο δεδομένων δοκιμής καθώς και στο σετ εκπαίδευσης για κάθε χαρακτηριστικό. Σημαίνει ότι μπορείτε να ελέγξετε ξανά ότι το τεστ έχει παρόμοια κατανομή με τα δεδομένα εκπαίδευσης.

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

Facets Deep Dive

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

Θα χρησιμοποιήσουμε αυτά τα δύο εργαλεία με το σύνολο δεδομένων της Βοστώνης.

Σημείωση: Δεν μπορείτε να χρησιμοποιήσετε το Facets Overview και το Facets Deep Dive ταυτόχρονα. Πρέπει πρώτα να καθαρίσετε το σημειωματάριο για να αλλάξετε το εργαλείο.

Εγκαταστήστε το Facet

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

Πρώτα απ 'όλα, πρέπει να εγκαταστήσετε nbextensions. Γίνεται με αυτόν τον κωδικό. Αντιγράφετε και επικολλάτε τον παρακάτω κωδικό στο τερματικό του μηχανήματος σας.

pip install jupyter_contrib_nbextensions

Αμέσως μετά, πρέπει να κλωνοποιήσετε τα αποθετήρια στον υπολογιστή σας. Έχετε δύο επιλογές:

Επιλογή 1) Αντιγράψτε και επικολλήστε αυτόν τον κωδικό στο τερματικό (Συνιστάται)

Εάν δεν έχετε εγκαταστήσει το Git στον υπολογιστή σας, μεταβείτε σε αυτήν τη διεύθυνση URL https://git-scm.com/download/win και ακολουθήστε τις οδηγίες. Μόλις τελειώσετε, μπορείτε να χρησιμοποιήσετε την εντολή git στο τερματικό για Mac User ή Anaconda Windows χρήστη

git clone https://github.com/PAIR-code/facets

Επιλογή 2) Πηγαίνετε στο https://github.com/PAIR-code/facets και κατεβάστε τα αποθετήρια.

Εγκαταστήστε το Facet

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

Μπορείτε να ελέγξετε πού είναι αποθηκευμένα τα Facets με αυτήν τη γραμμή εντολών:

echo `pwd`/`ls facets`

Τώρα που εντοπίσατε το Facets, πρέπει να το εγκαταστήσετε Jupyter Σημειωματάριο. Πρέπει να ορίσετε τον κατάλογο εργασίας στη διαδρομή όπου βρίσκονται οι πτυχές.

Ο τρέχων κατάλογος εργασίας και η τοποθεσία του zip Facets θα πρέπει να είναι ίδια.

Εγκαταστήστε το Facet

Πρέπει να κατευθύνετε τον κατάλογο εργασίας στο Facet:

cd facets

Για να εγκαταστήσετε το Facets Jupyter, έχετε δύο επιλογές. Εάν έχετε εγκαταστήσει Jupyter με το Conda για όλους τους χρήστες, αντιγράψτε αυτόν τον κωδικό:

μπορεί να χρησιμοποιήσει το jupyter nbextension install facets-dist/

jupyter nbextension install facets-dist/

Διαφορετικά, χρησιμοποιήστε:

jupyter nbextension install facets-dist/ --user

Εντάξει, είστε έτοιμοι. Ας ανοίξουμε το Facet Overview.

Επισκόπηση

Επισκόπηση χρήσεις α 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="/el/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, με θετική τιμή υποδηλώνει θετική συσχέτιση και αρνητική τιμή αρνητική συσχέτιση.

Σας ενδιαφέρει να δείτε ποιες μεταβλητές μπορούν να είναι καλοί υποψήφιοι για όρους αλληλεπίδρασης.

## 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>

png

Γράφημα όψεων

Από τη μήτρα, μπορείτε να δείτε:

  • LSTAT
  • RM

Συσχετίζονται ισχυρά με την PRICE. Ένα άλλο συναρπαστικό χαρακτηριστικό είναι η ισχυρή θετική συσχέτιση μεταξύ NOX και INDUS, που σημαίνει ότι αυτές οι δύο μεταβλητές κινούνται προς την ίδια κατεύθυνση. Άλλωστε υπάρχουν και συσχετίσεις με την ΤΙΜΗ. Το DIS συσχετίζεται επίσης σε μεγάλο βαθμό με το IND και το NOX.

Έχετε κάποια πρώτη υπόδειξη ότι το IND και το 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, το Facets Deep Dive. Η διεπαφή χωρίζεται σε τέσσερις κύριες ενότητες. Η κεντρική περιοχή στο κέντρο είναι μια απεικόνιση των δεδομένων με δυνατότητα μεγέθυνσης. Στο επάνω μέρος του πίνακα, υπάρχει το αναπτυσσόμενο μενού όπου μπορείτε να αλλάξετε τη διάταξη των δεδομένων σε χειριστήρια πρόσοψης, τοποθέτησης και χρώματος. Στα δεξιά, υπάρχει μια λεπτομερής προβολή μιας συγκεκριμένης σειράς δεδομένων. Σημαίνει ότι μπορείτε να κάνετε κλικ σε οποιαδήποτε κουκκίδα δεδομένων στην κεντρική οπτικοποίηση για να δείτε τις λεπτομέρειες σχετικά με το συγκεκριμένο σημείο δεδομένων.

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

Ένας τρόπος αντιμετώπισης αυτού του προβλήματος είναι να δημιουργήσετε μια κατηγορική μεταβλητή. Δηλαδή, μπορούμε να δημιουργήσουμε μια γραφική παράσταση 2D με χρώμα την κουκκίδα. Μπορείτε να χωρίσετε τη μεταβλητή 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. Πάντα ως αντικείμενο για αυτό. Μπορείτε να χρησιμοποιήσετε το to_json μετά το σύνολο δεδομένων Pandas.

Η πρώτη γραμμή κώδικα χειρίζεται το μέγεθος του συνόλου δεδομένων.

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. Αφού εκτελέσετε τον κώδικα, θα πρέπει να μπορείτε να δείτε αυτό:

Facets Deep Dive

# Display thde Dive visualization for this data
from IPython.core.display import display, HTML

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/el/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

Σε αυτήν την ενότητα, θα εκτιμήσετε τον γραμμικό ταξινομητή με το API εκτιμητών TensorFlow. Θα προχωρήσετε ως εξής:

  • Προετοιμάστε τα δεδομένα
  • Υπολογίστε ένα μοντέλο αναφοράς: Καμία αλληλεπίδραση
  • Υπολογίστε ένα μοντέλο με αλληλεπίδραση

Θυμηθείτε, ο στόχος της μηχανικής μάθησης είναι η ελαχιστοποίηση του σφάλματος. Σε αυτήν την περίπτωση, το μοντέλο με το χαμηλότερο μέσο τετράγωνο σφάλμα θα κερδίσει. Ο εκτιμητής TensorFlow υπολογίζει αυτόματα αυτήν τη μέτρηση.

Δεδομένα προετοιμασίας

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

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

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

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

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}

Κάθε στήλη στο τρένο ή τα δεδομένα δοκιμής μετατρέπεται σε τανυστή με τη συνάρτηση 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. Αυτή είναι η μέτρηση που πρέπει να νικήσετε στην επόμενη ενότητα

Βελτιώστε το μοντέλο: Όρος αλληλεπίδρασης

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

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

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

Πρώτα απ 'όλα, πρέπει να δημιουργήσετε μια νέα μεταβλητή για την αλληλεπίδραση μεταξύ 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}

ΚΩΔΙΚΟΣ

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. Απλά προσθέτοντας δύο νέες μεταβλητές, μπορέσατε να μειώσετε την απώλεια. Σημαίνει ότι μπορείτε να κάνετε καλύτερη πρόβλεψη από ό,τι με το μοντέλο αναφοράς.