Gaußscher Kernel im maschinellen Lernen: Python Kernel-Methoden

Der Zweck dieses Tutorials besteht darin, einen Datensatz linear trennbar zu machen. Das Tutorial ist in zwei Teile gegliedert:

  1. Feature-Transformation
  2. Trainieren Sie einen Kernel-Klassifikator mit Tensorflow

Im ersten Teil werden Sie die Idee hinter einer Kernel-Methode im maschinellen Lernen verstehen, während Sie im zweiten Teil sehen, wie Sie einen Kernel-Klassifikator mit Tensorflow trainieren. Sie werden den Datensatz für Erwachsene verwenden. Das Ziel dieses Datensatzes besteht darin, die Einnahmen unter und über 50 zu klassifizieren und dabei das Verhalten jedes Haushalts zu kennen.

Warum brauchen Sie Kernel-Methoden?

Das Ziel jedes Klassifikators ist es, die Klassen korrekt vorherzusagen. Dazu sollte der Datensatz trennbar sein. Schauen Sie sich die Handlung unten an; Es ist ziemlich einfach zu erkennen, dass alle Punkte oberhalb der schwarzen Linie zur ersten Klasse und die anderen Punkte zur zweiten Klasse gehören. Es kommt jedoch äußerst selten vor, dass ein Datensatz so einfach ist. In den meisten Fällen sind die Daten nicht trennbar. Kernelmethoden im maschinellen Lernen machen naiven Klassifikatoren wie einer logistischen Regression das Leben schwer.

import numpy as np
  import matplotlib.pyplot as plt
  from 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()

Kernel-Methode

In der folgenden Abbildung stellen wir einen Datensatz dar, der nicht linear trennbar ist. Wenn wir eine gerade Linie zeichnen, werden die meisten Punkte nicht in die richtige Klasse eingeordnet.

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, den Datensatz zu nehmen und die Daten in eine andere Feature-Map umzuwandeln. Das bedeutet, dass Sie eine Funktion verwenden, um die Daten in einen anderen Plan umzuwandeln, der linear sein sollte.

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

Kernel-Methode

Die Daten aus der obigen Abbildung liegen in einem 2D-Gaußschen Kernelplan vor, der nicht trennbar ist. Sie können versuchen, diese Daten dreidimensional umzuwandeln, das heißt, Sie erstellen eine Figur mit 3 Achsen.

In unserem Gaußschen Kernel-Beispiel wenden wir eine Polynomabbildung an, um unsere Daten in eine 3D-Dimension zu bringen. Die Formel zum Transformieren der Daten lautet wie folgt.

Kernel-Methode

Sie definieren eine Funktion im Gaussian Kernel Python zur Erstellung der neuen Feature-Maps

Sie können verwenden numpig um die obige Formel zu kodieren:

Formel Äquivalenter Numpy-Code
x x[:,0]**
y x[:,1]
x2 x[:,0]**2
Kernel-Methode np.sqrt(2)*
xy x[:,0]*x[:,1]
y2 x[:,1]**2
### illustration purpose
def mapping(x, y):    
	x = np.c_[(x, y)]				
    if len(x) >	2:        
    	x_1 = x[:,0]**2        
        x_2 = np.sqrt(2)*x[:,0]*x[:,1]        
        x_3 = x[:,1]**2								
    else:            
    	x_1 = x[0]**2        
        x_2 = np.sqrt(2)*x[0]*x[1]        
        x_3 = x[1]**2			    
   trans_x = np.array([x_1, x_2, x_3])				
   return trans_x			

Die neue Zuordnung sollte dreidimensional mit 3 Punkten erfolgen

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

Lassen Sie uns ein neues Diagramm mit den drei Achsen x, y und z erstellen.

# plot
fig = 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()

Kernel-Methode

Wir sehen eine Verbesserung, aber wenn wir die Ausrichtung des Diagramms ändern, ist klar, dass der Datensatz jetzt trennbar ist

# plot
fig = 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()

Kernel-Methode

Wenn Sie einen großen Datensatz bearbeiten und möglicherweise mehr als zwei Dimensionen erstellen müssen, werden Sie bei der Verwendung der oben genannten Methode auf ein großes Problem stoßen. Tatsächlich müssen Sie alle Datenpunkte transformieren, was eindeutig nicht nachhaltig ist. Es wird ewig dauern, und Ihr Computer verfügt möglicherweise nicht mehr über genügend Arbeitsspeicher.

Der häufigste Weg, dieses Problem zu lösen, ist die Verwendung von a Kern.

Was ist ein Kernel beim maschinellen Lernen?

Die Idee besteht darin, einen höherdimensionalen Merkmalsraum zu verwenden, um die Daten nahezu linear trennbar zu machen, wie in der Abbildung oben gezeigt.

Es gibt viele höherdimensionale Räume, um die Datenpunkte trennbar zu machen. Wir haben zum Beispiel gezeigt, dass die Polynomabbildung ein guter Anfang ist.

Wir haben auch gezeigt, dass diese Transformation bei vielen Daten nicht effizient ist. Stattdessen können Sie eine Kernel-Funktion im maschinellen Lernen verwenden, um die Daten zu ändern, ohne zu einem neuen Funktionsplan wechseln zu müssen.

Die Magie des Kernels besteht darin, eine Funktion zu finden, die alle Probleme vermeidet, die die hochdimensionale Berechnung mit sich bringt. Das Ergebnis eines Kernels ist ein Skalar, oder anders gesagt, wir sind wieder im eindimensionalen Raum

Nachdem Sie diese Funktion gefunden haben, können Sie sie an den standardmäßigen linearen Klassifikator anschließen.

Sehen wir uns ein Beispiel an, um das Konzept des Kernel Machine Learning zu verstehen. Sie haben zwei Vektoren, x1 und x2. Das Ziel besteht darin, mithilfe einer Polynomabbildung eine höhere Dimension zu erzeugen. Die Ausgabe entspricht dem Skalarprodukt der neuen Feature-Map. Mit der oben beschriebenen Methode müssen Sie Folgendes tun:

  1. Verwandeln Sie x1 und x2 in eine neue Dimension
  2. Berechnen Sie das Skalarprodukt: allen Kerneln gemeinsam
  3. Verwandeln Sie x1 und x2 in eine neue Dimension

Sie können die oben erstellte Funktion verwenden, um die höhere Dimension zu berechnen.

## Kernel
x1 = np.array([3,6])
x2 = np.array([10,10])			

x_1 = mapping(x1, x2)
print(x_1)

Ausgang

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

Berechnen Sie das Skalarprodukt

Sie können das Objekt dot von numpy verwenden, um das Skalarprodukt zwischen dem ersten und zweiten Vektor zu berechnen, der in x_1 gespeichert ist.

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

Die Ausgabe ist 8100. Sie sehen das Problem, Sie müssen eine neue Feature-Map im Speicher speichern, um das Skalarprodukt zu berechnen. Wenn Sie über einen Datensatz mit Millionen von Datensätzen verfügen, ist dieser rechnerisch ineffektiv.

Stattdessen können Sie die verwenden Polynomialer Kern um das Skalarprodukt zu berechnen, ohne den Vektor zu transformieren. Diese Funktion berechnet das Skalarprodukt von x1 und x2, als ob diese beiden Vektoren in die höhere Dimension transformiert worden wären. Anders ausgedrückt: Eine Kernelfunktion berechnet die Ergebnisse des Skalarprodukts aus einem anderen Merkmalsraum.

Sie können die polynomische Kernelfunktion in Python wie folgt.

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

Es ist die Potenz des Skalarprodukts zweier Vektoren. Nachfolgend geben Sie den zweiten Grad des Polynomkerns zurück. Die Ausgabe entspricht der der anderen Methode. Das ist die Magie des Kernels.

polynomial_kernel(x1, x2, p=2)			
8100

Arten von Kernel-Methoden

Es stehen viele verschiedene Kernel-Techniken zur Verfügung. Der einfachste ist der lineare Kernel. Diese Funktion eignet sich recht gut für die Textklassifizierung. Der andere Kernel ist:

  • Polynomialer Kern
  • Gaußscher Kernel

Im Beispiel mit TensorFlow, wir werden den Zufalls-Fourier verwenden. TensorFlow verfügt über einen integrierten Schätzer zur Berechnung des neuen Funktionsraums. Die Gaußsche Filterfunktion ist eine Näherung der Gaußschen Kernelfunktion.

Arten von Kernel-Methoden

Die Gaußsche Filterfunktion berechnet die Ähnlichkeit zwischen den Datenpunkten in einem viel höherdimensionalen Raum.

Trainieren Sie den Gaußschen Kernel-Klassifikator mit TensorFlow

Das Ziel des Algorithmus besteht darin, den Haushalt zu klassifizieren, der mehr oder weniger als 50 verdient.

Sie evaluieren ein logistisches Kernel-Regression-Machine-Learning, um ein Benchmark-Modell zu erhalten. Anschließend trainieren Sie einen Kernel-Klassifikator, um zu sehen, ob Sie bessere Ergebnisse erzielen können.

Sie verwenden die folgenden Variablen aus dem Datensatz für Erwachsene:

  • Alter
  • Arbeiterklasse
  • fnlwgt
  • Ausbildung
  • education_num
  • ehelich
  • Beruf
  • Beziehung
  • Rennen
  • Sex
  • Wertzuwachs
  • Kapitalverlust
  • Stunden_Woche
  • Heimatland
  • Etikette

Bevor Sie das Modell trainieren und auswerten, gehen Sie wie folgt vor:

  • Schritt 1) ​​Importieren Sie die Bibliotheken
  • Schritt 2) ​​Importieren Sie die Daten
  • Schritt 3) Bereiten Sie die Daten vor
  • Schritt 4) Konstruieren Sie den input_fn
  • Schritt 5) Konstruieren Sie das Logistikmodell: Basismodell
  • Schritt 6) Bewerten Sie das Modell
  • Schritt 7) Konstruieren Sie den Kernel-Klassifikator
  • Schritt 8) Bewerten Sie den Kernel-Klassifikator

Schritt 1) Importieren Sie die Bibliotheken

Zum Importieren und Trainieren von Kernel-Modellen Künstliche Intelligenz, Sie müssen Tensorflow importieren, Pandas und Numpy

#import numpy as np
from sklearn.model_selection 
import train_test_split
import tensorflow as tf
import pandas as pd
import numpy as np

Schritt 2) Importieren Sie die Daten

Sie laden die Daten von folgender Website und Sie importieren es als Panda-Datenrahmen.

## 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
"## Import 			
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)

Nachdem der Zug und der Testsatz nun definiert sind, können Sie die Spaltenbezeichnung von „String“ in „Integer“ ändern. Tensorflow akzeptiert keinen Zeichenfolgenwert für die Bezeichnung.

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)			

Schritt 3) Bereiten Sie die Daten vor

Der Datensatz enthält sowohl kontinuierliche als auch kategoriale Merkmale. Eine gute Vorgehensweise besteht darin, die Werte der kontinuierlichen Variablen zu standardisieren. Sie können die Funktion StandardScaler von Sci-Kit Learn verwenden. Sie erstellen außerdem eine benutzerdefinierte Funktion, um die Konvertierung des Zug- und Testsatzes zu erleichtern. Beachten Sie, dass Sie die kontinuierlichen und kategorialen Variablen zu einem gemeinsamen Datensatz verketten und das Array vom Typ float32 sein sollte

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 StandardScaler
from sklearn import preprocessing			

def 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

Die Transformer-Funktion ist fertig, Sie können den Datensatz konvertieren und die Funktion input_fn erstellen.

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

Im nächsten Schritt trainieren Sie eine logistische Regression. Dadurch erhalten Sie eine Grundgenauigkeit. Das Ziel besteht darin, die Grundlinie mit einem anderen Algorithmus, nämlich einem Kernel-Klassifikator, zu übertreffen.

Schritt 4) Konstruieren Sie das Logistikmodell: Basismodell

Sie konstruieren die Feature-Spalte mit dem Objekt real_valued_column. Dadurch wird sichergestellt, dass es sich bei allen Variablen um dichte numerische Daten handelt.

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

Der Schätzer wird mit TensorFlow Estimator definiert, Sie geben die Feature-Spalten an und legen fest, wo das Diagramm gespeichert werden soll.

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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a2003f780>, '_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}

Sie trainieren die logistische Regression mithilfe von Mini-Batches der Größe 200.

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

Sie können das Modell mit 1.000 Iterationen trainieren

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 = 1
INFO:tensorflow:global_step/sec: 324.16
INFO:tensorflow:loss = 87.16762, step = 101 (0.310 sec)
INFO:tensorflow:global_step/sec: 267.092
INFO:tensorflow:loss = 71.53657, step = 201 (0.376 sec)
INFO:tensorflow:global_step/sec: 292.679
INFO:tensorflow:loss = 69.56703, step = 301 (0.340 sec)
INFO:tensorflow:global_step/sec: 225.582
INFO:tensorflow:loss = 74.615875, step = 401 (0.445 sec)
INFO:tensorflow:global_step/sec: 209.975
INFO:tensorflow:loss = 76.49044, step = 501 (0.475 sec)
INFO:tensorflow:global_step/sec: 241.648
INFO:tensorflow:loss = 66.38373, step = 601 (0.419 sec)
INFO:tensorflow:global_step/sec: 305.193
INFO:tensorflow:loss = 87.93341, step = 701 (0.327 sec)
INFO:tensorflow:global_step/sec: 396.295
INFO:tensorflow:loss = 76.61518, step = 801 (0.249 sec)
INFO:tensorflow:global_step/sec: 359.857
INFO: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.


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

Schritt 6) Bewerten Sie das Modell

Sie definieren den Numpy-Schätzer, um das Modell auszuwerten. Für die Auswertung nutzen Sie den gesamten Datensatz

# Evaluation
test_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:22
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from kernel_log/model.ckpt-1000
INFO: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:23
INFO: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}

Sie haben eine Genauigkeit von 82 Prozent. Im nächsten Abschnitt werden Sie versuchen, den logistischen Klassifikator mit einem Kernel-Klassifikator zu schlagen

Schritt 7) Konstruieren Sie den Kernel-Klassifikator

Der Kernel-Schätzer unterscheidet sich zumindest hinsichtlich der Konstruktion nicht wesentlich vom herkömmlichen linearen Klassifikator. Die Idee dahinter besteht darin, die Leistungsfähigkeit des expliziten Kernels mit dem linearen Klassifikator zu nutzen.

Sie benötigen zwei vordefinierte Schätzer, die in TensorFlow verfügbar sind, um den Kernel-Klassifikator zu trainieren:

  • RandomFourierFeatureMapper
  • KernelLinearClassifier

Im ersten Abschnitt haben Sie gelernt, dass Sie die niedrige Dimension mithilfe einer Kernelfunktion in eine hohe Dimension umwandeln müssen. Genauer gesagt verwenden Sie den Random Fourier, eine Näherung der Gaußschen Funktion. Glücklicherweise hat Tensorflow die Funktion in seiner Bibliothek: RandomFourierFeatureMapper. Das Modell kann mit dem Schätzer KernelLinearClassifier trainiert werden.

Um das Modell zu erstellen, führen Sie die folgenden Schritte aus:

  1. Legen Sie die Kernelfunktion mit hoher Dimension fest
  2. Legen Sie den L2-Hyperparameter fest
  3. Erstellen Sie das Modell
  4. Trainiere das Modell
  5. Bewerten Sie das Modell

Schritt A) Legen Sie die Kernelfunktion mit hoher Dimension fest

Der aktuelle Datensatz enthält 14 Features, die Sie in eine neue hohe Dimension des 5.000-dimensionalen Vektors transformieren. Sie verwenden die zufälligen Fourier-Funktionen, um die Transformation zu erreichen. Wenn Sie sich an die Gaußsche Kernel-Formel erinnern, stellen Sie fest, dass der Standardabweichungsparameter definiert werden muss. Dieser Parameter steuert das während der Klassifizierung verwendete Ähnlichkeitsmaß.

Sie können alle Parameter in RandomFourierFeatureMapper optimieren mit:

  • input_dim = 14
  • Output_dim= 5000
  • stddev=4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

Sie müssen den Kernel-Mapper erstellen, indem Sie die zuvor erstellten Feature-Spalten verwenden: feat_column

### Map Kernel
kernel_mappers = {feat_column: [kernel_mapper]}

Schritt B) Legen Sie den L2-Hyperparameter fest

Um eine Überanpassung zu verhindern, bestrafen Sie die Verlustfunktion mit dem L2-Regularisierer. Sie setzen den L2-Hyperparameter auf 0.1 und die Lernrate auf 5

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

Schritt C) Erstellen Sie das Modell

Der nächste Schritt ähnelt der linearen Klassifizierung. Sie verwenden den integrierten Schätzer KernelLinearClassifier. Beachten Sie, dass Sie den zuvor definierten Kernel-Mapper hinzufügen und das Modellverzeichnis ändern.

### Prep estimator
estimator_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': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a200ae550>, '_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'}

Schritt D) Trainiere das Modell

Nachdem der Kernel-Klassifikator nun erstellt ist, können Sie ihn trainieren. Sie entscheiden sich für eine 2000-fache Iteration des Modells

### estimate 
estimator_kernel.fit(input_fn=train_input_fn, steps=2000)
WARNING:tensorflow:Casting <dtype: 'int32'> labels to bool.
WARNING:tensorflow:Casting <dtype: 'int32'> 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 = 1
INFO:tensorflow:global_step/sec: 86.6365
INFO:tensorflow:loss = 0.39374447, step = 101 (1.155 sec)
INFO:tensorflow:global_step/sec: 80.1986
INFO:tensorflow:loss = 0.3797774, step = 201 (1.247 sec)
INFO:tensorflow:global_step/sec: 79.6376
INFO:tensorflow:loss = 0.3908726, step = 301 (1.256 sec)
INFO:tensorflow:global_step/sec: 95.8442
INFO:tensorflow:loss = 0.41890752, step = 401 (1.043 sec)
INFO:tensorflow:global_step/sec: 93.7799
INFO:tensorflow:loss = 0.35700393, step = 501 (1.066 sec)
INFO:tensorflow:global_step/sec: 94.7071
INFO:tensorflow:loss = 0.35535482, step = 601 (1.056 sec)
INFO:tensorflow:global_step/sec: 90.7402
INFO:tensorflow:loss = 0.3692882, step = 701 (1.102 sec)
INFO:tensorflow:global_step/sec: 94.4924
INFO:tensorflow:loss = 0.34746957, step = 801 (1.058 sec)
INFO:tensorflow:global_step/sec: 95.3472
INFO:tensorflow:loss = 0.33655524, step = 901 (1.049 sec)
INFO:tensorflow:global_step/sec: 97.2928
INFO:tensorflow:loss = 0.35966292, step = 1001 (1.028 sec)
INFO:tensorflow:global_step/sec: 85.6761
INFO:tensorflow:loss = 0.31254214, step = 1101 (1.167 sec)
INFO:tensorflow:global_step/sec: 91.4194
INFO:tensorflow:loss = 0.33247527, step = 1201 (1.094 sec)
INFO:tensorflow:global_step/sec: 82.5954
INFO:tensorflow:loss = 0.29305756, step = 1301 (1.211 sec)
INFO:tensorflow:global_step/sec: 89.8748
INFO:tensorflow:loss = 0.37943482, step = 1401 (1.113 sec)
INFO:tensorflow:global_step/sec: 76.9761
INFO:tensorflow:loss = 0.34204718, step = 1501 (1.300 sec)
INFO:tensorflow:global_step/sec: 73.7192
INFO:tensorflow:loss = 0.34614792, step = 1601 (1.356 sec)
INFO:tensorflow:global_step/sec: 83.0573
INFO:tensorflow:loss = 0.38911164, step = 1701 (1.204 sec)
INFO:tensorflow:global_step/sec: 71.7029
INFO:tensorflow:loss = 0.35255936, step = 1801 (1.394 sec)
INFO:tensorflow:global_step/sec: 73.2663
INFO: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': <tensorflow.contrib.learn.python.learn.estimators.head._BinaryLogisticHead object at 0x1a2054cd30>, 'feature_columns': {_RealValuedColumn(column_name='features_MAPPED', dimension=5000, default_value=None, dtype=tf.float32, normalizer=None)}, 'optimizer': <tensorflow.python.training.ftrl.FtrlOptimizer object at 0x1a200aec18>, 'kernel_mappers': {_RealValuedColumn(column_name='features', dimension=14, default_value=None, dtype=tf.float32, normalizer=None): [<tensorflow.contrib.kernel_methods.python.mappers.random_fourier_features.RandomFourierFeatureMapper object at 0x1a200ae400>]}})

Schritt E) Bewerten Sie das Modell

Zu guter Letzt bewerten Sie die Leistung Ihres Modells. Sie sollten in der Lage sein, die logistische Regression zu überwinden.

# Evaluate and report metrics.
eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)
WARNING:tensorflow:Casting <dtype: 'int32'> labels to bool.
WARNING:tensorflow:Casting <dtype: 'int32'> 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:50
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from kernel_train/model.ckpt-2000
INFO: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:51
INFO: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

Die endgültige Genauigkeit beträgt 84 %, was einer Verbesserung von 2 % im Vergleich zur logistischen Regression entspricht. Es besteht ein Kompromiss zwischen Genauigkeitsverbesserung und Rechenaufwand. Sie müssen darüber nachdenken, ob eine Verbesserung um 2 % den Zeitaufwand für die verschiedenen Klassifikatoren wert ist und ob sie einen überzeugenden Einfluss auf Ihr Unternehmen hat.

Zusammenfassung

Ein Kernel ist ein großartiges Werkzeug, um nichtlineare Daten in (fast) lineare Daten umzuwandeln. Der Nachteil dieser Methode besteht darin, dass sie rechenintensiv und kostspielig ist.

Nachfolgend finden Sie den wichtigsten Code zum Trainieren eines Kernel-Klassifikators

Legen Sie die Kernelfunktion mit hoher Dimension fest

  • input_dim = 14
  • Output_dim= 5000
  • stddev=4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

Legen Sie den L2-Hyperparameter fest

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

Erstellen Sie das Modell

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

Trainiere das Modell

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

Bewerten Sie das Modell

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