Δυαδική ταξινόμηση στο TensorFlow: Παράδειγμα γραμμικής ταξινόμησης

Πίνακας περιεχομένων:

Anonim

Οι δύο πιο κοινές εποπτευόμενες μαθησιακές εργασίες είναι η γραμμική παλινδρόμηση και η γραμμική ταξινόμηση. Η γραμμική παλινδρόμηση προβλέπει μια τιμή ενώ η γραμμική ταξινόμηση προβλέπει μια κλάση. Αυτό το σεμινάριο επικεντρώνεται στο Linear Classifier.

Τι είναι ο γραμμικός ταξινομητής;

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

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

  1. Εάν η ετικέτα έχει μόνο δύο τάξεις, ο αλγόριθμος εκμάθησης είναι Binary Classifier.
  2. Ο ταξινομητής Multiclass αντιμετωπίζει ετικέτες με περισσότερες από δύο κατηγορίες.

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

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

Σε αυτό το σεμινάριο, θα μάθετε

  • Τι είναι ο γραμμικός ταξινομητής;
  • Πώς λειτουργεί ο δυαδικός ταξινομητής;
  • Πώς να μετρήσετε την απόδοση του Linear Classifier;
  • Ακρίβεια
  • Πίνακας σύγχυσης
  • Ακρίβεια και ευαισθησία
  • Γραμμικός ταξινομητής με TensorFlow
  • Βήμα 1) Εισαγάγετε τα δεδομένα
  • Βήμα 2) Μετατροπή δεδομένων
  • Βήμα 3) Εκπαίδευση του Classifier
  • Βήμα 4) Βελτιώστε το μοντέλο
  • Βήμα 5) Υπερπαραμέτρου: Lasso & Ridge

Πώς λειτουργεί ο δυαδικός ταξινομητής;

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

Για το TensorFlow Binary Classifier, η ετικέτα μπορεί να είχε δύο πιθανές ακέραιες τιμές. Στις περισσότερες περιπτώσεις, είναι [0,1] ή [1,2]. Για παράδειγμα, ο στόχος είναι να προβλεφθεί εάν ένας πελάτης θα αγοράσει ένα προϊόν ή όχι. Η ετικέτα ορίζεται ως εξής:

  • Y = 1 (ο πελάτης αγόρασε το προϊόν)
  • Y = 0 (ο πελάτης δεν αγοράζει το προϊόν)

Το μοντέλο χρησιμοποιεί τα χαρακτηριστικά X για να ταξινομήσει κάθε πελάτη στην πιο πιθανή κατηγορία στην οποία ανήκει, δηλαδή, δυνητικό αγοραστή ή όχι.

Η πιθανότητα επιτυχίας υπολογίζεται με λογιστική παλινδρόμηση . Ο αλγόριθμος θα υπολογίσει μια πιθανότητα με βάση το χαρακτηριστικό X και προβλέπει επιτυχία όταν αυτή η πιθανότητα είναι πάνω από 50 τοις εκατό. Πιο τυπικά, η πιθανότητα υπολογίζεται όπως φαίνεται στο παρακάτω παράδειγμα TensorFlow Binary Classification:

όπου 0 είναι το σύνολο των βαρών, τα χαρακτηριστικά και b η μεροληψία.

Η συνάρτηση μπορεί να αποσυντεθεί σε δύο μέρη:

  • Το γραμμικό μοντέλο
  • Η λογιστική συνάρτηση

Γραμμικό μοντέλο

Είστε ήδη εξοικειωμένοι με τον τρόπο υπολογισμού των βαρών. Τα βάρη υπολογίζονται χρησιμοποιώντας ένα προϊόν κουκκίδας: Το Y είναι μια γραμμική συνάρτηση όλων των χαρακτηριστικών x i . Εάν το μοντέλο δεν διαθέτει χαρακτηριστικά, η πρόβλεψη είναι ίση με την προκατάληψη, β.

Τα βάρη υποδεικνύουν την κατεύθυνση της συσχέτισης μεταξύ των χαρακτηριστικών x i και της ετικέτας y. Μια θετική συσχέτιση αυξάνει την πιθανότητα της θετικής τάξης, ενώ μια αρνητική συσχέτιση οδηγεί την πιθανότητα πιο κοντά στο 0, (δηλαδή, αρνητική τάξη).

Το γραμμικό μοντέλο επιστρέφει μόνο πραγματικό αριθμό, ο οποίος δεν συνάδει με το μέτρο πιθανότητας εύρους [0,1]. Η λογιστική συνάρτηση απαιτείται για τη μετατροπή της γραμμικής εξόδου μοντέλου σε πιθανότητα,

Λογιστική λειτουργία

Η λογιστική συνάρτηση, ή η λειτουργία σιγμοειδούς, έχει σχήμα S και η έξοδος αυτής της συνάρτησης είναι πάντα μεταξύ 0 και 1.

Παράδειγμα λογιστικής λειτουργίας

Είναι εύκολο να αντικαταστήσετε την έξοδο της γραμμικής παλινδρόμησης στη λειτουργία σιγμοειδούς. Καταλήγει σε έναν νέο αριθμό με πιθανότητα μεταξύ 0 και 1.

Ο ταξινομητής μπορεί να μετατρέψει την πιθανότητα σε τάξη

  • Οι τιμές μεταξύ 0 και 0,49 γίνονται κλάση 0
  • Οι τιμές μεταξύ 0,5 και 1 γίνονται τάξη 1

Πώς να μετρήσετε την απόδοση του Linear Classifier;

Ακρίβεια

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

Μετρήστε την απόδοση του Linear Classifier χρησιμοποιώντας τη μέτρηση Ακρίβεια

Μπορείτε να σημειώσετε ένα μειονέκτημα με αυτήν τη μέτρηση, ειδικά για την κατηγορία ανισορροπίας. Ένα σύνολο δεδομένων ανισορροπίας εμφανίζεται όταν ο αριθμός των παρατηρήσεων ανά ομάδα δεν είναι ίσος. Ας πούμε; προσπαθείτε να ταξινομήσετε ένα σπάνιο συμβάν με μια λογιστική συνάρτηση. Φανταστείτε ότι ο ταξινομητής προσπαθεί να εκτιμήσει το θάνατο ενός ασθενούς μετά από μια ασθένεια. Στα δεδομένα, 5 τοις εκατό των ασθενών πεθαίνουν. Μπορείτε να εκπαιδεύσετε έναν ταξινομητή για να προβλέψετε τον αριθμό του θανάτου και να χρησιμοποιήσετε τη μέτρηση ακρίβειας για να αξιολογήσετε τις επιδόσεις. Εάν ο ταξινομητής προβλέψει 0 θάνατο για ολόκληρο το σύνολο δεδομένων, θα είναι σωστό στο 95 τοις εκατό της περίπτωσης.

Πίνακας σύγχυσης

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

Μετρήστε την απόδοση του Linear Classifier χρησιμοποιώντας το Confusion matrix

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

  • TP: True Positive: Οι προβλεπόμενες τιμές προβλέπονται σωστά ως πραγματικές θετικές
  • FP: Οι προβλεπόμενες τιμές προέβλεπαν λανθασμένα ένα πραγματικό θετικό. Δηλαδή, οι αρνητικές τιμές προβλέπονται ως θετικές
  • FN: False Negative: Θετικές τιμές προβλεπόμενες ως αρνητικές
  • TN: True Negative: Προβλεπόμενες τιμές που προβλέπονται σωστά ως πραγματικές αρνητικές

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

Ακρίβεια και ευαισθησία

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

Ακρίβεια

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

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

Ευαισθησία

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

Γραμμικός ταξινομητής με TensorFlow

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

  • με τιμή 1 εάν το εισόδημα> 50k
  • 0 εάν το εισόδημα <50k.

Αυτή η μεταβλητή είναι η ετικέτα σας

Αυτό το σύνολο δεδομένων περιλαμβάνει οκτώ κατηγορηματικές μεταβλητές:

  • ΧΩΡΟΣ ΕΡΓΑΣΙΑΣ
  • εκπαίδευση
  • συζυγικός
  • κατοχή
  • σχέση
  • αγώνας
  • φύλο
  • χώρα ιθαγένειας

Επιπλέον, έξι συνεχείς μεταβλητές:

  • ηλικία
  • fnlwgt
  • εκπαίδευση_αριθ
  • κεφαλαιακό κέρδος
  • απώλεια κεφαλαίου
  • ώρες_ εβδομάδες

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

Θα προχωρήσουμε ως εξής:

  • Βήμα 1) Εισαγάγετε τα δεδομένα
  • Βήμα 2) Μετατροπή δεδομένων
  • Βήμα 3) Εκπαιδεύστε τον ταξινομητή
  • Βήμα 4) Βελτιώστε το μοντέλο
  • Βήμα 5) Υπερπαραμέτρου: Lasso & Ridge

Βήμα 1) Εισαγάγετε τα δεδομένα

Πρώτα εισάγετε τις βιβλιοθήκες που χρησιμοποιήθηκαν κατά τη διάρκεια του σεμιναρίου.

import tensorflow as tfimport pandas as pd 

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

Σημειώστε ότι θα εκπαιδεύσετε τον ταξινομητή χρησιμοποιώντας ένα πλαίσιο δεδομένων Pandas.

## Define path dataCOLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital','occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss','hours_week', 'native_country', 'label']PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"PATH_test = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"

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

df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)

Το σετ αμαξοστοιχίας περιέχει 32.561 παρατηρήσεις και το σετ δοκιμών 16.281

print(df_train.shape, df_test.shape)print(df_train.dtypes)(32561, 15) (16281, 15)age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel objectdtype: object

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

label = {'<=50K': 0,'>50K': 1}df_train.label = [label[item] for item in df_train.label]label_t = {'<=50K.': 0,'>50K.': 1}df_test.label = [label_t[item] for item in df_test.label]

Στα δεδομένα της αμαξοστοιχίας, υπάρχουν 24.720 εισοδήματα χαμηλότερα από 50k και 7841 παραπάνω. Η αναλογία είναι σχεδόν η ίδια για το σύνολο δοκιμών. Ανατρέξτε σε αυτό το σεμινάριο στο Facets για περισσότερα.

print(df_train["label"].value_counts())### The model will be correct in atleast 70% of the caseprint(df_test["label"].value_counts())## Unbalanced labelprint(df_train.dtypes)0 247201 7841Name: label, dtype: int640 124351 3846Name: label, dtype: int64age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel int64dtype: object

Βήμα 2) Μετατροπή δεδομένων

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

Ο εκτιμητής πρέπει να έχει μια λίστα χαρακτηριστικών για να εκπαιδεύσει το μοντέλο. Ως εκ τούτου, τα δεδομένα της στήλης πρέπει να μετατραπούν σε τανυστή.

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

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

Τα χαρακτηριστικά του συνόλου δεδομένων έχουν δύο μορφές:

  • Ακέραιος αριθμός
  • Αντικείμενο

Κάθε χαρακτηριστικό παρατίθεται στις επόμενες δύο μεταβλητές σύμφωνα με τους τύπους τους.

## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']### Define the categorical listCATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']

Το feature_column είναι εξοπλισμένο με ένα αντικείμενο numeric_column για να βοηθήσει στη μετατροπή των συνεχών μεταβλητών σε tensor. Στον παρακάτω κώδικα, μετατρέπετε όλες τις μεταβλητές από CONTI_FEATURES σε τανυστή με αριθμητική τιμή. Αυτό είναι υποχρεωτικό για την κατασκευή του μοντέλου. Όλες οι ανεξάρτητες μεταβλητές πρέπει να μετατραπούν στον κατάλληλο τύπο τανυστή.

Παρακάτω γράφουμε έναν κωδικό που σας επιτρέπει να δείτε τι συμβαίνει πίσω από το feature_column.numeric_column. Θα εκτυπώσουμε την τιμή μετατροπής για την ηλικία Είναι για επεξηγηματικό σκοπό, επομένως δεν χρειάζεται να κατανοήσουμε τον κώδικα python. Μπορείτε να ανατρέξετε στην επίσημη τεκμηρίωση για να κατανοήσετε τους κωδικούς.

def print_transformation(feature = "age", continuous = True, size = 2):#X = fc.numeric_column(feature)## Create feature namefeature_names = [feature]## Create dict with the datad = dict(zip(feature_names, [df_train[feature]]))## Convert ageif continuous == True:c = tf.feature_column.numeric_column(feature)feature_columns = [c]else:c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size)c_indicator = tf.feature_column.indicator_column(c)feature_columns = [c_indicator]## Use input_layer to print the valueinput_layer = tf.feature_column.input_layer(features=d,feature_columns=feature_columns)## Create lookup tablezero = tf.constant(0, dtype=tf.float32)where = tf.not_equal(input_layer, zero)## Return lookup tbleindices = tf.where(where)values = tf.gather_nd(input_layer, indices)## Initiate graphsess = tf.Session()## Print valueprint(sess.run(input_layer))print_transformation(feature = "age", continuous = True)[[39.][50.][38.]… [58.][22.][52.]]

Οι τιμές είναι ακριβώς οι ίδιες όπως στο df_train

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES] 

Σύμφωνα με την τεκμηρίωση TensorFlow, υπάρχουν διαφορετικοί τρόποι μετατροπής κατηγορηματικών δεδομένων. Εάν η λίστα λεξιλογίου μιας δυνατότητας είναι γνωστή και δεν έχει πολλές τιμές, είναι δυνατό να δημιουργήσετε την κατηγορική στήλη με την κατηγορία_column_with_vocabulary_list. Θα εκχωρήσει σε μια μοναδική λίστα λεξιλογίου ένα αναγνωριστικό.

Για παράδειγμα, εάν μια κατάσταση μεταβλητής έχει τρεις διαφορετικές τιμές:

  • Σύζυγος
  • Γυναίκα
  • Μονόκλινο

Τότε θα αναγνωριστούν τρία αναγνωριστικά. Για παράδειγμα, ο σύζυγος θα έχει το ID 1, τη σύζυγο το ID 2 και ούτω καθεξής.

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

Το χαρακτηριστικό σεξ μπορεί να έχει μόνο δύο τιμές: άνδρες ή γυναίκες Όταν θα μετατρέψουμε το σεξ χαρακτηριστικών, το Tensorflow θα δημιουργήσει 2 νέες στήλες, μία για άνδρες και μία για γυναίκες. Εάν το φύλο είναι ίσο με το αρσενικό, τότε το νέο στήλη αρσενικό θα είναι ίσο με το 1 και το θηλυκό στο 0. Αυτό το παράδειγμα εμφανίζεται στον παρακάτω πίνακα:

σειρές

φύλο

μετά τον μετασχηματισμό

αρσενικός

θηλυκός

1

αρσενικός

=>

1

0

2

αρσενικός

=>

1

0

3

θηλυκός

=>

0

1

Σε τάση ροής:

print_transformation(feature = "sex", continuous = False, size = 2)[[1. 0.][1. 0.][1. 0.]… [0. 1.][1. 0.][0. 1.]]relationship = tf.feature_column.categorical_column_with_vocabulary_list('relationship', ['Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried','Other-relative'])

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

Ωστόσο, ένας γρηγορότερος τρόπος για να μετατρέψετε τα δεδομένα είναι να χρησιμοποιήσετε τη μέθοδο κατηγορίας_στηλών_ με_κατάστημα_bucket. Η αλλαγή των μεταβλητών συμβολοσειράς σε μια αραιή μήτρα θα είναι χρήσιμη. Ένας αραιός πίνακας είναι ένας πίνακας με κυρίως μηδέν. Η μέθοδος φροντίζει τα πάντα. Αρκεί να καθορίσετε μόνο τον αριθμό των κάδων και τη στήλη κλειδιού. Ο αριθμός των κάδων είναι το μέγιστο ποσό ομάδων που μπορεί να δημιουργήσει το Tensorflow. Η βασική στήλη είναι απλώς το όνομα της στήλης για μετατροπή.

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

categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]

Βήμα 3) Εκπαίδευση του Classifier

Το TensorFlow παρέχει αυτήν τη στιγμή έναν εκτιμητή για τη γραμμική παλινδρόμηση και τη γραμμική ταξινόμηση.

  • Γραμμική παλινδρόμηση: LinearRegressor
  • Γραμμική ταξινόμηση: LinearClassifier

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

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

model = tf.estimator.LinearClassifier(n_classes = 2,model_dir="ongoing/train",feature_columns=categorical_features+ continuous_features)

ΠΑΡΑΓΩΓΗ:

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec':, '_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}

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

FEATURES = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country']LABEL= 'label'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)

Δημιουργείτε μια συνάρτηση με τα ορίσματα που απαιτούνται από τον γραμμικό εκτιμητή, δηλαδή τον αριθμό των εποχών, τον αριθμό των παρτίδων και ανακατέψτε το σύνολο δεδομένων ή τη σημείωση. Δεδομένου ότι χρησιμοποιείτε τη μέθοδο Pandas για να μεταφέρετε τα δεδομένα στο μοντέλο, πρέπει να ορίσετε τις μεταβλητές X ως πλαίσιο δεδομένων pandas. Σημειώστε ότι πραγματοποιείτε βρόχο σε όλα τα δεδομένα που είναι αποθηκευμένα στα ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ.

Ας εκπαιδεύσουμε το μοντέλο με το αντικείμενο model.train. Χρησιμοποιείτε τη συνάρτηση που ορίστηκε προηγουμένως για να τροφοδοτήσετε το μοντέλο με τις κατάλληλες τιμές. Σημειώστε ότι ορίσατε το μέγεθος της παρτίδας σε 128 και τον αριθμό των εποχών σε Κανένα. Το μοντέλο θα εκπαιδευτεί πάνω από χίλια βήματα.

model.train(input_fn=get_input_fn(df_train,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 ongoing/train/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 65.8282INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)INFO:tensorflow:global_step/sec: 118.386INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)INFO:tensorflow:global_step/sec: 110.542INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)INFO:tensorflow:global_step/sec: 199.03INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)INFO:tensorflow:global_step/sec: 167.488INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)INFO:tensorflow:global_step/sec: 220.155INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)INFO:tensorflow:global_step/sec: 199.016INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)INFO:tensorflow:global_step/sec: 197.531INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)INFO:tensorflow:global_step/sec: 208.479INFO:tensorflow:loss = 22201.918, step = 901 (0.479 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt.INFO:tensorflow:Loss for final step: 5444.363.

Σημειώστε ότι η απώλεια μειώθηκε στη συνέχεια κατά τα τελευταία 100 βήματα, δηλαδή από 901 σε 1000.

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

model.evaluate(input_fn=get_input_fn(df_test,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:22INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:23INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546{'accuracy': 0.7615626,'accuracy_baseline': 0.76377374,'auc': 0.63300294,'auc_precision_recall': 0.50891197,'average_loss': 47.12155,'global_step': 1000,'label/mean': 0.23622628,'loss': 5993.6406,'precision': 0.49401596,'prediction/mean': 0.18454961,'recall': 0.38637546}

Το TensorFlow επιστρέφει όλες τις μετρήσεις που μάθατε στο θεωρητικό μέρος. Χωρίς έκπληξη, η ακρίβεια είναι μεγάλη λόγω της μη ισορροπημένης ετικέτας. Στην πραγματικότητα, το μοντέλο έχει ελαφρώς καλύτερη απόδοση από μια τυχαία εικασία. Φανταστείτε ότι το μοντέλο προβλέπει όλα τα νοικοκυριά με εισόδημα μικρότερο από 50K, τότε το μοντέλο έχει ακρίβεια 70% Σε μια πιο προσεκτική ανάλυση, μπορείτε να δείτε ότι η πρόβλεψη και η ανάκληση είναι αρκετά χαμηλή.

Βήμα 4) Βελτιώστε το μοντέλο

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

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

  • Προσθέστε πολυωνυμικό όρο
  • Ο συνεχόμενος μεταβλητός είναι σε κατηγοριοποιημένη μεταβλητή

Πολυωνυμικός όρος

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

Τι είναι η πολυωνυμική παλινδρόμηση

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

Τώρα, κοιτάξτε την αριστερή εικόνα από την παρακάτω εικόνα, προσθέσαμε πέντε όρους στην παλινδρόμηση (δηλαδή y = x + x 2 + x 3 + x 4 + x 5. Το μοντέλο καταγράφει τώρα καλύτερα το μοτίβο. Αυτό είναι η δύναμη της πολυωνυμικής παλινδρόμησης.

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

Ας δούμε αν αυξάνει την ακρίβεια.

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

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

def square_var(df_t, df_te, var_name = 'age'):df_t['new'] = df_t[var_name].pow(2)df_te['new'] = df_te[var_name].pow(2)return df_t, df_te

Η συνάρτηση έχει 3 ορίσματα:

  • df_t: ορίστε το σετ προπόνησης
  • df_te: ορίστε το σετ δοκιμών
  • var_name = 'age': Ορίστε τη μεταβλητή που θα μετασχηματιστεί

Μπορείτε να χρησιμοποιήσετε το αντικείμενο pow (2) για να τετραγωνίσετε τη μεταβλητή ηλικία. Σημειώστε ότι η νέα μεταβλητή ονομάζεται «νέα»

Τώρα που έχει γραφτεί η συνάρτηση square_var, μπορείτε να δημιουργήσετε τα νέα σύνολα δεδομένων.

df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age') 

Όπως μπορείτε να δείτε, το νέο σύνολο δεδομένων έχει ένα ακόμη χαρακτηριστικό.

print(df_train_new.shape, df_test_new.shape)(32561, 16) (16281, 16) 

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

CONTI_FEATURES_NEW = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week', 'new']continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]

Σημειώστε ότι αλλάξατε τον κατάλογο του γραφήματος. Δεν μπορείτε να εκπαιδεύσετε διαφορετικά μοντέλα στον ίδιο κατάλογο. Αυτό σημαίνει ότι πρέπει να αλλάξετε τη διαδρομή του ορίσματος model_dir. Εάν δεν το κάνετε, το TensorFlow θα εμφανίσει σφάλμα.

model_1 = tf.estimator.LinearClassifier(model_dir="ongoing/train1",feature_columns=categorical_features+ continuous_features_new)
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec':, '_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_NEW = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'new']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_NEW}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)

Τώρα που ο ταξινομητής έχει σχεδιαστεί με το νέο σύνολο δεδομένων, μπορείτε να εκπαιδεύσετε και να αξιολογήσετε το μοντέλο.

model_1.train(input_fn=get_input_fn(df_train,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 ongoing/train1/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 81.487INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)INFO:tensorflow:global_step/sec: 111.169INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)INFO:tensorflow:global_step/sec: 128.91INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)INFO:tensorflow:global_step/sec: 132.546INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)INFO:tensorflow:global_step/sec: 162.194INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)INFO:tensorflow:global_step/sec: 204.852INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)INFO:tensorflow:global_step/sec: 188.923INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)INFO:tensorflow:global_step/sec: 192.041INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)INFO:tensorflow:global_step/sec: 197.025INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt.INFO:tensorflow:Loss for final step: 28861.898.
model_1.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:37INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:39INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703{'accuracy': 0.7944229,'accuracy_baseline': 0.76377374,'auc': 0.6093755,'auc_precision_recall': 0.54885805,'average_loss': 111.0046,'global_step': 1000,'label/mean': 0.23622628,'loss': 14119.265,'precision': 0.6682401,'prediction/mean': 0.09116262,'recall': 0.2576703}

Η τετραγωνική μεταβλητή βελτίωσε την ακρίβεια από 0,76 σε 0,79. Ας δούμε αν μπορείτε να κάνετε καλύτερα συνδυάζοντας τον όρο της κουβάδας και της αλληλεπίδρασης.

Κουβάδες και αλληλεπίδραση

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

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

Στο TensorFlow, γίνεται με στήλη bucketized_column. Πρέπει να προσθέσετε το εύρος τιμών στα όρια.

age = tf.feature_column.numeric_column('age')age_buckets = tf.feature_column.bucketized_column(age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

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

Μπορείτε να αναλύσετε την ηλικία με ένα άλλο χαρακτηριστικό όπως η εκπαίδευση. Δηλαδή, ορισμένες ομάδες είναι πιθανό να έχουν υψηλό εισόδημα και άλλες χαμηλές (Σκεφτείτε τον διδακτορικό φοιτητή).

education_x_occupation = [tf.feature_column.crossed_column(['education', 'occupation'], hash_bucket_size=1000)]age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column([age_buckets, 'education', 'occupation'], hash_bucket_size=1000)]

Για να δημιουργήσετε μια στήλη πολλαπλών λειτουργιών, χρησιμοποιείτε τη στήλη cross_column με τις μεταβλητές για να διασταυρώσετε μια αγκύλη. Το hash_bucket_size υποδεικνύει τις μέγιστες δυνατότητες διέλευσης. Για να δημιουργήσετε αλληλεπίδραση μεταξύ μεταβλητών (τουλάχιστον μία μεταβλητή πρέπει να είναι κατηγορηματική), μπορείτε να χρησιμοποιήσετε τη στήλη tf.feature_column.crossed_column. Για να χρησιμοποιήσετε αυτό το αντικείμενο, πρέπει να προσθέσετε σε αγκύλη τη μεταβλητή για αλληλεπίδραση και ένα δεύτερο όρισμα, το μέγεθος κάδου. Το μέγεθος κάδου είναι ο μέγιστος δυνατός αριθμός ομάδας σε μια μεταβλητή. Εδώ το ορίζετε σε 1000 καθώς δεν γνωρίζετε τον ακριβή αριθμό ομάδων

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

base_columns = [age_buckets,]model_imp = tf.estimator.LinearClassifier(model_dir="ongoing/train3",feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)

ΠΑΡΑΓΩΓΗ

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train3', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': , '_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_imp = ['age','workclass', 'education', 'education_num', 'marital','occupation', 'relationship', 'race', 'sex', 'native_country', 'new']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_imp}),y = pd.Series(data_set[LABEL].values),batch_size=n_batch,num_epochs=num_epochs,shuffle=shuffle)

Είστε έτοιμοι να εκτιμήσετε το νέο μοντέλο και να δείτε εάν βελτιώνει την ακρίβεια.

model_imp.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 ongoing/train3/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 94.969INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)INFO:tensorflow:global_step/sec: 242.342INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)INFO:tensorflow:global_step/sec: 213.686INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)INFO:tensorflow:global_step/sec: 174.084INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)INFO:tensorflow:global_step/sec: 191.78INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)INFO:tensorflow:global_step/sec: 163.436INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)INFO:tensorflow:global_step/sec: 164.347INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)INFO:tensorflow:global_step/sec: 154.274INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)INFO:tensorflow:global_step/sec: 189.14INFO:tensorflow:loss = 44.69645, step = 901 (0.531 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt.INFO:tensorflow:Loss for final step: 44.18133.
model_imp.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:52INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:54INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216{'accuracy': 0.8358209,'accuracy_baseline': 0.76377374,'auc': 0.88401634,'auc_precision_recall': 0.69599575,'average_loss': 0.35122654,'global_step': 1000,'label/mean': 0.23622628,'loss': 44.67437,'precision': 0.68986726,'prediction/mean': 0.23320661,'recall': 0.55408216}

Το νέο επίπεδο ακρίβειας είναι 83,58 τοις εκατό. Είναι τέσσερα τοις εκατό υψηλότερο από το προηγούμενο μοντέλο.

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

Βήμα 5) Υπερπαραμέτρου: Lasso & Ridge

Το μοντέλο μπορεί να υποφέρουν από overfitting ή underfitting .

  • Overfitting: Το μοντέλο δεν μπορεί να γενικεύσει την πρόβλεψη σε νέα δεδομένα
  • Underfitting: Το μοντέλο δεν είναι σε θέση να συλλάβει το μοτίβο των δεδομένων. δηλαδή, γραμμική παλινδρόμηση όταν τα δεδομένα είναι μη γραμμικά

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

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

  • L1: Λάσσο
  • L2: Κορυφή

Στο TensorFlow, μπορείτε να προσθέσετε αυτές τις δύο υπερπαραμέτρους στο optimizer. Για παράδειγμα, όσο υψηλότερο είναι το υπερπαραμέτρο L2, το βάρος τείνει να είναι πολύ χαμηλό και κοντά στο μηδέν. Η προσαρμοσμένη γραμμή θα είναι πολύ επίπεδη, ενώ το L2 κοντά στο μηδέν σημαίνει ότι τα βάρη είναι κοντά στην κανονική γραμμική παλινδρόμηση.

Μπορείτε να δοκιμάσετε μόνοι σας τη διαφορετική τιμή των υπερπαραμέτρων και να δείτε εάν μπορείτε να αυξήσετε το επίπεδο ακρίβειας.

Λάβετε υπόψη ότι εάν αλλάξετε την υπερπαραμετρο, πρέπει να διαγράψετε το φάκελο σε εξέλιξη / train4, διαφορετικά το μοντέλο θα ξεκινήσει με το προηγουμένως εκπαιδευμένο μοντέλο.

Ας δούμε πώς είναι η ακρίβεια με τη διαφημιστική εκστρατεία

model_regu = tf.estimator.LinearClassifier(model_dir="ongoing/train4", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,optimizer=tf.train.FtrlOptimizer(learning_rate=0.1,l1_regularization_strength=0.9,l2_regularization_strength=5))

ΕΞΩ

INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_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}
model_regu.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 ongoing/train4/model.ckpt.INFO:tensorflow:loss = 88.722855, step = 1INFO:tensorflow:global_step/sec: 77.4165INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)INFO:tensorflow:global_step/sec: 187.889INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)INFO:tensorflow:global_step/sec: 201.895INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)INFO:tensorflow:global_step/sec: 217.992INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)INFO:tensorflow:global_step/sec: 193.676INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)INFO:tensorflow:global_step/sec: 202.195INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)INFO:tensorflow:global_step/sec: 216.756INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)INFO:tensorflow:global_step/sec: 240.215INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)INFO:tensorflow:global_step/sec: 220.336INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.INFO:tensorflow:Loss for final step: 43.4942.
model_regu.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)

ΠΑΡΑΓΩΓΗ

INFO:tensorflow:Calling model_fn.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-06-02-08:29:07INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [100/1000]INFO:tensorflow:Finished evaluation at 2018-06-02-08:29:09INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823{'accuracy': 0.83833915,'accuracy_baseline': 0.76377374,'auc': 0.8869794,'auc_precision_recall': 0.7014905,'average_loss': 0.34691378,'global_step': 1000,'label/mean': 0.23622628,'loss': 44.12581,'precision': 0.69720596,'prediction/mean': 0.23662092,'recall': 0.5579823}

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

Περίληψη

Για να εκπαιδεύσετε ένα μοντέλο, πρέπει να:

  • Ορίστε τα χαρακτηριστικά: Ανεξάρτητες μεταβλητές: X
  • Ορίστε την ετικέτα: Εξαρτώμενη μεταβλητή: y
  • Κατασκευάστε ένα σετ τρένων / δοκιμών
  • Ορίστε το αρχικό βάρος
  • Ορίστε τη λειτουργία απώλειας: MSE
  • Βελτιστοποιήστε το μοντέλο: Διαβάθμιση κλίσης
  • Καθορίζω:
    • Ποσοστό εκμάθησης
    • Αριθμός εποχής
    • Μέγεθος παρτίδας
    • Αριθμός τάξης

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

  1. Δυνατότητες στηλών. Εάν είναι συνεχής: tf.feature_column.numeric_column (). Μπορείτε να συμπληρώσετε μια λίστα με κατανόηση λίστας python
  2. Ο εκτιμητής: tf.estimator.LinearClassifier (feature_columns, model_dir, n_classes = 2)
  3. Μια συνάρτηση για την εισαγωγή των δεδομένων, το μέγεθος της παρτίδας και την εποχή: input_fn ()

Μετά από αυτό, είστε έτοιμοι να εκπαιδεύσετε, να αξιολογήσετε και να κάνετε μια πρόβλεψη με το τρένο (), να αξιολογήσετε () και να προβλέψετε ()

Για να βελτιώσετε την απόδοση του μοντέλου, μπορείτε:

  • Χρησιμοποιήστε πολυωνυμική παλινδρόμηση
  • Όρος αλληλεπίδρασης: tf.feature_column.crossed_column
  • Προσθήκη παραμέτρου κανονικοποίησης