Gaussian Kernel in Machine Learning: Παραδείγματα μεθόδων πυρήνα

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

Anonim

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

  1. Μετασχηματισμός χαρακτηριστικών
  2. Εκπαιδεύστε έναν ταξινομητή πυρήνα με Tensorflow

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

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

  • Γιατί χρειάζεστε μεθόδους πυρήνα;
  • Τι είναι ο πυρήνας στη μηχανική μάθηση;
  • Τύποι μεθόδων πυρήνα
  • Εκπαιδεύστε τον ταξινομητή Gaussian Kernel με το TensorFlow

Γιατί χρειάζεστε μεθόδους πυρήνα;

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

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D 
x_lin = np.array([1,2,3,4,5,6,7,8,9,10])y_lin = np.array([2,2,3,2,2,9,6,8,8,9])label_lin = np.array([0,0,0,0,0,1,1,1,1,1])fig = plt.figure()ax=fig.add_subplot(111)plt.scatter(x_lin, y_lin, c=label_lin, s=60)plt.plot([-2.5, 10], [12.5, -2.5], 'k-', lw=2)ax.set_xlim([-5,15])ax.set_ylim([-5,15])plt.show() 

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

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

x = np.array([1,1,2,3,3,6,6,6,9,9,10,11,12,13,16,18])y = np.array([18,13,9,6,15,11,6,3,5,2,10,5,6,1,3,1])label = np.array([1,1,1,1,0,0,0,1,0,1,0,0,0,1,0,1]) 
fig = plt.figure()plt.scatter(x, y, c=label, s=60)plt.show() 

Τα δεδομένα από την παραπάνω εικόνα βρίσκονται σε σχέδιο 2D Gaussian Kernel που δεν είναι διαχωρίσιμο. Μπορείτε να προσπαθήσετε να μετατρέψετε αυτά τα δεδομένα σε μια τρισδιάστατη διάσταση, αυτό σημαίνει ότι δημιουργείτε ένα σχήμα με 3 άξονες.

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

Ορίζετε μια συνάρτηση στο Gaussian Kernel Python για να δημιουργήσετε τους νέους χάρτες χαρακτηριστικών

Μπορείτε να χρησιμοποιήσετε το numpy για να κωδικοποιήσετε τον παραπάνω τύπο:

Τύπος Ισοδύναμος Numpy Code
Χ x [:, 0] **
γ x [:, 1]
x 2 x [:, 0] ** 2
np.sqrt (2) *
xy x [:, 0] * x [:, 1]
y 2 x [:, 1] ** 2
### illustration purposedef mapping(x, y):x = np.c_[(x, y)]if len(x) > 2:x_1 = x[:,0]**2x_2 = np.sqrt(2)*x[:,0]*x[:,1]x_3 = x[:,1]**2else:x_1 = x[0]**2x_2 = np.sqrt(2)*x[0]*x[1]x_3 = x[1]**2trans_x = np.array([x_1, x_2, x_3])return trans_x

Η νέα χαρτογράφηση θα πρέπει να έχει 3 διαστάσεις με 16 σημεία

x_1 = mapping(x, y)x_1.shape 
(3, 16) 

Ας κάνουμε μια νέα γραφική παράσταση με 3 άξονες, x, y και z αντίστοιχα.

# plotfig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(x_1[0], x_1[1], x_1[2], c=label, s=60)ax.view_init(30, 185)ax.set_xlabel('X Label')ax.set_ylabel('Y Label')ax.set_zlabel('Z Label')plt.show() 

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

# plotfig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(x_1[0], x_1[1], x_1[1], c=label, s=60)ax.view_init(0, -180)ax.set_ylim([150,-50])ax.set_zlim([-10000,10000])ax.set_xlabel('X Label')ax.set_ylabel('Y Label')ax.set_zlabel('Z Label')plt.show() 

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

Ο πιο συνηθισμένος τρόπος για να ξεπεραστεί αυτό το ζήτημα είναι να χρησιμοποιήσετε έναν πυρήνα .

Τι είναι ο πυρήνας στη μηχανική μάθηση;

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

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

Έχουμε επίσης δείξει ότι με πολλά δεδομένα, αυτός ο μετασχηματισμός δεν είναι αποτελεσματικός. Αντ 'αυτού, μπορείτε να χρησιμοποιήσετε μια λειτουργία πυρήνα στο Machine Learning για να τροποποιήσετε τα δεδομένα χωρίς να αλλάξετε σε ένα νέο σχέδιο δυνατοτήτων.

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

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

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

  1. Μεταμορφώστε τα x1 και x2 σε μια νέα διάσταση
  2. Υπολογίστε το προϊόν κουκκίδων: κοινό σε όλους τους πυρήνες
  3. Μεταμορφώστε τα x1 και x2 σε μια νέα διάσταση

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

## Kernelx1 = np.array([3,6])x2 = np.array([10,10])x_1 = mapping(x1, x2)print(x_1) 

Παραγωγή

[[ 9. 100. ][ 25.45584412 141.42135624][ 36. 100. ]] 

Υπολογίστε το προϊόν κουκκίδων

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

print(np.dot(x_1[:,0], x_1[:,1]))8100.0 

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

Αντ 'αυτού, μπορείτε να χρησιμοποιήσετε τον πολυωνυμικό πυρήνα για τον υπολογισμό του προϊόντος κουκίδων χωρίς να μεταμορφώσετε το διάνυσμα. Αυτή η συνάρτηση υπολογίζει το προϊόν κουκκίδων των x1 και x2 σαν αυτά τα δύο διανύσματα να έχουν μετατραπεί στην υψηλότερη διάσταση. Με διαφορετικό τρόπο, μια λειτουργία πυρήνα υπολογίζει τα αποτελέσματα του προϊόντος κουκκίδων από έναν άλλο χώρο χαρακτηριστικών.

Μπορείτε να γράψετε τη συνάρτηση πολυωνύμου πυρήνα στο Python ως εξής.

def polynomial_kernel(x, y, p=2):return (np.dot(x, y)) ** p 

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

polynomial_kernel(x1, x2, p=2)8100 

Τύποι μεθόδων πυρήνα

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

  • Πολυωνυμικός πυρήνας
  • Gaussian πυρήνας

Στο παράδειγμα με το TensorFlow, θα χρησιμοποιήσουμε το Random Fourier. Το TensorFlow έχει ενσωματωμένο εκτιμητή για τον υπολογισμό του νέου χώρου δυνατοτήτων. Η συνάρτηση φίλτρου Gauss είναι μια προσέγγιση της συνάρτησης Gaussian πυρήνα.

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

Εκπαιδεύστε τον ταξινομητή Gaussian Kernel με το TensorFlow

Ο στόχος του αλγορίθμου είναι να ταξινομήσει το νοικοκυριό που κερδίζει περισσότερο ή λιγότερο από 50k.

Θα αξιολογήσετε ένα λογιστικό Kernel Regression Machine Learning για να έχετε ένα μοντέλο αναφοράς. Μετά από αυτό, θα εκπαιδεύσετε έναν ταξινομητή πυρήνα για να δείτε εάν μπορείτε να έχετε καλύτερα αποτελέσματα.

Χρησιμοποιείτε τις ακόλουθες μεταβλητές από το σύνολο δεδομένων για ενηλίκους:

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

Θα προχωρήσετε ως εξής προτού εκπαιδεύσετε και αξιολογήσετε το μοντέλο:

  • Βήμα 1) Εισαγάγετε τις βιβλιοθήκες
  • Βήμα 2) Εισαγάγετε τα δεδομένα
  • Βήμα 3) Προετοιμάστε τα δεδομένα
  • Βήμα 4) Κατασκευάστε το input_fn
  • Βήμα 5) Κατασκευάστε το λογιστικό μοντέλο: Βασικό μοντέλο
  • Βήμα 6) Αξιολογήστε το μοντέλο
  • Βήμα 7) Κατασκευάστε τον ταξινομητή πυρήνα
  • Βήμα 8) Αξιολογήστε τον ταξινομητή πυρήνα

Βήμα 1) Εισαγάγετε τις βιβλιοθήκες

Για να εισαγάγετε και να εκπαιδεύσετε μοντέλα πυρήνα στην Τεχνητή Νοημοσύνη, πρέπει να εισαγάγετε ροή tensorflow, pandas και numpy

#import numpy as npfrom sklearn.model_selectionimport train_test_splitimport tensorflow as tfimport pandas as pdimport numpy as np

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

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

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

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

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]df_train.shape(32561, 15)

Βήμα 3) Προετοιμάστε τα δεδομένα

Το σύνολο δεδομένων περιέχει τόσο συνεχή όσο και κατηγορηματικά χαρακτηριστικά. Μια καλή πρακτική είναι να τυποποιήσετε τις τιμές των συνεχών μεταβλητών. Μπορείτε να χρησιμοποιήσετε τη λειτουργία StandardScaler από το sci-kit learning. Δημιουργείτε επίσης μια λειτουργία που καθορίζεται από το χρήστη, για να διευκολύνετε τη μετατροπή του τρένου και του σετ δοκιμών. Σημειώστε ότι, συνδυάζετε τις συνεχείς και κατηγορηματικές μεταβλητές σε ένα κοινό σύνολο δεδομένων και ο πίνακας πρέπει να είναι του τύπου: float32

COLUMNS_INT = ['age','fnlwgt','education_num','capital_gain', 'capital_loss', 'hours_week']CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']from sklearn.preprocessing import StandardScalerfrom sklearn import preprocessingdef prep_data_str(df):scaler = StandardScaler()le = preprocessing.LabelEncoder()df_toscale = df[COLUMNS_INT]df_scaled = scaler.fit_transform(df_toscale.astype(np.float64))X_1 = df[CATE_FEATURES].apply(le.fit_transform)y = df['label'].astype(np.int32)X_conc = np.c_[df_scaled, X_1].astype(np.float32)return X_conc, y 

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

X_train, y_train = prep_data_str(df_train)X_test, y_test = prep_data_str(df_test)print(X_train.shape)(32561, 14) 

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

Βήμα 4) Κατασκευάστε το λογιστικό μοντέλο: Βασικό μοντέλο

Κατασκευάζετε τη στήλη χαρακτηριστικών με το αντικείμενο real_valued_column. Θα διασφαλίσει ότι όλες οι μεταβλητές είναι πυκνά αριθμητικά δεδομένα.

feat_column = tf.contrib.layers.real_valued_column('features', dimension=14) 

Ο εκτιμητής ορίζεται χρησιμοποιώντας τον Εκτιμητή TensorFlow, καθοδηγείτε τις στήλες χαρακτηριστικών και πού να αποθηκεύσετε το γράφημα.

estimator = tf.estimator.LinearClassifier(feature_columns=[feat_column],n_classes=2,model_dir = "kernel_log")
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'kernel_log', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} 

Θα εκπαιδεύσετε την παλινδρόμηση logisitc χρησιμοποιώντας μίνι παρτίδες μεγέθους 200.

# Train the modeltrain_input_fn = tf.estimator.inputs.numpy_input_fn(x={"features": X_train},y=y_train,batch_size=200,num_epochs=None,shuffle=True) 

Μπορείτε να εκπαιδεύσετε το μοντέλο με 1.000 επαναλήψεις

estimator.train(input_fn=train_input_fn, 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 kernel_log/model.ckpt.INFO:tensorflow:loss = 138.62949, step = 1INFO:tensorflow:global_step/sec: 324.16INFO:tensorflow:loss = 87.16762, step = 101 (0.310 sec)INFO:tensorflow:global_step/sec: 267.092INFO:tensorflow:loss = 71.53657, step = 201 (0.376 sec)INFO:tensorflow:global_step/sec: 292.679INFO:tensorflow:loss = 69.56703, step = 301 (0.340 sec)INFO:tensorflow:global_step/sec: 225.582INFO:tensorflow:loss = 74.615875, step = 401 (0.445 sec)INFO:tensorflow:global_step/sec: 209.975INFO:tensorflow:loss = 76.49044, step = 501 (0.475 sec)INFO:tensorflow:global_step/sec: 241.648INFO:tensorflow:loss = 66.38373, step = 601 (0.419 sec)INFO:tensorflow:global_step/sec: 305.193INFO:tensorflow:loss = 87.93341, step = 701 (0.327 sec)INFO:tensorflow:global_step/sec: 396.295INFO:tensorflow:loss = 76.61518, step = 801 (0.249 sec)INFO:tensorflow:global_step/sec: 359.857INFO:tensorflow:loss = 78.54885, step = 901 (0.277 sec)INFO:tensorflow:Saving checkpoints for 1000 into kernel_log/model.ckpt.INFO:tensorflow:Loss for final step: 67.79706.

Βήμα 6) Αξιολογήστε το μοντέλο

Ορίζετε το numpy εκτιμητή για να αξιολογήσετε το μοντέλο. Χρησιμοποιείτε ολόκληρο το σύνολο δεδομένων για αξιολόγηση

# Evaluationtest_input_fn = tf.estimator.inputs.numpy_input_fn(x={"features": X_test},y=y_test,batch_size=16281,num_epochs=1,shuffle=False)estimator.evaluate(input_fn=test_input_fn, steps=1)
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-07-12-15:58:22INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from kernel_log/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [1/1]INFO:tensorflow:Finished evaluation at 2018-07-12-15:58:23INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.82353663, accuracy_baseline = 0.76377374, auc = 0.84898686, auc_precision_recall = 0.67214864, average_loss = 0.3877216, global_step = 1000, label/mean = 0.23622628, loss = 6312.495, precision = 0.7362797, prediction/mean = 0.21208474, recall = 0.39417577
{'accuracy': 0.82353663,'accuracy_baseline': 0.76377374,'auc': 0.84898686,'auc_precision_recall': 0.67214864,'average_loss': 0.3877216,'global_step': 1000,'label/mean': 0.23622628,'loss': 6312.495,'precision': 0.7362797,'prediction/mean': 0.21208474,'recall': 0.39417577}

Έχετε ακρίβεια 82%. Στην επόμενη ενότητα, θα προσπαθήσετε να νικήσετε τον ταξινομητή λογιστικής με έναν ταξινομητή πυρήνα

Βήμα 7) Κατασκευάστε τον ταξινομητή πυρήνα

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

Χρειάζεστε δύο προκαθορισμένους εκτιμητές που διατίθενται στο TensorFlow για να εκπαιδεύσετε τον Kernel Classifier:

  • RandomFourierFeatureMapper
  • KernelLinearClassifier

Μάθατε στην πρώτη ενότητα ότι πρέπει να μετατρέψετε τη χαμηλή διάσταση σε υψηλή διάσταση χρησιμοποιώντας μια λειτουργία πυρήνα. Πιο συγκεκριμένα, θα χρησιμοποιήσετε το Random Fourier, το οποίο είναι μια προσέγγιση της συνάρτησης Gauss. Ευτυχώς, το Tensorflow έχει τη λειτουργία στη βιβλιοθήκη του: RandomFourierFeatureMapper. Το μοντέλο μπορεί να εκπαιδευτεί χρησιμοποιώντας τον εκτιμητή KernelLinearClassifier.

Για να δημιουργήσετε το μοντέλο, θα ακολουθήσετε αυτά τα βήματα:

  1. Ορίστε τη λειτουργία πυρήνα υψηλής διάστασης
  2. Ρυθμίστε την υπερπαραμετρο L2
  3. Δημιουργήστε το μοντέλο
  4. Εκπαιδεύστε το μοντέλο
  5. Αξιολογήστε το μοντέλο

Βήμα Α) Ορίστε τη λειτουργία πυρήνα υψηλής διάστασης

Το τρέχον σύνολο δεδομένων περιέχει 14 δυνατότητες που θα μετατρέψετε σε μια νέα υψηλή διάσταση του διανύσματος 5.000 διαστάσεων. Χρησιμοποιείτε τα τυχαία χαρακτηριστικά Fourier για να επιτύχετε τον μετασχηματισμό. Εάν θυμάστε τον τύπο πυρήνα Gaussian, έχετε υπόψη σας ότι υπάρχει η παράμετρος τυπικής απόκλισης που πρέπει να οριστεί. Αυτή η παράμετρος ελέγχει για το μέτρο ομοιότητας που χρησιμοποιείται κατά την ταξινόμηση.

Μπορείτε να συντονίσετε όλες τις παραμέτρους στο RandomFourierFeatureMapper με:

  • input_dim = 14
  • έξοδος_dim = 5000
  • stddev = 4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm') 

Πρέπει να κατασκευάσετε τον χαρτογράφο πυρήνα χρησιμοποιώντας τις στήλες χαρακτηριστικών που δημιουργήθηκαν πριν: feat_column

### Map Kernelkernel_mappers = {feat_column: [kernel_mapper]} 

Βήμα Β) Ρυθμίστε την υπερπαραμετρο L2

Για να αποφύγετε την υπερβολική τοποθέτηση, τιμωρείτε τη λειτουργία απώλειας με τον κανονικοποιητή L2. Ορίζετε την υπερπαραμέτρα L2 σε 0,1 και το ποσοστό εκμάθησης σε 5

optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1) 

Βήμα Γ) Δημιουργήστε το μοντέλο

Το επόμενο βήμα είναι παρόμοιο με τη γραμμική ταξινόμηση. Χρησιμοποιείτε τον ενσωματωμένο εκτιμητή KernelLinearClassifier. Σημειώστε ότι προσθέτετε το mapper του πυρήνα που ορίστηκε προηγουμένως και ότι αλλάξατε τον κατάλογο μοντέλων.

### Prep estimatorestimator_kernel = tf.contrib.kernel_methods.KernelLinearClassifier(n_classes=2,optimizer=optimizer,kernel_mappers=kernel_mappers,model_dir="kernel_train")
WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/kernel_methods/python/kernel_estimators.py:305: multi_class_head (from tensorflow.contrib.learn.python.learn.estimators.head) is deprecated and will be removed in a future version.Instructions for updating:Please switch to tf.contrib.estimator.*_head.WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:1179: BaseEstimator.__init__ (from tensorflow.contrib.learn.python.learn.estimators.estimator) is deprecated and will be removed in a future version.Instructions for updating:Please replace uses of any Estimator from tf.contrib.learn with an Estimator from tf.estimator.*WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:427: RunConfig.__init__ (from tensorflow.contrib.learn.python.learn.estimators.run_config) is deprecated and will be removed in a future version.Instructions for updating:When switching to tf.estimator.Estimator, use tf.estimator.RunConfig instead.INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': , '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'local', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_tf_config': gpu_options {per_process_gpu_memory_fraction: 1.0}, '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': 'kernel_train'}

Βήμα Δ) Εκπαιδεύστε το μοντέλο

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

### estimateestimator_kernel.fit(input_fn=train_input_fn, steps=2000)
WARNING:tensorflow:Casting 
 labels to bool.WARNING:tensorflow:Casting 
 labels to bool.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.WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/head.py:678: ModelFnOps.__new__ (from tensorflow.contrib.learn.python.learn.estimators.model_fn) is deprecated and will be removed in a future version.Instructions for updating:When switching to tf.estimator.Estimator, use tf.estimator.EstimatorSpec. You can use the `estimator_spec` method to create an equivalent one.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 kernel_train/model.ckpt.INFO:tensorflow:loss = 0.6931474, step = 1INFO:tensorflow:global_step/sec: 86.6365INFO:tensorflow:loss = 0.39374447, step = 101 (1.155 sec)INFO:tensorflow:global_step/sec: 80.1986INFO:tensorflow:loss = 0.3797774, step = 201 (1.247 sec)INFO:tensorflow:global_step/sec: 79.6376INFO:tensorflow:loss = 0.3908726, step = 301 (1.256 sec)INFO:tensorflow:global_step/sec: 95.8442INFO:tensorflow:loss = 0.41890752, step = 401 (1.043 sec)INFO:tensorflow:global_step/sec: 93.7799INFO:tensorflow:loss = 0.35700393, step = 501 (1.066 sec)INFO:tensorflow:global_step/sec: 94.7071INFO:tensorflow:loss = 0.35535482, step = 601 (1.056 sec)INFO:tensorflow:global_step/sec: 90.7402INFO:tensorflow:loss = 0.3692882, step = 701 (1.102 sec)INFO:tensorflow:global_step/sec: 94.4924INFO:tensorflow:loss = 0.34746957, step = 801 (1.058 sec)INFO:tensorflow:global_step/sec: 95.3472INFO:tensorflow:loss = 0.33655524, step = 901 (1.049 sec)INFO:tensorflow:global_step/sec: 97.2928INFO:tensorflow:loss = 0.35966292, step = 1001 (1.028 sec)INFO:tensorflow:global_step/sec: 85.6761INFO:tensorflow:loss = 0.31254214, step = 1101 (1.167 sec)INFO:tensorflow:global_step/sec: 91.4194INFO:tensorflow:loss = 0.33247527, step = 1201 (1.094 sec)INFO:tensorflow:global_step/sec: 82.5954INFO:tensorflow:loss = 0.29305756, step = 1301 (1.211 sec)INFO:tensorflow:global_step/sec: 89.8748INFO:tensorflow:loss = 0.37943482, step = 1401 (1.113 sec)INFO:tensorflow:global_step/sec: 76.9761INFO:tensorflow:loss = 0.34204718, step = 1501 (1.300 sec)INFO:tensorflow:global_step/sec: 73.7192INFO:tensorflow:loss = 0.34614792, step = 1601 (1.356 sec)INFO:tensorflow:global_step/sec: 83.0573INFO:tensorflow:loss = 0.38911164, step = 1701 (1.204 sec)INFO:tensorflow:global_step/sec: 71.7029INFO:tensorflow:loss = 0.35255936, step = 1801 (1.394 sec)INFO:tensorflow:global_step/sec: 73.2663INFO:tensorflow:loss = 0.31130585, step = 1901 (1.365 sec)INFO:tensorflow:Saving checkpoints for 2000 into kernel_train/model.ckpt.INFO:tensorflow:Loss for final step: 0.37795097.KernelLinearClassifier(params={'head': , 'feature_columns': {_RealValuedColumn(column_name='features_MAPPED', dimension=5000, default_value=None, dtype=tf.float32, normalizer=None)}, 'optimizer': , 'kernel_mappers': {_RealValuedColumn(column_name='features', dimension=14, default_value=None, dtype=tf.float32, normalizer=None): []}}) 

Βήμα Ε) Αξιολογήστε το μοντέλο

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

# Evaluate and report metrics.eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)
WARNING:tensorflow:Casting 
 labels to bool.WARNING:tensorflow:Casting 
 labels to bool.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:Starting evaluation at 2018-07-12-15:58:50INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from kernel_train/model.ckpt-2000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Evaluation [1/1]INFO:tensorflow:Finished evaluation at 2018-07-12-15:58:51INFO:tensorflow:Saving dict for global step 2000: accuracy = 0.83975184, accuracy/baseline_label_mean = 0.23622628, accuracy/threshold_0.500000_mean = 0.83975184, auc = 0.8904007, auc_precision_recall = 0.72722375, global_step = 2000, labels/actual_label_mean = 0.23622628, labels/prediction_mean = 0.23786618, loss = 0.34277728, precision/positive_threshold_0.500000_mean = 0.73001117, recall/positive_threshold_0.500000_mean = 0.5104004

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

Περίληψη

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

Παρακάτω, μπορείτε να βρείτε τον πιο σημαντικό κώδικα για την εκπαίδευση ενός ταξινομητή πυρήνα

Ορίστε τη λειτουργία πυρήνα υψηλής διάστασης

  • input_dim = 14
  • έξοδος_dim = 5000
  • stddev = 4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm') 

Ρυθμίστε την υπερπαραμετρο L2

optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1) 

Δημιουργήστε το μοντέλο

estimator_kernel = tf.contrib.kernel_methods.KernelLinearClassifier( n_classes=2,optimizer=optimizer,kernel_mappers=kernel_mappers,model_dir="kernel_train") 

Εκπαιδεύστε το μοντέλο

estimator_kernel.fit(input_fn=train_input_fn, steps=2000) 

Αξιολογήστε το μοντέλο

eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)