Σε αυτό το σεμινάριο, θα μάθετε πώς να ελέγχετε τα δεδομένα και να τα προετοιμάζετε για να δημιουργήσετε μια απλή εργασία γραμμικής παλινδρόμησης.
Αυτό το σεμινάριο χωρίζεται σε δύο μέρη:
- Ψάξτε για αλληλεπίδραση
- Δοκιμάστε το μοντέλο
Στο προηγούμενο σεμινάριο, χρησιμοποιήσατε το σύνολο δεδομένων της Βοστώνης για να εκτιμήσετε τη μέση τιμή ενός σπιτιού. Το σύνολο δεδομένων της Βοστώνης έχει μικρό μέγεθος, με μόνο 506 παρατηρήσεις. Αυτό το σύνολο δεδομένων θεωρείται ως σημείο αναφοράς για τη δοκιμή νέων αλγορίθμων γραμμικής παλινδρόμησης.
Το σύνολο δεδομένων αποτελείται από:
Μεταβλητός | Περιγραφή |
zn | Το ποσοστό των κατοικημένων γαιών που έχουν χωριστεί για παρτίδες άνω των 25.000 τ.μ. |
Ινδός | Το ποσοστό των μη λιανικών στρεμμάτων επιχειρήσεων ανά πόλη. |
Νοξ | συγκέντρωση οξειδίων του αζώτου |
rm | μέσος αριθμός δωματίων ανά κατοικία |
ηλικία | το ποσοστό των ιδιοκατοικημένων μονάδων που κατασκευάστηκαν πριν από το 1940 |
δισ | σταθμισμένες αποστάσεις σε πέντε κέντρα απασχόλησης της Βοστώνης |
φόρος | πλήρης τιμή φόρου ιδιοκτησίας-φόρου ανά 10.000 δολάρια |
ptratio | η αναλογία μαθητή-δασκάλου ανά πόλη |
μέσο | Η μέση αξία των κατοικημένων σπιτιών σε χιλιάδες δολάρια |
βρώμικο | κατά κεφαλήν ποσοστό εγκληματικότητας ανά πόλη |
chas | Μεταβλητή ανδρεικέλου Charles River (1 αν συνορεύει με ποταμό, 0 διαφορετικά) |
σι | το ποσοστό των μαύρων από την πόλη |
Σε αυτό το σεμινάριο, θα εκτιμήσουμε τη μέση τιμή χρησιμοποιώντας έναν γραμμικό παλινδρόμηση, αλλά η εστίαση είναι σε μια συγκεκριμένη διαδικασία της μηχανικής μάθησης: "προετοιμασία δεδομένων".
Ένα μοντέλο γενικεύει το μοτίβο στα δεδομένα. Για να καταγράψετε ένα τέτοιο μοτίβο, πρέπει να το βρείτε πρώτα. Μια καλή πρακτική είναι η εκτέλεση ανάλυσης δεδομένων πριν από την εκτέλεση οποιουδήποτε αλγορίθμου μηχανικής μάθησης.
Η επιλογή των σωστών χαρακτηριστικών κάνει όλη τη διαφορά στην επιτυχία του μοντέλου σας. Φανταστείτε ότι προσπαθείτε να εκτιμήσετε τον μισθό ενός λαού, εάν δεν συμπεριλάβετε το φύλο ως συνδιακύμανση, καταλήγετε με μια κακή εκτίμηση.
Ένας άλλος τρόπος βελτίωσης του μοντέλου είναι να εξετάσουμε τη συσχέτιση μεταξύ της ανεξάρτητης μεταβλητής. Πίσω στο παράδειγμα, μπορείτε να σκεφτείτε την εκπαίδευση ως εξαιρετικό υποψήφιο για να προβλέψετε τον μισθό αλλά και το επάγγελμα. Είναι δίκαιο να πούμε ότι το επάγγελμα εξαρτάται από το επίπεδο εκπαίδευσης, δηλαδή η τριτοβάθμια εκπαίδευση οδηγεί συχνά σε καλύτερη απασχόληση. Εάν γενικεύσουμε αυτήν την ιδέα, μπορούμε να πούμε ότι η συσχέτιση μεταξύ της εξαρτημένης μεταβλητής και μιας επεξηγηματικής μεταβλητής μπορεί να μεγεθυνθεί από μια ακόμη επεξηγηματική μεταβλητή.
Για να κατανοήσουμε την περιορισμένη επίδραση της εκπαίδευσης στο επάγγελμα, μπορούμε να χρησιμοποιήσουμε έναν όρο αλληλεπίδρασης.
Αν κοιτάξετε την εξίσωση των μισθών, γίνεται:
Εάν είναι θετικό, συνεπάγεται ότι ένα πρόσθετο επίπεδο εκπαίδευσης αποφέρει υψηλότερη αύξηση στη μέση αξία ενός σπιτιού για υψηλό επίπεδο απασχόλησης. Με άλλα λόγια, υπάρχει μια επίδραση αλληλεπίδρασης μεταξύ εκπαίδευσης και επαγγέλματος.
Σε αυτό το σεμινάριο, θα προσπαθήσουμε να δούμε ποιες μεταβλητές μπορούν να είναι καλοί υποψήφιοι για όρους αλληλεπίδρασης. Θα ελέγξουμε εάν η προσθήκη αυτού του είδους πληροφοριών οδηγεί σε καλύτερη πρόβλεψη τιμών.
Σε αυτό το σεμινάριο, θα μάθετε
- Περίληψη στατιστικών
- Επισκόπηση Facets
- Facets Deep Dive
- Εγκατάσταση Facet
- ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ
- Γραφική παράσταση
- Facets Deep Dive
- TensorFlow
- Δεδομένα προετοιμασίας
- Βασική παλινδρόμηση: Συγκριτική αξιολόγηση
- Βελτιώστε το μοντέλο: Όρος αλληλεπίδρασης
Περίληψη στατιστικών
Υπάρχουν μερικά βήματα που μπορείτε να ακολουθήσετε προτού προχωρήσετε στο μοντέλο. Όπως αναφέρθηκε προηγουμένως, το μοντέλο είναι μια γενίκευση των δεδομένων. Η βέλτιστη πρακτική είναι να κατανοήσετε τα δεδομένα και να κάνετε μια πρόβλεψη. Εάν δεν γνωρίζετε τα δεδομένα σας, έχετε ελάχιστες πιθανότητες να βελτιώσετε το μοντέλο σας.
Ως πρώτο βήμα, φορτώστε τα δεδομένα ως πλαίσιο δεδομένων pandas και δημιουργήστε ένα εκπαιδευτικό σετ και ένα σύνολο δοκιμών.
Συμβουλές: Για αυτό το σεμινάριο, πρέπει να έχετε εγκαταστήσει το matplotlit και το θαλασσοπόρο στην 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 pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport 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='Μπορείτε να μετονομάσετε τις στήλες.
df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)Μπορείτε να μετατρέψετε τη μεταβλητή CHAS ως μεταβλητή συμβολοσειράς και να την επισημάνετε με ναι εάν CHAS = 1 και όχι εάν CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})df['CHAS'].head(5)0 no1 no2 no3 no4 noName: CHAS, dtype: objectΜε τα pandas, είναι εύκολο να διαχωρίσετε το σύνολο δεδομένων. Διαχωρίζετε τυχαία το σύνολο δεδομένων με 80% σύνολο προπόνησης και 20% σύνολο δοκιμών. Οι Pandas έχουν μια ενσωματωμένη συνάρτηση κόστους για να διαιρέσουν ένα δείγμα πλαισίου δεδομένων.
Η πρώτη παράμετρος frac είναι μια τιμή από 0 έως 1. Μπορείτε να την ορίσετε σε 0,8 για να επιλέξετε τυχαία το 80 τοις εκατό του πλαισίου δεδομένων.
Το Random_state επιτρέπει την επιστροφή του ίδιου πλαισίου δεδομένων για όλους.
### Create train/test setdf_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)Παραγωγή
ΕΓΚΛΗΜΑ ΖΝ ΙΝΔΟΣ CHAS ΝΟΧ RM ΗΛΙΚΙΑ ΔΙΣ RAD ΦΟΡΟΣ ΠΤΡΑΤΙΟ σι 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 έχει αναπτύξει ένα εργαλείο για αυτήν την εργασία που ονομάζεται Facets που βοηθά στην οπτικοποίηση των δεδομένων και την τεμαχισμό τους με κάθε είδους τρόπους. Αυτό είναι ένα καλό σημείο εκκίνησης για να κατανοήσετε πώς σχεδιάζεται το σύνολο δεδομένων.
Οι όψεις σάς επιτρέπουν να βρείτε πού τα δεδομένα δεν φαίνονται ακριβώς όπως σκέφτεστε.
Εκτός από την εφαρμογή ιστού, η Google διευκολύνει την ενσωμάτωση της εργαλειοθήκης σε ένα σημειωματάριο Jupyter.
Υπάρχουν δύο μέρη στο Facets:
- Επισκόπηση Facets
- Facets Deep Dive
Επισκόπηση Facets
Επισκόπηση Facets δίνει μια επισκόπηση του συνόλου δεδομένων. Επισκόπηση Facets χωρίζει τις στήλες των δεδομένων σε σειρές εμφανών πληροφοριών που εμφανίζονται
- το ποσοστό της παρατήρησης που λείπει
- ελάχιστες και μέγιστες τιμές
- στατιστικά στοιχεία όπως η μέση, μέση και τυπική απόκλιση.
- Προσθέτει επίσης μια στήλη που δείχνει το ποσοστό των τιμών που είναι μηδενικά, η οποία είναι χρήσιμη όταν οι περισσότερες από τις τιμές είναι μηδενικά.
- Είναι δυνατό να δείτε αυτές τις κατανομές στο σύνολο δεδομένων δοκιμής καθώς και το σετ εκπαίδευσης για κάθε δυνατότητα. Αυτό σημαίνει ότι μπορείτε να ελέγξετε ξανά ότι η δοκιμή έχει παρόμοια κατανομή με τα δεδομένα εκπαίδευσης.
Αυτό είναι τουλάχιστον το ελάχιστο που πρέπει να κάνετε πριν από οποιαδήποτε εργασία μηχανικής εκμάθησης. Με αυτό το εργαλείο, δεν χάνετε αυτό το κρίσιμο βήμα και επισημαίνει κάποιες ανωμαλίες.
Facets Deep Dive
Το Facets Deep Dive είναι ένα δροσερό εργαλείο. Σας επιτρέπει να έχετε κάποια σαφήνεια στο σύνολο δεδομένων σας και να κάνετε ζουμ μέχρι να δείτε ένα μεμονωμένο κομμάτι δεδομένων. Αυτό σημαίνει ότι μπορείτε να τοποθετήσετε τα δεδομένα ανά σειρά και στήλη σε οποιαδήποτε από τις δυνατότητες του συνόλου δεδομένων.
Θα χρησιμοποιήσουμε αυτά τα δύο εργαλεία με το σύνολο δεδομένων της Βοστώνης.
Σημείωση : Δεν μπορείτε να χρησιμοποιήσετε την Επισκόπηση Facets και το Facets Deep Dive ταυτόχρονα. Πρέπει να διαγράψετε πρώτα το σημειωματάριο για να αλλάξετε το εργαλείο.
Εγκατάσταση Facet
Μπορείτε να χρησιμοποιήσετε την εφαρμογή Ιστού Facet για το μεγαλύτερο μέρος της ανάλυσης. Σε αυτό το σεμινάριο, θα δείτε πώς να το χρησιμοποιήσετε σε ένα Jupyter Notebook.
Πρώτα απ 'όλα, πρέπει να εγκαταστήσετε nbextensions. Γίνεται με αυτόν τον κωδικό. Αντιγράφετε και επικολλάτε τον ακόλουθο κωδικό στο τερματικό του μηχανήματός σας.
pip install jupyter_contrib_nbextensionsΑμέσως μετά, πρέπει να κλωνοποιήσετε τα αποθετήρια στον υπολογιστή σας. Έχετε δύο επιλογές:
Επιλογή 1) Αντιγράψτε και επικολλήστε αυτόν τον κωδικό στο τερματικό (Συνιστάται)
Εάν δεν έχετε εγκαταστήσει το Git στον υπολογιστή σας, μεταβείτε σε αυτήν τη διεύθυνση URL https://git-scm.com/download/win και ακολουθήστε τις οδηγίες. Μόλις τελειώσετε, μπορείτε να χρησιμοποιήσετε την εντολή git στο τερματικό για το Mac User ή το Anaconda prompt για χρήστη των Windows
git clone https://github.com/PAIR-code/facetsΕπιλογή 2) Μεταβείτε στη διεύθυνση https://github.com/PAIR-code/facets και πραγματοποιήστε λήψη των αποθετηρίων.
Εάν ορίσετε την πρώτη επιλογή, το αρχείο καταλήγει στο αρχείο λήψης. Μπορείτε είτε να αφήσετε το αρχείο σε λήψη είτε να το σύρετε σε άλλη διαδρομή.
Μπορείτε να ελέγξετε πού αποθηκεύονται τα Facets με αυτήν τη γραμμή εντολών:
echo `pwd`/`ls facets`Τώρα που έχετε εντοπίσει το Facets, πρέπει να το εγκαταστήσετε στο Jupyter Notebook. Πρέπει να ορίσετε τον κατάλογο εργασίας στη διαδρομή όπου βρίσκονται οι όψεις.
Ο τρέχων κατάλογος εργασίας σας και η θέση του Facets zip πρέπει να είναι ίδιες.
Πρέπει να τοποθετήσετε τον κατάλογο εργασίας στο Facet:
cd facetsΓια να εγκαταστήσετε Facets στο Jupyter, έχετε δύο επιλογές. Εάν εγκαταστήσατε το Jupyter με Conda για όλους τους χρήστες, αντιγράψτε αυτόν τον κωδικό:
μπορεί να χρησιμοποιήσει jupyter nbextension install facets-dist /
jupyter nbextension install facets-dist/Διαφορετικά, χρησιμοποιήστε:
jupyter nbextension install facets-dist/ --userΕντάξει, είστε έτοιμοι. Ας ανοίξουμε την Επισκόπηση Facet.
ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ
Η επισκόπηση χρησιμοποιεί ένα σενάριο Python για τον υπολογισμό των στατιστικών. Πρέπει να εισαγάγετε το σενάριο που ονομάζεται generic_feature_statistics_generator στο Jupyter. Μην ανησυχείτε. το σενάριο βρίσκεται στα αρχεία όψεων.
Πρέπει να εντοπίσετε τη διαδρομή του. Γίνεται εύκολα. Ανοίγετε όψεις, ανοίγετε το αρχείο facets_overview και μετά python. Αντιγράψτε τη διαδρομή
Μετά από αυτό, επιστρέψτε στο Jupyter και γράψτε τον ακόλουθο κωδικό. Αλλάξτε τη διαδρομή '/ Users / Thomas / facets / facets_overview / python' στη διαδρομή σας.
# Add the facets overview python code to the python path# Add timport syssys.path.append('/Users/Thomas/facets/facets_overview/python')Μπορείτε να εισαγάγετε το σενάριο με τον παρακάτω κώδικα.
from generic_feature_statistics_generator importGenericFeatureStatisticsGeneratorΣτα παράθυρα, γίνεται ο ίδιος κωδικός
import syssys.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 overviewimport base64gfsg = 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# Displfrom IPython.core.display import display, HTMLHTML_TEMPLATE = """"""html = HTML_TEMPLATE.format(protostr=protostr)display(HTML(html)) Γραφική παράσταση
Αφού ελέγξετε τα δεδομένα και τη διανομή τους, μπορείτε να σχεδιάσετε μια μήτρα συσχέτισης. Η μήτρα συσχέτισης υπολογίζει τον συντελεστή Pearson. Αυτός ο συντελεστής συνδέεται μεταξύ -1 και 1, με μια θετική τιμή δείχνει θετική συσχέτιση και αρνητική τιμή αρνητική συσχέτιση.
Σας ενδιαφέρει να δείτε ποιες μεταβλητές μπορούν να είναι καλοί υποψήφιοι για όρους αλληλεπίδρασης.
## Choose important feature and further check with Dive%matplotlib inlineimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="ticks")# Compute the correlation matrixcorr = df.corr('pearson')# Generate a mask for the upper trianglemask = np.zeros_like(corr, dtype=np.bool)mask[np.triu_indices_from(mask)] = True# Set up the matplotlib figuref, ax = plt.subplots(figsize=(11, 9))# Generate a custom diverging colormapcmap = sns.diverging_palette(220, 10, as_cmap=True)# Draw the heatmap with the mask and correct aspect ratiosns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,square=True, linewidths=.5, cbar_kws={"shrink": .5})Παραγωγή
png
Από τον πίνακα, μπορείτε να δείτε:
- LSTAT
- RM
Συσχετίζονται έντονα με PRICE. Ένα άλλο συναρπαστικό χαρακτηριστικό είναι η ισχυρή θετική συσχέτιση μεταξύ NOX και INDUS, που σημαίνει ότι αυτές οι δύο μεταβλητές κινούνται προς την ίδια κατεύθυνση. Εκτός αυτού, συσχετίζονται επίσης με την PRICE. Το DIS συσχετίζεται επίσης πολύ με τα IND και NOX.
Έχετε κάποια πρώτη υπόδειξη ότι το IND και το NOX μπορούν να είναι καλοί υποψήφιοι για τον όρο παρακολούθησης και το DIS μπορεί επίσης να είναι ενδιαφέρον να εστιάσετε.
Μπορείτε να πάτε λίγο πιο βαθιά σχεδιάζοντας ένα πλέγμα ζευγών. Θα απεικονίσει λεπτομερέστερα τον χάρτη συσχέτισης που σχεδιάσατε στο παρελθόν.
Το πλέγμα ζεύγους που συνθέτουμε ως εξής:
- Πάνω μέρος: Οικόπεδο διασποράς με προσαρμοσμένη γραμμή
- Διαγώνιο: Οικόπεδο πυκνότητας πυρήνα
- Κάτω μέρος: Οικόπεδο πυκνότητας πολλών μεταβλητών
Επιλέγετε την εστίαση σε τέσσερις ανεξάρτητες μεταβλητές. Η επιλογή αντιστοιχεί στις μεταβλητές με ισχυρή συσχέτιση με PRICE
- ΙΝΔΟΣ
- ΝΟΧ
- 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.
Για να δείτε περισσότερα σχετικά με αυτό, μπορείτε να δείτε το κάτω μέρος. Το Multivariate Kernel Density είναι ενδιαφέρον υπό την έννοια ότι χρωματίζει τα περισσότερα σημεία. Η διαφορά με το διάγραμμα διασποράς αντλεί πυκνότητα πιθανότητας, παρόλο που δεν υπάρχει σημείο στο σύνολο δεδομένων για μια δεδομένη συντεταγμένη. Όταν το χρώμα είναι πιο έντονο, δείχνει υψηλή συγκέντρωση σημείου γύρω από αυτήν την περιοχή.
Εάν ελέγξετε την πολυμεταβλητή πυκνότητα για 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 featuresdf['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])## Show non linearity between RM and LSTATax = 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 64jsonstr = df.to_json(orient='records')Ο παρακάτω κώδικας προέρχεται από το Google GitHub. Αφού εκτελέσετε τον κωδικό, θα πρέπει να μπορείτε να το δείτε:
# Display thde Dive visualization for this datafrom IPython.core.display import display, HTML# Create Facets templateHTML_TEMPLATE = """"""# Load the json dataset and the sprite_size into the templatehtml = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)# Display the templatedisplay(HTML(html)) Ενδιαφέρεστε να δείτε αν υπάρχει σχέση μεταξύ της τιμής του κλάδου, της συγκέντρωσης οξειδίου, της απόστασης από το κέντρο εργασίας και της τιμής του σπιτιού.
Για αυτό, πρώτα διαιρέσατε τα δεδομένα ανά εύρος και χρώμα βιομηχανίας με το τεταρτημόριο τιμών:
- Επιλέξτε την όψη X και επιλέξτε INDUS.
- Επιλέξτε Οθόνη και επιλέξτε DIS. Θα χρωματίσει τις τελείες με το τεταρτημόριο της τιμής κατοικίας
εδώ, πιο σκούρα χρώματα σημαίνει ότι η απόσταση από το πρώτο κέντρο εργασίας είναι πολύ μακριά.
Μέχρι στιγμής, δείχνει πάλι αυτό που γνωρίζετε, χαμηλότερο ποσοστό βιομηχανίας, υψηλότερη τιμή. Τώρα μπορείτε να δείτε την ανάλυση κατά INDUX, κατά NOX.
- Επιλέξτε την όψη Y και επιλέξτε NOX.
Τώρα μπορείτε να δείτε ότι το σπίτι μακριά από το πρώτο κέντρο εργασίας έχει το χαμηλότερο μερίδιο βιομηχανίας και επομένως τη χαμηλότερη συγκέντρωση οξειδίου. Εάν επιλέξετε να εμφανίσετε τον τύπο με Q_PRICE και να κάνετε ζουμ στην κάτω αριστερή γωνία, μπορείτε να δείτε τι είδους τιμή είναι.
Έχετε μια άλλη υπόδειξη ότι η αλληλεπίδραση μεταξύ IND, NOX και DIS μπορεί να είναι καλοί υποψήφιοι για τη βελτίωση του μοντέλου.
TensorFlow
Σε αυτήν την ενότητα, θα εκτιμήσετε τον γραμμικό ταξινομητή με το TensorFlow estimators API. Θα προχωρήσετε ως εξής:
- Προετοιμάστε τα δεδομένα
- Εκτίμηση μοντέλου αναφοράς: Χωρίς αλληλεπίδραση
- Εκτιμήστε ένα μοντέλο με αλληλεπίδραση
Θυμηθείτε, ο στόχος της μηχανικής μάθησης είναι η ελαχιστοποίηση του σφάλματος. Σε αυτήν την περίπτωση, το μοντέλο με το χαμηλότερο μέσο τετράγωνο σφάλμα θα κερδίσει. Ο εκτιμητής TensorFlow υπολογίζει αυτόματα αυτήν τη μέτρηση.
Δεδομένα προετοιμασίας
Στις περισσότερες περιπτώσεις, πρέπει να μετατρέψετε τα δεδομένα σας. Αυτός είναι ο λόγος για τον οποίο η Επισκόπηση Facets είναι συναρπαστική. Από τη συνοπτική στατιστική, είδατε ότι υπάρχουν ακραίες τιμές. Αυτές οι τιμές επηρεάζουν τις εκτιμήσεις επειδή δεν μοιάζουν με τον πληθυσμό που αναλύετε. Τα outliers συνήθως μεροληψούσαν τα αποτελέσματα. Για παράδειγμα, μια θετική έξοδος τείνει να υπερεκτιμά τον συντελεστή.
Μια καλή λύση για την αντιμετώπιση αυτού του προβλήματος είναι η τυποποίηση της μεταβλητής. Τυποποίηση σημαίνει τυπική απόκλιση του ενός και μέσο μηδέν. Η διαδικασία τυποποίησης περιλαμβάνει δύο στάδια. Πρώτα απ 'όλα, αφαιρεί τη μέση τιμή της μεταβλητής. Δεύτερον, διαιρείται με τη διακύμανση έτσι ώστε η κατανομή να έχει διακύμανση μονάδας
Η βιβλιοθήκη sklearn είναι χρήσιμη για την τυποποίηση των μεταβλητών. Μπορείτε να χρησιμοποιήσετε την προεπεξεργασία της μονάδας με την κλίμακα αντικειμένων για το σκοπό αυτό.
Μπορείτε να χρησιμοποιήσετε τη συνάρτηση παρακάτω για να κλιμακώσετε ένα σύνολο δεδομένων. Λάβετε υπόψη ότι δεν κλιμακώνετε τη στήλη ετικέτας και τις κατηγορηματικές μεταβλητές.
from sklearn import preprocessingdef 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)Βασική παλινδρόμηση: Συγκριτική αξιολόγηση
Πρώτα απ 'όλα, εκπαιδεύετε και δοκιμάζετε ένα μοντέλο χωρίς αλληλεπίδραση. Ο σκοπός είναι να δείτε τη μέτρηση απόδοσης του μοντέλου.
Ο τρόπος για να εκπαιδεύσει το μοντέλο είναι ακριβώς όπως το φροντιστήριο για υψηλού επιπέδου API . Θα χρησιμοποιήσετε τον εκτιμητή TensorFlow LinearRegressor.
Ως υπενθύμιση, πρέπει να επιλέξετε:
- τα χαρακτηριστικά που πρέπει να βάλετε στο μοντέλο
- μεταμορφώστε τα χαρακτηριστικά
- κατασκευάστε τον γραμμικό παλινδρομικό
- κατασκευάστε τη συνάρτηση input_fn
- εκπαιδεύστε το μοντέλο
- δοκιμάστε το μοντέλο
Χρησιμοποιείτε όλες τις μεταβλητές στο σύνολο δεδομένων για να εκπαιδεύσετε το μοντέλο. Συνολικά, υπάρχουν elevel συνεχείς μεταβλητές και μία κατηγορική μεταβλητή
## Add features to the bucket:### Define continuous listCONTI_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':, '_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 = 1INFO:tensorflow:global_step/sec: 144.457INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)INFO:tensorflow:global_step/sec: 258.392INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)INFO:tensorflow:global_step/sec: 227.998INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)INFO:tensorflow:global_step/sec: 210.739INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)INFO:tensorflow:global_step/sec: 234.237INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)INFO:tensorflow:global_step/sec: 238.1INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)INFO:tensorflow:global_step/sec: 237.934INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)INFO:tensorflow:global_step/sec: 220.687INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)INFO:tensorflow:global_step/sec: 232.702INFO: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.Επιτέλους, εκτιμάτε τις επιδόσεις του μοντέλου στο σετ δοκιμών
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:43INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43INFO: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.
Είναι καιρός να γενικεύσετε αυτήν την ιδέα και να δείτε αν μπορείτε να βελτιώσετε το μοντέλο που προβλέπει το μοντέλο.
Πρέπει να προσθέσετε δύο νέες στήλες σε κάθε σύνολο συνόλων δεδομένων: 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, testinteration_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 listcontinuous_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':, '_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 = 1INFO:tensorflow:global_step/sec: 124.844INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)INFO:tensorflow:global_step/sec: 182.704INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)INFO:tensorflow:global_step/sec: 208.189INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)INFO:tensorflow:global_step/sec: 213.855INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)INFO:tensorflow:global_step/sec: 209.758INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)INFO:tensorflow:global_step/sec: 196.618INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)INFO:tensorflow:global_step/sec: 196.472INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)INFO:tensorflow:global_step/sec: 172.82INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)INFO:tensorflow:global_step/sec: 168.916INFO: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.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:14INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14INFO: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. Ακριβώς προσθέτοντας δύο νέες μεταβλητές, καταφέρατε να μειώσετε την απώλεια. Αυτό σημαίνει ότι μπορείτε να κάνετε καλύτερη πρόβλεψη από ό, τι με το μοντέλο αναφοράς.