Δυαδική ταξινόμηση TensorFlow: Παράδειγμα γραμμικού ταξινομητή
Τα δύο πιο κοινά εποπτευόμενη μάθηση Οι εργασίες είναι γραμμική παλινδρόμηση και γραμμικός ταξινομητής. Η γραμμική παλινδρόμηση προβλέπει μια τιμή ενώ ο γραμμικός ταξινομητής προβλέπει μια κλάση. Αυτό το σεμινάριο επικεντρώνεται στους Γραμμικούς ταξινομητές.
Τι είναι ο Γραμμικός Ταξινομητής;
A Γραμμικός ταξινομητής στη Μηχανική Μάθηση είναι μια μέθοδος για την εύρεση της κλάσης ενός αντικειμένου με βάση τα χαρακτηριστικά του για στατιστική ταξινόμηση. Παίρνει απόφαση ταξινόμησης με βάση την τιμή ενός γραμμικού συνδυασμού χαρακτηριστικών ενός αντικειμένου. Ο γραμμικός ταξινομητής χρησιμοποιείται σε πρακτικά προβλήματα όπως η ταξινόμηση εγγράφων και προβλήματα που έχουν πολλές μεταβλητές.
Τα προβλήματα ταξινόμησης αντιπροσωπεύουν περίπου το 80 τοις εκατό της εργασίας μηχανικής εκμάθησης. Η ταξινόμηση στοχεύει στην πρόβλεψη της πιθανότητας κάθε τάξης δεδομένου ενός συνόλου εισροών. Η ετικέτα (δηλαδή η εξαρτημένη μεταβλητή) είναι μια διακριτή τιμή, που ονομάζεται κλάση.
- Εάν η ετικέτα έχει μόνο δύο κλάσεις, ο αλγόριθμος εκμάθησης είναι ένας δυαδικός ταξινομητής.
- Ο ταξινομητής πολλαπλών κλάσεων αντιμετωπίζει ετικέτες με περισσότερες από δύο κατηγορίες.
Για παράδειγμα, ένα τυπικό πρόβλημα δυαδικής ταξινόμησης είναι η πρόβλεψη της πιθανότητας ο πελάτης να κάνει μια δεύτερη αγορά. Η πρόβλεψη του είδους του ζώου που εμφανίζεται σε μια εικόνα είναι πρόβλημα ταξινόμησης πολλών κατηγοριών, καθώς υπάρχουν περισσότερες από δύο ποικιλίες ζώων.
Το θεωρητικό μέρος αυτού του σεμιναρίου εστιάζει πρωταρχικά στη δυαδική τάξη. Θα μάθετε περισσότερα για τη λειτουργία εξόδου πολλαπλών κλάσεων σε μελλοντικό σεμινάριο.
Πώς λειτουργεί ο δυαδικός ταξινομητής;
Μάθατε στο προηγούμενο σεμινάριο ότι μια συνάρτηση αποτελείται από δύο είδη μεταβλητών, μια εξαρτημένη μεταβλητή και ένα σύνολο χαρακτηριστικών (ανεξάρτητες μεταβλητές). Στη γραμμική παλινδρόμηση, μια εξαρτημένη μεταβλητή είναι ένας πραγματικός αριθμός χωρίς εύρος. Ο πρωταρχικός στόχος είναι να προβλέψουμε την τιμή του ελαχιστοποιώντας το μέσο τετράγωνο σφάλμα.
Για τον δυαδικό ταξινομητή TensorFlow, η ετικέτα μπορεί να είχε δύο πιθανές ακέραιες τιμές. Στις περισσότερες περιπτώσεις, είναι είτε [0,1] είτε [1,2]. Για παράδειγμα, ο στόχος είναι να προβλέψουμε εάν ένας πελάτης θα αγοράσει ένα προϊόν ή όχι. Η ετικέτα ορίζεται ως εξής:
- Y = 1 (ο πελάτης αγόρασε το προϊόν)
- Y = 0 (ο πελάτης δεν αγοράζει το προϊόν)
Το μοντέλο χρησιμοποιεί τα χαρακτηριστικά X για να ταξινομήσει κάθε πελάτη στην πιο πιθανή κατηγορία στην οποία ανήκει, δηλαδή σε δυνητικό αγοραστή ή όχι.
Η πιθανότητα επιτυχίας υπολογίζεται με λογική παλινδρόμηση. Ο αλγόριθμος θα υπολογίσει μια πιθανότητα με βάση το χαρακτηριστικό X και προβλέπει μια επιτυχία όταν αυτή η πιθανότητα είναι πάνω από 50 τοις εκατό. Πιο τυπικά, η πιθανότητα υπολογίζεται όπως φαίνεται στο παρακάτω παράδειγμα δυαδικής ταξινόμησης TensorFlow:
όπου 0 είναι το σύνολο των βαρών, των χαρακτηριστικών και b η προκατάληψη.
Η συνάρτηση μπορεί να χωριστεί σε δύο μέρη:
- Το γραμμικό μοντέλο
- Η υλικοτεχνική λειτουργία
Γραμμικό μοντέλο
Είστε ήδη εξοικειωμένοι με τον τρόπο υπολογισμού των βαρών. Τα βάρη υπολογίζονται χρησιμοποιώντας ένα γινόμενο κουκίδων: Το Y είναι μια γραμμική συνάρτηση όλων των χαρακτηριστικών xi. Εάν το μοντέλο δεν έχει χαρακτηριστικά, η πρόβλεψη είναι ίση με την προκατάληψη, β.
Τα βάρη δείχνουν την κατεύθυνση της συσχέτισης μεταξύ των χαρακτηριστικών xi και η ετικέτα y. Μια θετική συσχέτιση αυξάνει την πιθανότητα της θετικής τάξης ενώ μια αρνητική συσχέτιση οδηγεί την πιθανότητα πιο κοντά στο 0, (δηλαδή, αρνητική τάξη).
Το γραμμικό μοντέλο επιστρέφει μόνο πραγματικό αριθμό, ο οποίος δεν συνάδει με το μέτρο πιθανότητας του εύρους [0,1]. Η λογιστική συνάρτηση απαιτείται για τη μετατροπή της εξόδου του γραμμικού μοντέλου σε πιθανότητα,
Λειτουργία Logistic
Η λογιστική συνάρτηση ή η σιγμοειδής συνάρτηση έχει σχήμα S και η έξοδος αυτής της συνάρτησης είναι πάντα μεταξύ 0 και 1.
Είναι εύκολο να αντικατασταθεί η έξοδος της γραμμικής παλινδρόμησης στη σιγμοειδή συνάρτηση. Προκύπτει ένας νέος αριθμός με πιθανότητα μεταξύ 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 υψηλού επιπέδου για έναν ταξινομητή γραμμικής παλινδρόμησης. Πρέπει να ορίσετε:
- Στήλες χαρακτηριστικών. Εάν είναι συνεχές: tf.feature_column.numeric_column(). Μπορείτε να συμπληρώσετε μια λίστα με κατανόηση λίστας python
- Ο εκτιμητής: tf.estimator.LinearClassifier(feature_columns, model_dir, n_classes = 2)
- Μια συνάρτηση για την εισαγωγή των δεδομένων, το μέγεθος παρτίδας και την εποχή: input_fn()
Μετά από αυτό, είστε έτοιμοι να εκπαιδεύσετε, να αξιολογήσετε και να κάνετε μια πρόβλεψη με την train(), την αξιολόγηση() και την πρόβλεψη()
Για να βελτιώσετε την απόδοση του μοντέλου, μπορείτε:
- Χρησιμοποιήστε πολυωνυμική παλινδρόμηση
- Όρος αλληλεπίδρασης: tf.feature_column.crossed_column
- Προσθήκη παραμέτρου κανονικοποίησης