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

⚡ Έξυπνη Σύνοψη

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

  • 🔘 Πρώτα τα δεδομένα: Η κατανόηση των κατανομών και των ακραίων τιμών προηγείται οποιουδήποτε μοντέλου, επειδή ένα μοντέλο γενικεύει μόνο ένα μοτίβο που έχετε ήδη εντοπίσει.
  • ☑️ Επισκόπηση πτυχών: Τα στατιστικά στοιχεία ανά χαρακτηριστικό αποκαλύπτουν ελλείπουσες τιμές, στήλες με μηδενικό βάρος και απόκλιση κατανομής train-versus-test σε έναν πίνακα.
  • Βαθιά εμβάθυνση στις πτυχές: Η εδραίωση με βάση τα X και Y μετατρέπει τις τριμερείς σχέσεις σε ένα ευανάγνωστο δισδιάστατο διάγραμμα χρωματισμένο με βάση το τεταρτημόριο τιμών.
  • 🧪 Ανάγνωση συσχέτισης: Ο χάρτης θερμότητας και το πλέγμα ζευγών επισημαίνουν το INDUS με NOX και το DIS και με τα δύο, ως υποψήφιες για αλληλεπίδραση.
  • Τυποποίηση: Η συνάρτηση preprocessing.scale κεντράρει τις δώδεκα συνεχόμενες στήλες πριν τις δει ο εκτιμητής, αφήνοντας ανέπαφες τις συναρτήσεις CHAS και PRICE.
  • 📈 Μετρούμενο κέρδος: Η προσθήκη των INDUS_NOS και INDUS_NOS_DIS μετακινεί τη μέση απώλεια από 86.89361 σε 79.78876 στο test split.

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

Γραμμική Παλινδρόμηση 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)

Οι δύο πρώτες γραμμές του Boston DataFrame μετά τη μετονομασία των στηλών

Μετατρέπετε τη μεταβλητή 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

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

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

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

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

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 και κατεβάστε τα αποθετήρια.

Σελίδα αποθετηρίου όψεων PAIR-code στο GitHub

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

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

echo `pwd`/`ls facets`

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

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

Τερματικό που εμφανίζει τον φάκελο 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. Αντιγράψτε τη διαδρομή

Διαδρομή αρχείου του φακέλου 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>

Θερμικός χάρτης συσχέτισης Seaborn των μεταβλητών της Βοστώνης

Στον παραπάνω θερμικό χάρτη, τα πιο σκούρα τετράγωνα υποδεικνύουν ισχυρότερες συσχετίσεις. Από τον πίνακα, μπορείτε να δείτε:

  • 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)

Παραγωγή

Πλέγμα ζευγών Seaborn των PRICE, INDUS, NOX, RM και LSTAT

Ας ξεκινήσουμε με το πάνω μέρος:

  • Η τιμή συσχετίζεται αρνητικά με τα 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")

Διάγραμμα διασποράς του DIS έναντι του INDUS χρωματισμένο ανά τεταρτημόριο τιμών

Χρησιμοποιώντας την ανάλυση 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)

Παραγωγή

Training DataFrame με προσαρτημένες τις στήλες INDUS_NOS και INDUS_NOS_DIS

Αυτό είναι όλο: μπορείτε να εκτιμήσετε το νέο μοντέλο με τους όρους αλληλεπίδρασης και να δείτε πώς είναι η μέτρηση απόδοσης.

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% στη μέση απώλεια αποδίδεται μόνο στις δύο στήλες αλληλεπίδρασης.

Συχνές Ερωτήσεις

Καταργήθηκε στην έκδοση scikit-learn 1.0 και αφαιρέθηκε στην έκδοση 1.2. Το σύνολο δεδομένων περιέχει ένα χαρακτηριστικό που βασίζεται σε μια υπόθεση σχετικά με τον φυλετικό αυτοδιαχωρισμό και τις τιμές των κατοικιών, και η αρχική μελέτη δεν επικύρωσε ποτέ την υπόθεση της για την ποιότητα του αέρα. Οι κατοικίες στην Καλιφόρνια ή το Έιμς είναι τα συνηθισμένα υποκατάστατα.

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

Αναζητήστε ζεύγη που συσχετίζονται μεταξύ τους και με τον στόχο. Ο θερμικός χάρτης Pearson και το πλέγμα ζευγών το κάνουν αυτό οπτικά. Εδώ τα INDUS και NOX ομαδοποιούνται μαζί και τα δύο track PRICE, το οποίο είναι το σήμα που δικαιολογεί τη διέλευσή τους.

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

Το Copilot χειρίζεται καλά την επαναλαμβανόμενη σχεδίαση σε στερεότυπα — ζεύγη πλεγμάτων, μασκοφόροι χάρτες θερμότητας, πρότυπα HTML για Facets. Ελέγξτε τα ορίσματα που προτείνει, επειδή το seaborn μετονόμασε πολλά από αυτά και το Copilot θα συνδυάσει ευχαρίστως παλιές και τρέχουσες υπογραφές.

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

Η μάσκα χρησιμοποιεί το np.bool, ένα ψευδώνυμο που έχει καταργηθεί στο NumPy 1.20 και έχει αφαιρεθεί στο 1.24. Πρόσφατες εγκαταστάσεις εμφανίζουν το AttributeError. Η αντικατάσταση του ενσωματωμένου bool αφήνει τη συμπεριφορά ίδια. Το np.bool_ λειτουργεί επίσης εάν χρειάζεστε τον βαθμωτό τύπο NumPy.

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

Συνοψίστε αυτήν την ανάρτηση με: