Kernel Gaussian dalam Pembelajaran Mesin: Python Metode Kernel

Tujuan dari tutorial ini adalah untuk membuat dataset dapat dipisahkan secara linier. Tutorialnya dibagi menjadi dua bagian:

  1. Transformasi fitur
  2. Latih pengklasifikasi Kernel dengan Tensorflow

Pada bagian pertama, Anda akan memahami ide di balik metode Kernel dalam Machine Learning, sedangkan pada bagian kedua, Anda akan melihat cara melatih pengklasifikasi kernel dengan Tensorflow. Anda akan menggunakan dataset dewasa. Tujuan dari dataset ini adalah untuk mengklasifikasikan pendapatan di bawah dan di atas 50k, dengan mengetahui perilaku setiap rumah tangga.

Mengapa Anda memerlukan Metode Kernel?

Tujuan dari setiap pengklasifikasi adalah untuk memprediksi kelas dengan benar. Untuk itu, dataset harus dapat dipisahkan. Lihatlah alur cerita di bawah ini; cukup mudah untuk melihat bahwa semua titik di atas garis hitam adalah milik kelas pertama dan titik lainnya milik kelas kedua. Namun, sangat jarang ada kumpulan data sesederhana itu. Dalam kebanyakan kasus, data tidak dapat dipisahkan. Metode kernel dalam Pembelajaran Mesin menyulitkan pengklasifikasi naif seperti regresi logistik.

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

Metode Kernel

Pada gambar di bawah, kami memplot kumpulan data yang tidak dapat dipisahkan secara linier. Jika kita menggambar garis lurus, sebagian besar titik tidak akan diklasifikasikan dalam kelas yang benar.

Salah satu cara untuk mengatasi masalah ini adalah dengan mengambil kumpulan data dan mengubah data di peta fitur lain. Artinya, Anda akan menggunakan suatu fungsi untuk mengubah data dalam paket lain, yang harus dapat dilinearkan.

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

Metode Kernel

Data dari gambar di atas berada dalam rencana Kernel Gaussian 2D yang tidak dapat dipisahkan. Anda bisa mencoba mengubah data tersebut menjadi tiga dimensi, artinya Anda membuat gambar dengan 3 sumbu.

Dalam contoh Kernel Gaussian, kita akan menerapkan pemetaan polinomial untuk membawa data kita ke dimensi 3D. Rumus untuk mengubah data adalah sebagai berikut.

Metode Kernel

Anda mendefinisikan suatu fungsi di Kernel Gaussian Python untuk membuat peta fitur baru

Anda dapat menggunakan mati rasa untuk mengkodekan rumus di atas:

Rumus Kode Numpy yang Setara
x x[:,0]**
y x[:,1]
x2 x[:,0]**2
Metode Kernel 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			

Pemetaan baru harusnya 3 dimensi dengan 16 titik

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

Mari kita buat plot baru dengan 3 sumbu, x, y dan z masing-masing.

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

Metode Kernel

Kami melihat adanya peningkatan, namun jika kami mengubah orientasi plot, jelas bahwa kumpulan data kini dapat dipisahkan

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

Metode Kernel

Untuk memanipulasi dataset yang besar dan Anda mungkin harus membuat lebih dari 2 dimensi, Anda akan menghadapi masalah besar dengan menggunakan cara di atas. Faktanya, Anda perlu mengubah semua titik data, yang jelas tidak berkelanjutan. Ini akan memakan waktu lama, dan komputer Anda mungkin kehabisan memori.

Cara paling umum untuk mengatasi masalah ini adalah dengan menggunakan a inti.

Apa itu Kernel dalam pembelajaran mesin?

Idenya adalah menggunakan ruang fitur berdimensi lebih tinggi untuk membuat data hampir dapat dipisahkan secara linier seperti yang ditunjukkan pada gambar di atas.

Ada banyak ruang berdimensi lebih tinggi untuk membuat titik data dapat dipisahkan. Misalnya, kami telah menunjukkan bahwa pemetaan polinomial adalah awal yang baik.

Kami juga telah menunjukkan bahwa dengan banyaknya data, transformasi ini tidak efisien. Sebagai gantinya, Anda dapat menggunakan fungsi Kernel di Machine Learning untuk mengubah data tanpa mengubah ke paket fitur baru.

Keajaiban kernel adalah menemukan fungsi yang menghindari semua masalah yang ditimbulkan oleh komputasi dimensi tinggi. Hasil dari kernel adalah skalar, atau dengan kata lain kita kembali ke ruang satu dimensi

Setelah Anda menemukan fungsi ini, Anda dapat menghubungkannya ke pengklasifikasi linier standar.

Mari kita lihat contoh untuk memahami konsep Kernel Machine Learning. Anda memiliki dua vektor, x1 dan x2. Tujuannya adalah untuk menciptakan dimensi yang lebih tinggi dengan menggunakan pemetaan polinomial. Outputnya sama dengan perkalian titik dari peta fitur baru. Dari cara di atas, Anda perlu:

  1. Ubah x1 dan x2 menjadi dimensi baru
  2. Hitung perkalian titik: umum untuk semua kernel
  3. Ubah x1 dan x2 menjadi dimensi baru

Anda dapat menggunakan fungsi yang dibuat di atas untuk menghitung dimensi yang lebih tinggi.

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

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

Keluaran

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

Hitung produk titiknya

Anda dapat menggunakan objek titik dari numpy untuk menghitung perkalian titik antara vektor pertama dan kedua yang disimpan di x_1.

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

Outputnya adalah 8100. Anda melihat masalahnya, Anda perlu menyimpan peta fitur baru di memori untuk menghitung perkalian titik. Jika Anda memiliki kumpulan data dengan jutaan catatan, hal itu tidak efektif secara komputasi.

Sebagai gantinya, Anda dapat menggunakan kernel polinomial untuk menghitung perkalian titik tanpa mengubah vektor. Fungsi ini menghitung perkalian titik dari x1 dan x2 seolah-olah kedua vektor ini telah diubah ke dimensi yang lebih tinggi. Dengan kata lain, fungsi kernel menghitung hasil perkalian titik dari ruang fitur lain.

Anda dapat menulis fungsi kernel polinomial Python sebagai berikut.

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

Ini adalah pangkat perkalian titik dua vektor. Di bawah ini, Anda mengembalikan tingkat kedua dari kernel polinomial. Outputnya sama dengan metode lainnya. Inilah keajaiban kernel.

polynomial_kernel(x1, x2, p=2)			
8100

Jenis Metode Kernel

Ada banyak teknik Kernel berbeda yang tersedia. Yang paling sederhana adalah kernel linier. Fungsi ini berfungsi cukup baik untuk klasifikasi teks. Kernel lainnya adalah:

  • Kernel polinomial
  • Kernel Gaussian

Dalam contoh dengan TensorFlow, kita akan menggunakan Random Fourier. TensorFlow memiliki estimator bawaan untuk menghitung ruang fitur baru. Fungsi filter Gaussian merupakan perkiraan fungsi kernel Gaussian.

Jenis Metode Kernel

Fungsi pemfilteran Gaussian menghitung kesamaan antara titik data dalam ruang dimensi yang jauh lebih tinggi.

Latih pengklasifikasi Kernel Gaussian dengan TensorFlow

Tujuan dari algoritma ini adalah untuk mengklasifikasikan rumah tangga yang berpenghasilan lebih atau kurang dari 50k.

Anda akan mengevaluasi Pembelajaran Mesin Regresi Kernel logistik untuk memiliki model tolok ukur. Setelah itu, Anda akan melatih pengklasifikasi Kernel untuk melihat apakah Anda bisa mendapatkan hasil yang lebih baik.

Anda menggunakan variabel berikut dari kumpulan data dewasa:

  • usia
  • kelas kerja
  • fnlwgt
  • pendidikan
  • pendidikan_num
  • perkawinan
  • pekerjaan
  • hubungan
  • ras
  • seks
  • keuntungan dalam bentuk uang
  • modal_rugi
  • jam_minggu
  • negara Asal
  • label

Anda akan melanjutkan sebagai berikut sebelum melatih dan mengevaluasi model:

  • Langkah 1) Impor perpustakaan
  • Langkah 2) Impor data
  • Langkah 3) Siapkan datanya
  • Langkah 4) Buat input_fn
  • Langkah 5) Bangun model logistik: Model dasar
  • Langkah 6) Evaluasi modelnya
  • Langkah 7) Buat pengklasifikasi Kernel
  • Langkah 8) Evaluasi pengklasifikasi Kernel

Langkah 1) Impor perpustakaan

Untuk mengimpor dan melatih model Kernel Kecerdasan Buatan, Anda perlu mengimpor tensorflow, panda dan 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

Langkah 2) Impor data

Anda mengunduh data dari berikut ini situs web dan Anda mengimpornya sebagai kerangka data panda.

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

Sekarang set pelatihan dan pengujian telah ditentukan, Anda dapat mengubah label kolom dari string menjadi integer. tensorflow tidak menerima nilai string untuk label.

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)			

Langkah 3) Siapkan datanya

Kumpulan data berisi fitur berkelanjutan dan kategoris. Praktik yang baik adalah dengan membakukan nilai variabel kontinu. Anda dapat menggunakan fungsi StandardScaler dari sci-kit learn. Anda juga membuat fungsi yang ditentukan pengguna untuk mempermudah konversi rangkaian kereta dan pengujian. Perhatikan bahwa, Anda menggabungkan variabel kontinu dan kategorikal ke kumpulan data umum dan arraynya harus bertipe: 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 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

Fungsi transformator sudah siap, Anda dapat mengonversi kumpulan data dan membuat fungsi 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)

Pada langkah berikutnya, Anda akan melatih regresi logistik. Ini akan memberi Anda akurasi dasar. Tujuannya adalah untuk mengalahkan baseline dengan algoritma yang berbeda, yaitu pengklasifikasi Kernel.

Langkah 4) Bangun model logistik: Model dasar

Anda membuat kolom fitur dengan objek real_valued_column. Ini akan memastikan semua variabel adalah data numerik yang padat.

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

Estimator ditentukan menggunakan TensorFlow Estimator, Anda menginstruksikan kolom fitur dan tempat menyimpan grafik.

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}

Anda akan melatih regresi logistik menggunakan mini-batch berukuran 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)

Anda dapat melatih model dengan 1.000 iterasi

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>

Langkah 6) Evaluasi modelnya

Anda menentukan penduga numpy untuk mengevaluasi model. Anda menggunakan seluruh kumpulan data untuk evaluasi

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

Anda memiliki akurasi 82 ​​persen. Di bagian selanjutnya, Anda akan mencoba mengalahkan pengklasifikasi logistik dengan pengklasifikasi Kernel

Langkah 7) Bangun pengklasifikasi Kernel

Estimator kernel tidak jauh berbeda dengan pengklasifikasi linier tradisional, setidaknya dalam hal konstruksi. Ide di baliknya adalah menggunakan kekuatan kernel eksplisit dengan pengklasifikasi linier.

Anda memerlukan dua estimator yang telah ditentukan sebelumnya yang tersedia di TensorFlow untuk melatih Kernel Classifier:

  • RandomFourierFeatureMapper
  • KernelLinearClassifier

Anda telah mempelajari di bagian pertama bahwa Anda perlu mengubah dimensi rendah menjadi dimensi tinggi menggunakan fungsi kernel. Lebih tepatnya, Anda akan menggunakan Random Fourier, yang merupakan perkiraan fungsi Gaussian. Untungnya, Tensorflow memiliki fungsi di perpustakaannya: RandomFourierFeatureMapper. Model dapat dilatih menggunakan estimator KernelLinearClassifier.

Untuk membangun model, Anda akan mengikuti langkah-langkah berikut:

  1. Atur fungsi Kernel dimensi tinggi
  2. Atur hiperparameter L2
  3. Bangun model
  4. Latih modelnya
  5. Evaluasi modelnya

Langkah A) Atur fungsi Kernel dimensi tinggi

Dataset saat ini berisi 14 fitur yang akan Anda ubah ke dimensi tinggi baru dari vektor 5.000 dimensi. Anda menggunakan fitur Fourier acak untuk mencapai transformasi. Jika Anda mengingat rumus Kernel Gaussian, Anda melihat bahwa ada parameter deviasi standar yang harus ditentukan. Parameter ini mengontrol ukuran kesamaan yang digunakan selama klasifikasi.

Anda dapat menyetel semua parameter di RandomFourierFeatureMapper dengan:

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

Anda perlu membuat mapper kernel dengan menggunakan kolom fitur yang dibuat sebelumnya: feat_column

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

Langkah B) Atur hiperparameter L2

Untuk mencegah overfitting, Anda menghukum fungsi kerugian dengan pengatur L2. Anda mengatur hyperparameter L2 ke 0.1 dan kecepatan pembelajaran ke 5

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

Langkah C) Bangun model

Langkah selanjutnya mirip dengan klasifikasi linier. Anda menggunakan estimator bawaan KernelLinearClassifier. Perhatikan bahwa Anda menambahkan pemetaan kernel yang ditentukan sebelumnya dan mengubah direktori model.

### 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'}

Langkah D) Latih modelnya

Sekarang setelah pengklasifikasi Kernel dibuat, Anda siap untuk melatihnya. Anda memilih untuk mengulangi model sebanyak 2000 kali

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

Langkah E) Evaluasi modelnya

Terakhir, Anda mengevaluasi performa model Anda. Anda harus mampu mengalahkan regresi logistik.

# 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

Akurasi akhir adalah 84%, peningkatan 2% dibandingkan dengan regresi logistik. Ada trade-off antara peningkatan akurasi dan biaya komputasi. Anda perlu memikirkan apakah peningkatan 2% sepadan dengan waktu yang dihabiskan oleh pengklasifikasi yang berbeda dan apakah hal tersebut memiliki dampak yang menarik pada bisnis Anda.

Kesimpulan

Kernel adalah alat yang hebat untuk mengubah data non-linier menjadi (hampir) linier. Kelemahan dari metode ini adalah memakan waktu dan biaya komputasi yang besar.

Di bawah ini, Anda dapat menemukan kode terpenting untuk melatih pengklasifikasi kernel

Atur fungsi Kernel dimensi tinggi

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

Atur hiperparameter L2

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

Bangun model

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

Latih modelnya

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

Evaluasi modelnya

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