Гауссиан кернел у машинском учењу: примери кернел метода

Преглед садржаја:

Anonim

Сврха овог водича је да скуп података учини линеарно одвојивим. Водич је подељен у два дела:

  1. Трансформација карактеристика
  2. Обучите кернел класификатор са Тенсорфлов-ом

У првом делу ћете разумети идеју која стоји иза Кернел методе у машинском учењу, док ћете у другом делу видети како да обучите класификатор језгра са Тенсорфлов-ом. Користићете скуп података за одрасле. Циљ овог скупа података је да класификује приход испод и изнад 50 хиљада, знајући понашање сваког домаћинства.

У овом упутству ћете научити-

  • Зашто су вам потребне кернел методе?
  • Шта је језгро у машинском учењу?
  • Врсте метода језгре
  • Обучите класификатор Гауссовог језгра помоћу ТенсорФлов-а

Зашто су вам потребне кернел методе?

Циљ сваког класификатора је тачно предвидети класе. За то би скуп података требало да буде одвојив. Погледајте заплет испод; прилично је једноставно видети да све тачке изнад црне линије припадају првој класи, а остале тачке другој класи. Међутим, изузетно је ретко имати тако једноставан скуп података. Подаци се у већини случајева не могу раздвојити. Методе језгра у машинском учењу тешко дају наивним класификаторима попут логистичке регресије.

import numpy as npimport matplotlib.pyplot as pltfrom 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Д плану Гауссовог језгра који се не може одвојити. Можете покушати да трансформишете ове податке у тродимензионалну, то значи да креирате фигуру са 3 осе.

У нашем примеру Гауссовог језгра применићемо полиномско мапирање да бисмо довели наше податке у 3Д димензију. Формула за трансформацију података је следећа.

У Гауссиан Кернел Питхону дефинишете функцију за креирање нових мапа карактеристика

Можете користити нумпи за кодирање горње формуле:

Формула Еквивалентан Нумпи код
Икс к [:, 0] **
г. к [:, 1]
к 2 к [:, 0] ** 2
нп.скрт (2) *
ки к [:, 0] * к [:, 1]
и 2 к [:, 1] ** 2
### illustration purposedef mapping(x, y):x = np.c_[(x, y)]if len(x) > 2:x_1 = x[:,0]**2x_2 = np.sqrt(2)*x[:,0]*x[:,1]x_3 = x[:,1]**2else:x_1 = x[0]**2x_2 = np.sqrt(2)*x[0]*x[1]x_3 = x[1]**2trans_x = np.array([x_1, x_2, x_3])return trans_x

Ново мапирање требало би да буде у три димензије са 16 тачака

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

Направимо нову графику са 3 осе, к, и и з респективно.

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

Видимо побољшање, али ако променимо оријентацију графикона, јасно је да је скуп података сада одвојив

# plotfig = 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 димензије, суочићете се са великим проблемом користећи горњу методу. У ствари, морате трансформисати све тачке података, што очигледно није одрживо. Требаће вам године, а рачунару ће можда понестати меморије.

Најчешћи начин за превазилажење овог проблема је употреба језгра .

Шта је језгро у машинском учењу?

Идеја је користити простор карактеристика веће димензије како би се подаци учинили готово линеарно одвојивима, као што је приказано на горњој слици.

Постоји пуно виших димензионалних простора да би се тачке података могле раздвојити. На пример, показали смо да је пресликавање полинома одличан почетак.

Такође смо показали да са пуно података ова трансформација није ефикасна. Уместо тога, можете да користите функцију кернела у машинском учењу за модификовање података без преласка на нови план карактеристика.

Магија језгра је да пронађе функцију која избегава све невоље које подразумева израчунавање високе димензије. Резултат језгра је скалар, или другачије речено, вратили смо се у једнодимензионални простор

Након што пронађете ову функцију, можете је прикључити на стандардни линеарни класификатор.

Погледајмо пример за разумевање концепта Кернел Мацхине Леарнинг. Имате два вектора, к1 и к2. Циљ је створити вишу димензију помоћу полиномског мапирања. Излаз је једнак тачкастом производу нове мапе карактеристика. Из горњег метода потребно је да:

  1. Трансформишите к1 и к2 у нову димензију
  2. Израчунајте тачкасти производ: заједнички за сва језгра
  3. Трансформишите к1 и к2 у нову димензију

Функцију горе креирану можете користити за израчунавање више димензије.

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

Израчунајте тачкасти производ

Можете користити објектну тачку из нумпи-а да бисте израчунали тачкасти производ између првог и другог вектора сачуваног у к_1.

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

Излаз је 8100. Видите ли проблем, морате сачувати у меморији нову мапу карактеристика да бисте израчунали тачкасти производ. Ако имате скуп података са милионима записа, рачунски је неефикасан.

Уместо тога, можете да користите полиномско језгро за израчунавање тачканог производа без трансформације вектора. Ова функција израчунава тачкасти умножак к1 и к2 као да су ова два вектора трансформисана у вишу димензију. Речено другачије, функција језгра израчунава резултате тачкастог производа из другог простора карактеристика.

Можете написати функцију полиномског језгра у Питхон на следећи начин.

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

То је снага тачканог производа два вектора. Испод враћате други степен полиномског језгра. Излаз је једнак другој методи. Ово је магија језгра.

polynomial_kernel(x1, x2, p=2)8100 

Врсте метода језгре

Доступно је пуно различитих техника кернела. Најједноставније је линеарно језгро. Ова функција прилично добро функционише за класификацију текста. Друго језгро је:

  • Полиномско језгро
  • Гауссиан Кернел

У примеру са ТенсорФлов, користићемо Рандом Фоуриер. ТенсорФлов има уграђени процењивач за израчунавање новог простора карактеристика. Гауссова функција филтра је апроксимација Гауссове функције зрна.

Гаусова функција филтрирања израчунава сличност између тачака података у много вишем димензионалном простору.

Обучите класификатор Гауссовог језгра помоћу ТенсорФлов-а

Циљ алгоритма је класификовати домаћинство које зарађује више или мање од 50 хиљада.

Оценићете логистичко кернелско регресијско машинско учење да бисте имали референтни модел. Након тога, тренираћете кернел класификатор да бисте видели да ли можете постићи боље резултате.

Користите следеће променљиве из скупа података за одрасле:

  • старост
  • радна класа
  • фнлвгт
  • образовање
  • број_образовања
  • брачно
  • занимање
  • однос
  • трка
  • секс
  • Капитални добитак
  • цапитал_лосс
  • хоурс_веек
  • домовина
  • ознака

Наставићете како следи пре него што обучите и процените модел:

  • Корак 1) Увезите библиотеке
  • Корак 2) Увезите податке
  • Корак 3) Припремите податке
  • Корак 4) Конструисати инпут_фн
  • Корак 5) Конструисање логистичког модела: основни модел
  • Корак 6) Оцените модел
  • Корак 7) Направите класификатор језгра
  • Корак 8) Оцените кернел класификатор

Корак 1) Увезите библиотеке

Да бисте увезли и обучили кернел моделе у вештачкој интелигенцији, морате да увезете тенсорфлов, панде и нумпи

#import numpy as npfrom sklearn.model_selectionimport train_test_splitimport tensorflow as tfimport pandas as pdimport numpy as np

Корак 2) Увезите податке

Податке преузимате са следеће веб странице и увозите их као оквир података панде.

## Define path dataCOLUMNS = ['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"## Importdf_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) 

Сада када су дефинисани воз и тестни скуп, можете променити ознаку колоне из низа у цео број. тенсорфлов не прихвата вредност низа за налепницу.

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) Припремите податке

Скуп података садржи и континуиране и категоричке карактеристике. Добра пракса је стандардизација вредности континуираних променљивих. Можете користити функцију СтандардСцалер из сци-кит леарн. Креирате и кориснички дефинисану функцију како бисте олакшали претварање воза и скупа за тестирање. Имајте на уму да континуиране и категоричке променљиве спајате у заједнички скуп података и низ би требао бити типа: флоат32

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 StandardScalerfrom sklearn import preprocessingdef 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 

Функција трансформатора је спремна, можете претворити скуп података и створити функцију инпут_фн.

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) Конструисање логистичког модела: основни модел

Колону обележја конструишете са објектом реал_валуед_цолумн. Осигураће да су све променљиве густи нумерички подаци.

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

Процењивач је дефинисан помоћу ТенсорФлов Процењивача, ви упутите колоне карактеристика и где да сачувате граф.

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

Корак 6) Оцените модел

Ви дефинишете нумпи процењивач за процену модела. За процену користите цео скуп података

# Evaluationtest_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:22INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from kernel_log/model.ckpt-1000INFO: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:23INFO: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) Направите класификатор језгра

Процењивач језгра се не разликује толико од традиционалног линеарног класификатора, барем у погледу конструкције. Идеја иза тога је употреба снаге експлицитног језгра са линеарним класификатором.

Потребна су вам два унапред дефинисана процењивача доступна у програму ТенсорФлов за обуку класификатора језгра:

  • РандомФоуриерФеатуреМаппер
  • КернелЛинеарЦлассифиер

У првом одељку сте научили да морате да трансформишете ниску димензију у високу помоћу функције кернела. Тачније, користићете случајни Фурије, што је апроксимација Гаусове функције. Срећом, Тенсорфлов има функцију у својој библиотеци: РандомФоуриерФеатуреМаппер. Модел се може обучити помоћу процењивача КернелЛинеарЦлассифиер.

Да бисте изградили модел, следите ове кораке:

  1. Поставите функцију кернел високе димензије
  2. Подесите хиперпараметар Л2
  3. Изградите модел
  4. Обучи модел
  5. Процените модел

Корак А) Поставите функцију кернела велике димензије

Тренутни скуп података садржи 14 карактеристика које ћете трансформисати у нову високу димензију 5.000-димензионалног вектора. Користите случајне Фуријеове функције да бисте постигли трансформацију. Ако се сетите формуле Гауссовог језгра, приметићете да постоји параметар стандардне девијације који треба дефинисати. Овај параметар контролише меру сличности коју користи током класификације.

Све параметре можете подесити у РандомФоуриерФеатуреМаппер помоћу:

  • инпут_дим = 14
  • оутпут_дим = 5000
  • стддев = 4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm') 

Морате да конструишете мапу језгра користећи колоне карактеристика креиране пре: феат_цолумн

### Map Kernelkernel_mappers = {feat_column: [kernel_mapper]} 

Корак Б) Подесите хиперпараметар Л2

Да бисте спречили прекомерно опремање, казните функцију губитка помоћу регулатора Л2. Подесили сте хиперпараметар Л2 на 0,1, а брзину учења на 5

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

Корак Ц) Изградите модел

Следећи корак је сличан линеарној класификацији. Користите уграђени процењивач КернелЛинеарЦлассифиер. Имајте на уму да додате претходно дефинирано мапирање језгра и промените директоријум модела.

### Prep estimatorestimator_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': , '_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'}

Корак Д) Обучите модел

Сада када је изграђен класификатор језгра, спремни сте да га обучите. Одлучите се да поновите 2000 пута модел

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

Корак Е) Оцените модел

И на крају, али не најмање важно, процењујете перформансе свог модела. Требали бисте бити у стању да победите логистичку регресију.

# Evaluate and report metrics.eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)
WARNING:tensorflow:Casting 
 labels to bool.WARNING:tensorflow:Casting 
 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:50INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from kernel_train/model.ckpt-2000INFO: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:51INFO: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% вреди време које различити класификатор троши и да ли има убедљив утицај на ваше пословање.

Резиме

Кернел је одличан алат за трансформисање нелинеарних података у (готово) линеарне. Недостатак ове методе је рачунски дуготрајан и скуп.

Испод можете пронаћи најважнији код за обуку класификатора језгра

Поставите функцију кернел високе димензије

  • инпут_дим = 14
  • оутпут_дим = 5000
  • стддев = 4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm') 

Подесите хиперпараметар Л2

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)