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

⚡ Розумний підсумок

Методи гаусового ядра роблять нероздільні дані лінійно роздільними без побудови багатовимірної карти ознак. У цьому покроковому посібнику показано карту поліноміів.ping вручну, а потім навчає випадковий класифікатор ядра Фур'є в TensorFlow.

  • 🔘 Проблема роздільності: Лінійні класифікатори зазнають невдачі, коли жодна пряма лінія не розділяє класи у вихідному просторі ознак.
  • ☑️ Поліноміальна картаping: Перетворення до x-квадрату, кореня з двох, xy та y-квадрату піднімає два виміри на три та розділяє вибіркові дані.
  • Трюк з ядром: Ядро безпосередньо повертає скалярний добуток відображених векторів, тому розширена карта ознак ніколи не зберігається.
  • 🧪 Три ядра: Лінійний підходить для класифікації тексту, поліноміальний фіксує взаємодію ознак, а гауссівський RBF вимірює подібність на основі відстані.
  • 🛠️ Збірка TensorFlow: RandomFourierFeatureMapper проектує 14 ознак у 5,000 вимірів, перш ніж KernelLinearClassifier навчається за допомогою оптимізатора Ftrl.
  • 📈 Виміряний результат: Класифікатор ядра досягає точності 0.83975184 порівняно з 0.82353663 для логістичної базової лінії.

Ядро Гауса в машинному навчанні

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

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

Точкова діаграма набору даних, де два класи перетинаються, і їх не розділяє пряма лінія

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

У нашому прикладі з гаусовим ядром ми застосуємо поліноміальне відображенняping щоб перевести наші дані у третій вимір. Формула для перетворення даних така.

Поліноміальна картаping Формула Фі від x та y дорівнює x у квадраті, квадратному кореню з двох помножених на xy, y у квадраті

Ви визначаєте функцію в ядрі Гауса Python для створення нових карт ознак.

Ви можете використовувати numpy щоб закодувати наведену вище формулу. Кожен рядок нижче спарює один член картиping з виразом масиву, який його створює, а маленьке зображення позначає квадратний корінь з двох множників.

Formula Еквівалентний код NumPy
x x[:,0]
y x[:,1]
x[:,0]**2
Квадратний корінь з двох множників з поліноміального відображенняping 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			

Нова картаping має 3 виміри та 16 точок.

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

Тривимірна діаграма розсіювання точок на карті, що розглядаються з кута висоти 30 градусів та азимута 185 градусів

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

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

Той самий тривимірний графік, повернутий у плоску форму, де одна площина розділяє два класи

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

Найпоширеніший спосіб подолати цю проблему — використовувати ядро.

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

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

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

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

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

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

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

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

Перетворіть 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.        ]]

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

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

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

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

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

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

Ядро Що воно обчислює Типове використання
Лінійний Простий скалярний добуток у вихідному просторі ознак Вже роздільні дані та багатовимірні текстові функції
Поліноміальний Скальковий добуток, піднесений до степеня p, що фіксує взаємодію ознак Вигнуті межі, коли відомо, що взаємодії мають значення
Гаусівський (RBF) Подібність на основі відстані, яка падає до нуля, коли точки віддаляються одна від одної Звичайний перший вибір, коли форма межі невідома

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

Формула гаусового ядра: e, зведене до мінус квадрата норми від x мінус y, поділене на два сигма-квадрати

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

Після того, як теорія була визначена, решта цього покрокового керівництва використовує гаусове ядро ​​для роботи з реальним набором даних.

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

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

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

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

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

Перш ніж навчати та оцінювати модель, вам потрібно буде виконати такі дії:

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

Примітка до версії: Кожен фрагмент коду нижче призначений для TensorFlow 1.x. Простір імен tf.contrib, який надає real_valued_column, RandomFourierFeatureMapper та KernelLinearClassifier, було видалено в TensorFlow 2.0, а сам tf.estimator було видалено в TensorFlow 2.16. У поточному випуску створіть той самий конвеєр з шаром tf.keras.layers.experimental.RandomFourierFeatures, а потім вихідним шаром Dense, або з парою RBFSampler та SGDClassifier зі scikit-learn.

Крок 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) Імпортуйте дані

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

Тепер, коли набір потягів та тестів визначено, ви можете змінити підпис стовпця з рядка на ціле число. TensorFlow не приймає рядкові значення для підпису.

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)			

Крок 3) Підготуйте дані

Набір даних містить як неперервні, так і категоріальні ознаки. Гарною практикою є стандартизація значень неперервних змінних. Ви можете використовувати функцію StandardScaler з scikit-вчитисяВи також створюєте користувацьку функцію, щоб спростити перетворення навчального та тестового наборів. Зверніть увагу, що ви об'єднуєте неперервні та категоріальні змінні в спільний набір даних, а масив повинен мати тип float32.

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

Функція трансформатора готова, тож ви можете конвертувати набір даних та створити функцію 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(&#x27;features', dimension=14)

Оцінювач визначається за допомогою API оцінювача TensorFlow; ви надаєте стовпці ознак та місце для збереження графіка.

estimator = tf.estimator.LinearClassifier(feature_columns=[feat_column],
                                          n_classes=2,
                                          model_dir = "kernel_log"
                                         )	
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {&#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}

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

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

Ви визначаєте вхідну функцію 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
{&#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}

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

Крок 6) Створіть класифікатор ядра

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

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

  • RandomFourierFeatureMapper
  • KernelLinearClassifier

У першому розділі ви дізналися, що вам потрібно перетворити нижню розмірність у вищу за допомогою функції ядра. Точніше, ви будете використовувати випадкові ознаки Фур'є, які апроксимують функцію Гауса. TensorFlow 1.x надає це відображенняping як RandomFourierFeatureMapper, а модель можна навчити за допомогою оцінювача KernelLinearClassifier.

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

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

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

Поточний набір даних містить 14 ознак, які ви перетворите на новий 5,000-вимірний вектор. Для здійснення перетворення ви використовуєте випадкові ознаки Фур'є. Якщо ви пам'ятаєте формулу гаусового ядра, то помічаєте, що потрібно визначити параметр стандартного відхилення. Цей параметр контролює міру подібності, яка використовується під час класифікації: мале значення stddev змушує ядро ​​розглядати лише дуже близькі точки як подібні, тоді як велике значення згладжує межу прийняття рішення.

Ви можете налаштувати всі параметри в 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=&#x27;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")

Наведені нижче попередження про застарівання очікуються у TensorFlow 1.x, оскільки модуль kernel_methods побудовано на старіших оцінювачах tf.contrib.learn.

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

Крок D) Навчання моделі

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

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

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

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

# 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

Кінцева точність становить 84%, що приблизно на 1.6 процентних пункти вище базового рівня логістичної регресії (0.83975184 проти 0.82353663). Існує компроміс між покращенням точності та обчислювальними витратами. Вам потрібно подумати, чи варте це покращення часу, витраченого складнішим класифікатором, і чи має воно переконливий вплив на ваш бізнес.

Поширені запитання

Трюк ядра обчислює скалярний добуток двох векторів після багатовимірного відображенняping, так і не побудувавши цю картуpingФункція polynomial_kernel у цьому посібнику безпосередньо повертає 8100, те саме значення, яке генерує явне тривимірне перетворення.

Ні. tf.contrib було видалено в TensorFlow 2.0, а tf.estimator у 2.16, тому real_valued_column, RandomFourierFeatureMapper та KernelLinearClassifier зникли. Використовуйте шар tf.keras.layers.experimental.RandomFourierFeatures з виходом Dense або RBFSampler з SGDClassifier.

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

Він швидко створює чернетку каркасу: масштабування ознак, виклик маппера, оцінювач та цикл оцінювання. Розглядайте пропозиції як перший прохід, оскільки Копілот GitHub легко відтворює видалені API TensorFlow 1.x, які більше не імпортуються в поточних випусках.

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

Це кількість випадкових ознак Фур'є, що використовуються для апроксимації гауссового ядра. Більша кількість ознак апроксимує ядро ​​точніше та зазвичай підвищує точність, але ціною ширшого вагового вектора та повільнішого навчання на кожній партії.

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

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

Підсумуйте цей пост за допомогою: