Ядро Гауса в машинному навчанні: Python Методи ядра

Мета цього підручника — зробити набір даних лінійно роздільним. Посібник розділений на дві частини:

  1. Перетворення ознак
  2. Навчіть класифікатор ядра за допомогою Tensorflow

У першій частині ви зрозумієте ідею методу ядра в машинному навчанні, тоді як у другій частині ви побачите, як навчити класифікатор ядра за допомогою Tensorflow. Ви будете використовувати набір даних для дорослих. Мета цього набору даних — класифікувати доходи нижче та вище 50 тис., знаючи поведінку кожної домогосподарства.

Навіщо вам потрібні методи ядра?

Мета кожного класифікатора - правильно передбачити класи. Для цього набір даних має бути роздільним. Подивіться на сюжет нижче; досить просто побачити, що всі точки над чорною лінією належать до першого класу, а інші точки до другого класу. Однак настільки простий набір даних буває надзвичайно рідко. У більшості випадків дані не відокремлюються. Методи ядра в машинному навчанні ускладнюють наївні класифікатори, такі як логістична регресія.

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

Метод ядра

На малюнку нижче ми малюємо набір даних, який не є лінійно роздільним. Якщо ми проведемо пряму лінію, більшість точок не буде віднесено до правильного класу.

Один із способів вирішення цієї проблеми — взяти набір даних і перетворити дані в іншу карту об’єктів. Це означає, що ви будете використовувати функцію для перетворення даних в іншому плані, який повинен бути лінійним.

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

Метод ядра

Дані на малюнку вище представлено у двовимірному плані ядра Гауса, який не можна розділити. Ви можете спробувати перетворити ці дані в тривимірне, тобто ви створюєте фігуру з 2 осями.

У нашому прикладі ядра Гауса ми застосуємо поліноміальне відображення, щоб привести наші дані до 3D-виміру. Формула для перетворення даних така.

Метод ядра

Ви визначаєте функцію в ядрі Гауса Python щоб створити нові карти функцій

Ви можете використовувати нумпі щоб закодувати наведену вище формулу:

Formula Еквівалентний код Numpy
x x[:,0]**
y x[:,1]
x2 x[:,0]**2
Метод ядра 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			

Нове відображення має бути тривимірним із 3 точками

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

Давайте створимо новий графік із трьома вісями x, y та 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()

Метод ядра

Ми бачимо покращення, але якщо ми змінимо орієнтацію графіка, стане зрозуміло, що набір даних тепер можна розділити

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

Метод ядра

Щоб маніпулювати великим набором даних і вам, можливо, доведеться створити більше ніж 2 виміри, ви зіткнетеся з великою проблемою, використовуючи наведений вище метод. Насправді вам потрібно перетворити всі точки даних, що явно не є стійким. Це займе багато років, і на комп’ютері може вичерпатися пам’ять.

Найпоширенішим способом подолання цієї проблеми є використання a ядро.

Що таке ядро ​​в машинному навчанні?

Ідея полягає в тому, щоб використовувати простір ознак більшої розмірності, щоб зробити дані майже лінійно роздільними, як показано на малюнку вище.

Існує багато просторів більшої розмірності, щоб зробити точки даних роздільними. Наприклад, ми показали, що поліноміальне відображення є чудовим початком.

Ми також продемонстрували, що з великою кількістю даних ці перетворення неефективні. Натомість ви можете використовувати функцію ядра в машинному навчанні, щоб змінювати дані без зміни нового плану функцій.

Магія ядра полягає в тому, щоб знайти функцію, яка уникає всіх проблем, пов’язаних з обчисленнями великої розмірності. Результатом ядра є скаляр, інакше кажучи, ми повертаємося до одновимірного простору

Знайшовши цю функцію, ви можете підключити її до стандартного лінійного класифікатора.

Давайте розглянемо приклад, щоб зрозуміти концепцію машинного навчання ядра. У вас є два вектори, x1 і x2. Мета полягає в тому, щоб створити вищий вимір за допомогою поліноміального відображення. Результат дорівнює скалярному добутку нової карти об’єктів. З наведеного вище методу вам потрібно:

  1. Перетворіть x1 і x2 у новий вимір
  2. Обчисліть скалярний добуток: спільний для всіх ядер
  3. Перетворіть x1 і x2 у новий вимір

Ви можете використовувати створену вище функцію для обчислення вищого розміру.

## Kernel
x1 = 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.        ]]

Обчислити скалярний добуток

Ви можете використовувати об’єкт dot із 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

Типи ядерних методів

Існує багато різних доступних методів ядра. Найпростішим є лінійне ядро. Ця функція досить добре працює для класифікації тексту. Інше ядро:

  • Поліноміальне ядро
  • Ядро Гауса

У прикладі с TensorFlow, ми будемо використовувати випадковий Фур’є. TensorFlow має вбудований оцінювач для обчислення нового простору функцій. Функція фільтра Гауса є наближенням ядерної функції Гауса.

Типи ядерних методів

Функція фільтрації Гауса обчислює подібність між точками даних у просторі набагато вищої розмірності.

Навчання класифікатора Gaussian Kernel за допомогою TensorFlow

Метою алгоритму є класифікація домогосподарств, які заробляють більше або менше 50 тис.

Ви оціните логістичне машинне навчання регресії ядра, щоб отримати еталонну модель. Після цього ви навчите класифікатор ядра, щоб побачити, чи зможете ви отримати кращі результати.

Ви використовуєте такі змінні з набору даних для дорослих:

  • вік
  • робочий клас
  • fnlwgt
  • освіту
  • номер_освіти
  • подружній
  • окупація
  • відносини
  • гонки
  • секс
  • приріст капіталу
  • капітал_збиток
  • години_тиждень
  • Батьківщина
  • етикетка

Перед тренуванням і оцінкою моделі ви виконайте наведені нижче дії.

  • Крок 1) Імпортуйте бібліотеки
  • Крок 2) Імпортуйте дані
  • Крок 3) Підготуйте дані
  • Крок 4) Створіть input_fn
  • Крок 5) Побудуйте логістичну модель: базову модель
  • Крок 6) Оцініть модель
  • Крок 7) Створіть класифікатор ядра
  • Крок 8) Оцініть класифікатор ядра

Крок 1) Імпортувати бібліотеки

Щоб імпортувати та навчати моделі ядра Штучний Інтелект, вам потрібно імпортувати tensorflow, панди і 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

Крок 2) Імпортуйте дані

Ви завантажуєте дані з наступного сайт і ви імпортуєте його як фрейм даних 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)

Тепер, коли навчальний і тестовий набір визначено, ви можете змінити мітку стовпця з рядка на ціле число. 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 learn. Ви також створюєте функцію, визначену користувачем, щоб полегшити перетворення потягу та тестового набору. Зауважте, що ви об’єднуєте неперервні та категоричні змінні в загальний набір даних, а масив має мати такий тип: 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

Функція трансформатора готова, ви можете конвертувати набір даних і створити функцію 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, ви вказуєте стовпці функцій і місце для збереження графіка.

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}

Ви тренуватимете логістичну регресію за допомогою міні-пакетів розміром 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)

Ви можете навчити модель за допомогою 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 = 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>

Крок 6) Оцініть модель

Ви визначаєте оцінку numpy для оцінки моделі. Ви використовуєте весь набір даних для оцінки

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

У вас точність 82 відсотки. У наступному розділі ви спробуєте перемогти логістичний класифікатор за допомогою класифікатора ядра

Крок 7) Побудуйте класифікатор ядра

Ядерний оцінювач не дуже відрізняється від традиційного лінійного класифікатора, принаймні з точки зору конструкції. Ідея полягає в тому, щоб використовувати силу явного ядра з лінійним класифікатором.

Вам потрібні два попередньо визначені оцінювачі, доступні в TensorFlow, щоб навчити класифікатор ядра:

  • RandomFourierFeatureMapper
  • KernelLinearClassifier

У першому розділі ви дізналися, що вам потрібно перетворити низький розмір у високий за допомогою функції ядра. Точніше, ви будете використовувати випадкову Фур’є, яка є наближенням функції Гауса. На щастя, Tensorflow має функцію у своїй бібліотеці: RandomFourierFeatureMapper. Модель можна навчити за допомогою оцінювача KernelLinearClassifier.

Щоб створити модель, виконайте такі дії:

  1. Встановіть функцію ядра високої розмірності
  2. Встановіть гіперпараметр L2
  3. Побудуйте модель
  4. Тренуйте модель
  5. Оцініть модель

Крок A) Встановіть функцію ядра високої розмірності

Поточний набір даних містить 14 функцій, які ви трансформуєте в новий високий вимір 5.000-вимірного вектора. Ви використовуєте випадкові функції Фур’є для досягнення перетворення. Якщо ви згадаєте формулу ядра Гауса, ви помітите, що існує параметр стандартного відхилення, який потрібно визначити. Цей параметр контролює міру схожості, яка використовується під час класифікації.

Ви можете налаштувати всі параметри в RandomFourierFeatureMapper за допомогою:

  • 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')

Вам потрібно створити програму відображення ядра, використовуючи створені раніше стовпці функцій: feat_column

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

Крок B) Встановіть гіперпараметр L2

Щоб запобігти переобладнанню, ви штрафуєте функцію втрат за допомогою регуляризатора L2. Ви встановлюєте гіперпараметр L2 на 0.1 і швидкість навчання на 5

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

Крок C) Побудуйте модель

Наступний крок подібний до лінійної класифікації. Ви використовуєте вбудований засіб оцінки KernelLinearClassifier. Зауважте, що ви додаєте програму відображення ядра, визначену раніше, і змінюєте каталог моделі.

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

Крок D) Тренуйте модель

Тепер, коли класифікатор ядра створено, ви готові до його навчання. Ви вирішили повторити модель 2000 разів

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

Крок E) Оцініть модель

Не в останню чергу ви оцінюєте продуктивність своєї моделі. Ви повинні бути в змозі подолати логістичну регресію.

# 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

Остаточна точність становить 84%, це на 2% покращення порівняно з логістичною регресією. Існує компроміс між підвищенням точності та обчислювальними витратами. Вам потрібно подумати, чи варте покращення на 2% часу, витраченого на інший класифікатор, і чи має воно переконливий вплив на ваш бізнес.

Підсумки

Ядро — чудовий інструмент для перетворення нелінійних даних у (майже) лінійні. Недолік цього методу полягає в тому, що він трудомісткий і дорогий.

Нижче ви можете знайти найважливіший код для навчання класифікатора ядра

Встановіть функцію ядра високої розмірності

  • 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')

Встановіть гіперпараметр 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)