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

⚡ Intelligente Zusammenfassung

Gaußsche Kernelmethoden machen nicht-separierbare Daten linear separierbar, ohne jemals die hochdimensionale Merkmalskarte zu erstellen. Diese Anleitung zeigt die Polynomkarte.ping manuell, dann wird ein Random-Fourier-Kernel-Klassifikator in TensorFlow trainiert.

  • 🔘 Separabilitätsproblem: Lineare Klassifikatoren versagen immer dann, wenn keine Gerade die Klassen im ursprünglichen Merkmalsraum trennt.
  • ☑️ Polynomkarteping: Die Transformation zu x², Wurzel-2 xy und y² hebt zwei Dimensionen in drei auf und trennt die Stichprobendaten.
  • Kernel-Trick: Ein Kernel gibt direkt das Skalarprodukt der abgebildeten Vektoren zurück, sodass keine erweiterte Feature-Map gespeichert wird.
  • 🧪 Drei Kerne: Lineare Funktionen eignen sich für die Textklassifizierung, polynomische Funktionen erfassen Merkmalsinteraktionen und Gaußsche RBF-Funktionen messen distanzbasierte Ähnlichkeiten.
  • TensorFlow-Build: RandomFourierFeatureMapper projiziert 14 Merkmale in 5,000 Dimensionen, bevor KernelLinearClassifier mit einem Ftrl-Optimierer trainiert wird.
  • 📈 Messergebnis: Der Kernel-Klassifikator erreicht eine Genauigkeit von 0.83975184 gegenüber 0.82353663 beim logistischen Basismodell.

Gaußscher Kernel im maschinellen Lernen

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 der Kernel-Methode im maschinellen Lernen verstehen, während Sie im zweiten Teil sehen werden, wie man einen Kernel-Klassifikator trainiert. TensorFlowSie verwenden den Datensatz für Erwachsene. Ziel dieses Datensatzes ist es, Haushalte mit einem Einkommen unter und über 50 € zu klassifizieren und dabei das Verhalten der einzelnen Haushalte zu analysieren.

Warum brauchen Sie Kernel-Methoden?

Ziel jedes Klassifikators ist die korrekte Klassenzuordnung. Dafür muss der Datensatz trennbar sein. Die untenstehende Grafik zeigt deutlich, dass alle Punkte oberhalb der schwarzen Linie zur ersten Klasse und alle anderen zur zweiten Klasse gehören. Solch einfache Datensätze sind jedoch äußerst selten. Meistens sind die Daten nicht trennbar, was einfachen Klassifikatoren wie der logistischen Regression große Schwierigkeiten bereitet.

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

Streudiagramm eines linear trennbaren Datensatzes, der durch eine gerade schwarze Linie sauber geteilt wird

In der folgenden Abbildung stellen wir einen Datensatz dar, der nicht linear trennbar ist. Wenn wir eine Gerade einzeichnen, werden die meisten Punkte nicht der richtigen Klasse zugeordnet.

Eine Möglichkeit, dieses Problem anzugehen, besteht darin, den Datensatz zu nehmen und die Daten in eine andere Feature-Map zu transformieren. Das bedeutet, dass man eine Funktion verwendet, um die Daten in eine andere Ebene zu verschieben, die linear trennbar 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()

Streudiagramm eines Datensatzes, in dem sich die beiden Klassen überlappen und keine gerade Linie sie trennt

Die Daten aus der obigen Abbildung liegen in einer 2D-Ebene und sind nicht trennbar. Sie können versuchen, diese Daten in drei Dimensionen zu transformieren, indem Sie eine Figur mit drei Achsen erstellen.

In unserem Beispiel mit dem Gaußschen Kernel werden wir eine Polynomabbildung anwenden.ping Um unsere Daten in eine dritte Dimension zu bringen, verwenden wir folgende Formel zur Datentransformation.

Polynomkarteping Die Formel für das φ von x und y lautet: x², Quadratwurzel aus zwei mal xy, y²

Sie definieren eine Funktion im Gaussian Kernel Python um die neuen Feature-Maps zu erstellen.

Sie können verwenden NumPy Um die obige Formel zu kodieren. Jede Zeile unten ordnet jeweils einen Term der Abbildung zu.ping mit dem Array-Ausdruck, der ihn erzeugt, und das kleine Bild markiert den Faktor Quadratwurzel aus zwei.

Formel Äquivalenter NumPy-Code
x x[:,0]
y x[:,1]
x[:,0]**2
Quadratwurzel aus zwei Faktoren aus der Polynomabbildungping np.sqrt(2)*
xy x[:,0]*x[:,1]
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 Karteping hat 3 Dimensionen und 16 Punkte.

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

Erstellen Sie nun ein neues Diagramm mit 3 Achsen, x, y und z.

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

Dreidimensionales Streudiagramm der kartierten Punkte aus einer Höhe von 30° und einem Azimut von 185°

Wir sehen eine Verbesserung, aber wenn wir die Ausrichtung des Diagramms ändern, wird deutlich, dass die Daten nun trennbar sind.

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

Die gleiche dreidimensionale Darstellung, flach gedreht, wobei eine einzige Ebene die beiden Klassen trennt

Wenn Sie einen großen Datensatz bearbeiten und mehr als zwei Dimensionen erstellen müssen, stößt die oben beschriebene Methode an ihre Grenzen. Tatsächlich müssten Sie alle Datenpunkte transformieren, was offensichtlich nicht praktikabel ist. Es würde ewig dauern, und der Arbeitsspeicher Ihres Computers könnte erschöpft sein.

Die gebräuchlichste Methode, dieses Problem zu beheben, ist die Verwendung eines Kernels.

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 obigen Abbildung gezeigt.

Es gibt zahlreiche höherdimensionale Räume, in denen die Datenpunkte trennbar sind. Beispielsweise haben wir gezeigt, dass die Polynomabbildungping ist ein guter Anfang.

Wir haben außerdem gezeigt, dass diese Transformationen bei großen Datenmengen nicht effizient sind. Stattdessen kann man in Machine Learning eine Kernel-Funktion verwenden, um die Daten zu modifizieren, ohne zu einer neuen Merkmalsebene zu wechseln.

Der Clou des Kernels besteht darin, eine Funktion zu finden, die alle Probleme der hochdimensionalen Berechnung vermeidet. Das Ergebnis eines Kernels ist ein Skalar, oder anders ausgedrückt: Wir befinden uns wieder im eindimensionalen Raum.

Sobald Sie diese Funktion gefunden haben, können Sie sie in den Standard-Linearklassifikator einfügen.

Hier ist ein Beispiel, das das Konzept des Kernel Machine Learning verdeutlicht. Sie haben zwei Vektoren, x1 und x2. Ziel ist es, mithilfe einer Polynomabbildung eine höhere Dimension zu erzeugen.pingDas Ergebnis entspricht dem Skalarprodukt der neuen Feature-Map. Für die oben beschriebene Methode müssen Sie Folgendes tun:

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

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 den Objektpunkt von verwenden. NumPy um das Skalarprodukt zwischen dem ersten und zweiten Vektor, der in x_1 gespeichert ist, zu berechnen.

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

Das Ergebnis ist 8100. Das Problem liegt darin, dass für die Berechnung des Skalarprodukts eine neue Feature-Map im Speicher abgelegt werden muss. Bei Datensätzen mit Millionen von Einträgen ist dies rechentechnisch ineffizient.

Stattdessen kann man den Polynomkernel verwenden, um das Skalarprodukt zu berechnen, ohne den Vektor zu transformieren. Diese Funktion berechnet das Skalarprodukt von x1 und x2, als wären diese beiden Vektoren in eine höhere Dimension transformiert worden. Anders ausgedrückt: Eine Kernelfunktion berechnet das Ergebnis 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 gibt viele verschiedene Kernel-Techniken. Die einfachste ist der lineare Kernel. Diese Funktion eignet sich gut für die Textklassifizierung. Weitere Kernel sind:

  • Polynomialer Kern
  • Gaußscher Kernel

Die Tabelle unten fasst zusammen, was die einzelnen Instrumente bewirken und wann sie in der Praxis zum Einsatz kommen.

Kernel Was es berechnet Typische Verwendung
Linear Das einfache Skalarprodukt im ursprünglichen Merkmalsraum Bereits trennbare Daten- und hochdimensionale Textmerkmale
Polynom Das Skalarprodukt hoch p, das die Interaktionen der Merkmale erfasst Gekrümmte Grenzen, wenn bekannt ist, dass die Wechselwirkungen von Bedeutung sind
Gaußsche Funktion (RBF) Eine distanzbasierte Ähnlichkeit, die gegen Null tendiert, wenn sich die Punkte voneinander entfernen. Die übliche erste Wahl, wenn die Form der Grenze unbekannt ist.

Im Beispiel mit TensorFlow verwenden wir zufällige Fourier-Merkmale. TensorFlow verfügt über einen integrierten Schätzer zur Berechnung des neuen Merkmalsraums. Der Random-Fourier-Feature-Mapper ist eine Approximation der unten dargestellten Gaußschen Kernelfunktion.

Gaußsche Kernformel: e hoch minus der quadrierten Norm von x minus y geteilt durch zwei σ²

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

Nachdem die Theorie geklärt ist, wird im weiteren Verlauf dieser Anleitung ein Gaußscher Kernel auf einen realen Datensatz angewendet.

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.

Zunächst evaluieren Sie eine logistische Regression, um ein Referenzmodell 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 evaluieren, gehen Sie wie folgt vor:

  1. Importieren Sie die Bibliotheken
  2. Importieren Sie die Daten
  3. Bereiten Sie die Daten vor
  4. Erstellen Sie das logistische Modell: Basismodell
  5. Bewerten Sie das Modell
  6. Konstruieren und evaluieren Sie den Kernel-Klassifikator.

Versionshinweis: Alle folgenden Codebeispiele beziehen sich auf TensorFlow 1.x. Der Namespace `tf.contrib`, der `real_valued_column`, `RandomFourierFeatureMapper` und `KernelLinearClassifier` bereitstellt, wurde in TensorFlow 2.0 entfernt, und `tf.estimator` selbst wurde in TensorFlow 2.16 entfernt. Verwenden Sie für eine aktuelle Version die gleiche Pipeline mit der Schicht `tf.keras.layers.experimental.RandomFourierFeatures`, gefolgt von einer Dense-Ausgabeschicht, oder mit dem Paar `RBFSampler` und `SGDClassifier` aus scikit-learn.

Schritt 1) ​​Importieren Sie die Bibliotheken

Zum Importieren und Trainieren von Kernel-Modellen Künstliche IntelligenzSie 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 der UCI-Datensatzseite für Erwachsene und importieren Sie es als Pandas DataFrame.

## 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 die Trainings- und Testdaten definiert wurden, können Sie die Spaltenbezeichnung von String in Integer ändern. TensorFlow akzeptiert keine String-Werte für die Bezeichnung.

label = {&#x27;<=50K': 0,'>50K': 1}
df_train.label = [label[item] for item in df_train.label]
label_t = {&#x27;<=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 stetige als auch kategoriale Merkmale. Es empfiehlt sich, die Werte der stetigen Variablen zu standardisieren. Sie können hierfür die Funktion StandardScaler verwenden. scikit-lernenSie erstellen außerdem eine benutzerdefinierte Funktion, um die Konvertierung des Trainings- und Testdatensatzes zu vereinfachen. Beachten Sie, dass Sie die kontinuierlichen und kategorialen Variablen zu einem gemeinsamen Datensatz zusammenführen und das Array vom Typ float32 sein sollte.

COLUMNS_INT = [&#x27;age','fnlwgt','education_num','capital_gain', 'capital_loss', 'hours_week']
CATE_FEATURES = [&#x27;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[&#x27;label'].astype(np.int32)    
    X_conc = np.c_[df_scaled, X_1].astype(np.float32)				
    return X_conc, y

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

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(&#x27;features', dimension=14)

Der Schätzer wird mithilfe der TensorFlow Estimator API definiert; Sie geben die Merkmalsspalten und den Speicherort für den Graphen an.

estimator = tf.estimator.LinearClassifier(feature_columns=[feat_column],
                                          n_classes=2,
                                          model_dir = "kernel_log"
                                         )	
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {&#x27;_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 werden die logistische Regression mit Mini-Batches der Größe 200 trainieren.

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

Das Modell kann mit 1,000 Iterationen trainiert werden.

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 5) Bewerten Sie das Modell

Sie definieren die NumPy-Eingabefunktion zur Auswertung des Modells. Zur Auswertung verwenden Sie den gesamten Testdatensatz.

# 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
{&#x27;accuracy': 0.82353663,
 &#x27;accuracy_baseline': 0.76377374,
 &#x27;auc': 0.84898686,
 &#x27;auc_precision_recall': 0.67214864,
 &#x27;average_loss': 0.3877216,
 &#x27;global_step': 1000,
 &#x27;label/mean': 0.23622628,
 &#x27;loss': 6312.495,
 &#x27;precision': 0.7362797,
 &#x27;prediction/mean': 0.21208474,
 &#x27;recall': 0.39417577}

Ihre Genauigkeit liegt bei 82 Prozent. Im nächsten Abschnitt werden Sie versuchen, den logistischen Klassifikator mit einem Kernel-Klassifikator zu übertreffen.

Schritt 6) Konstruieren Sie den Kernel-Klassifikator

Der Kernel-Schätzer unterscheidet sich, zumindest konstruktionstechnisch, nicht wesentlich vom traditionellen linearen Klassifikator. Die zugrundeliegende Idee besteht darin, die Leistungsfähigkeit einer expliziten Kernel-Abbildung zu nutzen.ping mit dem linearen Klassifikator.

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 transformieren müssen. Genauer gesagt verwenden Sie zufällige Fourier-Merkmale, die die Gauß-Funktion approximieren. TensorFlow 1.x stellt diese Abbildung bereit.ping als RandomFourierFeatureMapper, und das Modell kann mit Hilfe des Schätzers 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) Festlegen der hochdimensionalen Kernelfunktion

Der aktuelle Datensatz enthält 14 Merkmale, die Sie in einen neuen 5,000-dimensionalen Vektor transformieren. Für diese Transformation verwenden Sie zufällige Fourier-Merkmale. Wie Sie vielleicht aus der Formel des Gaußschen Kernels wissen, muss ein Standardabweichungsparameter definiert werden. Dieser Parameter steuert das Ähnlichkeitsmaß, das bei der Klassifizierung verwendet wird: Eine kleine Standardabweichung führt dazu, dass der Kernel nur sehr nahe beieinander liegende Punkte als ähnlich behandelt, während eine große Standardabweichung die Entscheidungsgrenze glättet.

Sie können alle Parameter in RandomFourierFeatureMapper optimieren mit:

  • input_dim = 14
  • output_dim = 5000
  • Standardabweichung = 4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name=&#x27;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) Den L2-Hyperparameter festlegen

Um Überanpassung zu vermeiden, wird die Verlustfunktion mit dem L2-Regularisierer bestraft. Der L2-Hyperparameter wird auf 0.1 und die Lernrate auf 5 gesetzt.

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

Die folgenden Warnungen bezüglich veralteter Funktionen sind bei TensorFlow 1.x zu erwarten, da das Modul kernel_methods auf den älteren tf.contrib.learn-Schätzern basiert.

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: {&#x27;_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
}
, &#x27;_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) Trainieren Sie das Modell

Nachdem der Kernel-Klassifikator erstellt wurde, können Sie ihn trainieren. Sie entscheiden sich dafür, das Modell 2,000 Mal zu iterieren.

### estimate 
estimator_kernel.fit(input_fn=train_input_fn, steps=2000)
WARNING:tensorflow:Casting <dtype: &#x27;int32'> labels to bool.
WARNING:tensorflow:Casting <dtype: &#x27;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={&#x27;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) Modell auswerten

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: &#x27;int32'> labels to bool.
WARNING:tensorflow:Casting <dtype: &#x27;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 etwa 1.6 Prozentpunkte über dem Wert der logistischen Regression liegt (0.83975184 gegenüber 0.82353663). Es besteht ein Zielkonflikt zwischen Genauigkeitsverbesserung und Rechenaufwand. Sie sollten abwägen, ob die Verbesserung den Zeitaufwand des rechenintensiveren Klassifikators rechtfertigt und ob sie einen wesentlichen Einfluss auf Ihr Unternehmen hat.

Häufig gestellte Fragen

Der Kernel-Trick berechnet das Skalarprodukt zweier Vektoren nach einer hochdimensionalen Abbildung.pingohne jemals diese Karte zu bauenpingDie Funktion polynomial_kernel in diesem Tutorial gibt direkt 8100 zurück, denselben Wert, den die explizite dreidimensionale Transformation erzeugt.

Nein. `tf.contrib` wurde in TensorFlow 2.0 und `tf.estimator` in 2.16 entfernt, daher sind `real_valued_column`, `RandomFourierFeatureMapper` und `KernelLinearClassifier` nicht mehr verfügbar. Verwenden Sie stattdessen die `tf.keras.layers.experimental.RandomFourierFeatures`-Schicht mit einem Dense-Output oder den `RBFSampler` mit dem `SGDClassifier`.

Automatisierte Suchwerkzeuge durchsuchen parallele Läufe nach Kerneltyp, Grad, Gamma- oder Standardabweichung und Regularisierungsstärke und ordnen die Ergebnisse anschließend nach einem kreuzvalidierten Score. Sie machen die Kernelauswahl zu einem gewichteten Vergleich, wobei Sie weiterhin das Suchbudget und die Bewertungsmetrik festlegen.

Es entwirft schnell das Grundgerüst: Merkmalskalierung, Mapper-Aufruf, Schätzer und Auswertungsschleife. Betrachten Sie die Vorschläge als ersten Entwurf, denn GitHub-Copilot Reproduziert problemlos entfernte TensorFlow 1.x APIs, die in aktuellen Versionen nicht mehr importiert werden.

Es legt die Breite der Ähnlichkeitskurve fest. Eine kleine Standardabweichung führt dazu, dass nur sehr nahe beieinander liegende Punkte als ähnlich gelten, was eine enge, unregelmäßige Grenze erzeugt, die zu Überanpassung führen kann. Eine große Standardabweichung glättet die Grenze und führt das Modell wieder in Richtung einer linearen Anpassung.

Es handelt sich um die Anzahl der zufälligen Fourier-Merkmale, die zur Approximation des Gaußschen Kernels verwendet werden. Mehr Merkmale approximieren den Kernel genauer und erhöhen in der Regel die Genauigkeit, allerdings auf Kosten eines breiteren Gewichtsvektors und einer langsameren Trainingszeit pro Batch.

Bei einer exakten Kernelmethode wird jedes Paar von Trainingspunkten verglichen, wodurch die Kosten annähernd quadratisch mit der Anzahl der Stichproben steigen. Random-Fourier-Features umgehen dieses Problem, indem sie den Kernel stattdessen durch eine Projektion fester Breite approximieren.

Eine Kernel-Methode korrigiert die Feature-Mapping Es lernt die linearen Gewichte im Voraus und trainiert daher schnell mit überschaubaren Daten. neuronale Netzwerk lernt seine eigene Repräsentation, die sich besser für sehr große, unstrukturierte Datensätze wie Bilder eignet.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: