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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Το γραμμικό μοντέλο
  • Η υλικοτεχνική λειτουργία

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

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

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

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

Λειτουργία Logistic

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

Παράδειγμα Logistic Function

Παράδειγμα Logistic Function
Παράδειγμα Logistic Function

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

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

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

Πώς να μετρήσετε την απόδοση του Γραμμικού ταξινομητή;

Ακρίβεια

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

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

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

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

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

Πίνακας σύγχυσης
Μετρήστε την απόδοση του Γραμμικού ταξινομητή χρησιμοποιώντας τον πίνακα σύγχυσης

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

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

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

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

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

Ακρίβεια

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

Ακρίβεια

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

Ευαισθησία

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

Ευαισθησία

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

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

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

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

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

  • στο χώρο εργασίας
  • εκπαίδευση
  • συζυγικός
  • επάγγελμα
  • σχέση
  • αγώνας
  • φύλο
  • χώρα ιθαγένειας

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

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

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

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

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

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

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

import tensorflow as tf
import pandas as pd

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

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

## Define path data
COLUMNS = ['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                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label             object
dtype: 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 εισοδήματα χαμηλότερα από 50 χιλιάδες και 7841 παραπάνω. Η αναλογία είναι σχεδόν η ίδια για το σετ δοκιμής. Ανατρέξτε σε αυτό το σεμινάριο για Facets για περισσότερα.

print(df_train["label"].value_counts())
### The model will be correct in atleast 70% of the case
print(df_test["label"].value_counts())
## Unbalanced label
print(df_train.dtypes)
0    24720
1     7841
Name: label, dtype: int64
0    12435
1     3846
Name: label, dtype: int64
age                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label              int64
dtype: object

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

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

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

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

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

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

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

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

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

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

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

def print_transformation(feature = "age", continuous = True, size = 2): 
    #X = fc.numeric_column(feature)
    ## Create feature name
    feature_names = [
    feature]

    ## Create dict with the data
    d = dict(zip(feature_names, [df_train[feature]]))

    ## Convert age
    if 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 value
    input_layer = tf.feature_column.input_layer(
        features=d,
        feature_columns=feature_columns
        )
    ## Create lookup table
    zero = tf.constant(0, dtype=tf.float32)
    where = tf.not_equal(input_layer, zero)
    ## Return lookup tble
    indices = tf.where(where)
    values = tf.gather_nd(input_layer, indices)
    ## Initiate graph
    sess = tf.Session()
    ## Print value
    print(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, υπάρχουν διαφορετικοί τρόποι μετατροπής κατηγορικών δεδομένων. Εάν η λίστα λεξιλογίου ενός χαρακτηριστικού είναι γνωστή και δεν έχει πολλές τιμές, μπορείτε να δημιουργήσετε τη στήλη κατηγοριών με categorical_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 κωδικός για την εκτύπωση της κωδικοποίησης. Και πάλι, δεν χρειάζεται να κατανοήσετε τον κώδικα, ο σκοπός είναι να δείτε τον μετασχηματισμό

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

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

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

Βήμα 3) Εκπαιδεύστε τον Ταξινομητή

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

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

Η σύνταξη του γραμμικού ταξινομητή είναι η ίδια όπως στο tutorial on γραμμικής παλινδρόμησης εκτός από ένα όρισμα, 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': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x181f24c898>, '_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)

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

Ας εκπαιδεύσουμε το μοντέλο με το αντικείμενο 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 = 1
INFO:tensorflow:global_step/sec: 65.8282
INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)
INFO:tensorflow:global_step/sec: 118.386
INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)
INFO:tensorflow:global_step/sec: 110.542
INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)
INFO:tensorflow:global_step/sec: 199.03
INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)
INFO:tensorflow:global_step/sec: 167.488
INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)
INFO:tensorflow:global_step/sec: 220.155
INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)
INFO:tensorflow:global_step/sec: 199.016
INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)
INFO:tensorflow:global_step/sec: 197.531
INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)
INFO:tensorflow:global_step/sec: 208.479
INFO: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.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181f223630>

Σημειώστε ότι η απώλεια μειώθηκε στη συνέχεια κατά τα τελευταία 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:22
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000
INFO: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:23
INFO: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 επιστρέφει όλες τις μετρήσεις που μάθατε στο θεωρητικό μέρος. Χωρίς έκπληξη, η ακρίβεια είναι μεγάλη λόγω της μη ισορροπημένης ετικέτας. Στην πραγματικότητα, το μοντέλο αποδίδει ελαφρώς καλύτερα από μια τυχαία εικασία. Φανταστείτε το μοντέλο να προβλέπει όλα τα νοικοκυριά με εισόδημα μικρότερο από 50 χιλιάδες, τότε το μοντέλο έχει ακρίβεια 70 τοις εκατό. Σε μια πιο προσεκτική ανάλυση, μπορείτε να δείτε ότι η πρόβλεψη και η ανάκληση είναι αρκετά χαμηλές.

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

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

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

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

Πολυώνυμος όρος

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

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

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

Τώρα, κοιτάξτε την αριστερή εικόνα από την παρακάτω εικόνα, προσθέσαμε πέντε όρους στην παλινδρόμηση (δηλαδή y=x+x2+x3+x4+x5. Το μοντέλο αποτυπώνει τώρα πολύ καλύτερα το μοτίβο. Αυτή είναι η δύναμη της πολυωνυμικής παλινδρόμησης.

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

Ας επιστρέψουμε στο παράδειγμά μας. Η ηλικία δεν είναι σε γραμμική σχέση με το εισόδημα. Η πρώιμη ηλικία μπορεί να έχει σταθερό εισόδημα κοντά στο μηδέν, επειδή τα παιδιά ή οι νέοι δεν εργάζονται. Στη συνέχεια αυξάνεται σε ηλικία εργασίας και μειώνεται κατά τη συνταξιοδότηση. Είναι τυπικά ένα σχήμα Αντεστραμμένο-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) για να τετραγωνίσετε τη μεταβλητή ηλικία. Σημειώστε ότι η νέα μεταβλητή ονομάζεται "new"

Τώρα που έχει γραφτεί η συνάρτηση 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': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x1820f04b70>, '_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 = 1
INFO:tensorflow:global_step/sec: 81.487
INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)
INFO:tensorflow:global_step/sec: 111.169
INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)
INFO:tensorflow:global_step/sec: 128.91
INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)
INFO:tensorflow:global_step/sec: 132.546
INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)
INFO:tensorflow:global_step/sec: 162.194
INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)
INFO:tensorflow:global_step/sec: 204.852
INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)
INFO:tensorflow:global_step/sec: 188.923
INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)
INFO:tensorflow:global_step/sec: 192.041
INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)
INFO:tensorflow:global_step/sec: 197.025
INFO: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.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1820f04c88>
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:37
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000
INFO: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:39
INFO: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. Ας δούμε αν μπορείτε να τα καταφέρετε καλύτερα συνδυάζοντας τον όρο bucketization και αλληλεπίδρασης μαζί.

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

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

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

Στο 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)]

Για να δημιουργήσετε μια στήλη σταυροειδών χαρακτηριστικών, χρησιμοποιείτε crossed_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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1823021be0>, '_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 = 1
INFO:tensorflow:global_step/sec: 94.969
INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)
INFO:tensorflow:global_step/sec: 242.342
INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)
INFO:tensorflow:global_step/sec: 213.686
INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)
INFO:tensorflow:global_step/sec: 174.084
INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 191.78
INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)
INFO:tensorflow:global_step/sec: 163.436
INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)
INFO:tensorflow:global_step/sec: 164.347
INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)
INFO:tensorflow:global_step/sec: 154.274
INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)
INFO:tensorflow:global_step/sec: 189.14
INFO: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.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1823021cf8>
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:52
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000
INFO: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:54
INFO: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

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

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

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

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

  • Λ1: Λάσο
  • L2: Κορυφογραμμή

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

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

Σημείωση ότι αν αλλάξετε την υπερπαράμετρο, πρέπει να διαγράψετε τον φάκελο ongoing/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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820d9c128>, '_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 = 1
INFO:tensorflow:global_step/sec: 77.4165
INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)
INFO:tensorflow:global_step/sec: 187.889
INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)
INFO:tensorflow:global_step/sec: 201.895
INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)
INFO:tensorflow:global_step/sec: 217.992
INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)
INFO:tensorflow:global_step/sec: 193.676
INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)
INFO:tensorflow:global_step/sec: 202.195
INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)
INFO:tensorflow:global_step/sec: 216.756
INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)
INFO:tensorflow:global_step/sec: 240.215
INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)
INFO:tensorflow:global_step/sec: 220.336
INFO: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.


<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181ff39e48>
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:07
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000
INFO: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:09
INFO: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()

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

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

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