Gauso branduolys mašininiame mokyme: branduolio metodų pavyzdžiai

Šios pamokos tikslas - padaryti duomenų rinkinį linijiniu būdu atskiriamą. Pamoka yra padalinta į dvi dalis:

  1. Funkcijos transformacija
  2. Mokykite branduolio klasifikatorių naudodami „Tensorflow“

Pirmoje dalyje suprasite branduolio metodo idėją mašininiame mokymesi, o antroje dalyje pamatysite, kaip mokyti branduolio klasifikatorių naudojant „Tensorflow“. Naudosite suaugusiųjų duomenų rinkinį. Šio duomenų rinkinio tikslas yra klasifikuoti pajamas, mažesnes nei 50 tūkst., Žinant kiekvieno namų ūkio elgesį.

Šioje pamokoje sužinosite

  • Kodėl jums reikalingi branduolio metodai?
  • Kas yra mašininio mokymosi branduolys?
  • Branduolio metodų tipai
  • Traukinio Gauso branduolio klasifikatorius su „TensorFlow“

Kodėl jums reikalingi branduolio metodai?

Kiekvieno klasifikatoriaus tikslas yra teisingai numatyti klases. Tam duomenų rinkinį reikėtų atskirti. Pažvelkite į žemiau esantį siužetą; gana paprasta suprasti, kad visi taškai virš juodosios linijos priklauso pirmajai klasei, o kiti taškai - antrajai klasei. Tačiau labai retai yra toks paprastas duomenų rinkinys. Daugeliu atvejų duomenys nėra atskiriami. Mašininio mokymosi branduolio metodai naiviems klasifikatoriams, pavyzdžiui, logistinei regresijai, suteikia sunkumų.

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

Žemiau esančiame paveikslėlyje pateikiame duomenų rinkinį, kuris nėra tiesiškai atskiriamas. Jei nubrėžtume tiesią liniją, dauguma taškų nebus klasifikuojami teisingoje klasėje.

Vienas iš būdų išspręsti šią problemą yra paimti duomenų rinkinį ir transformuoti duomenis į kitą funkcijų žemėlapį. Tai reiškia, kad naudosite funkciją kito plano duomenims transformuoti, kuris turėtų būti tiesinis.

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

Duomenys iš aukščiau pateikto paveikslo yra 2D Gauso branduolio plane, kurio negalima atskirti. Galite pabandyti šiuos duomenis transformuoti į tris dimensijas, tai reiškia, kad sukursite figūrą su 3 ašimis.

Savo Gauso branduolio pavyzdyje mes pritaikysime daugianario atvaizdavimą, kad mūsų duomenys būtų 3D matmenyje. Duomenų transformavimo formulė yra tokia.

Norėdami sukurti naujų funkcijų žemėlapius, jūs apibrėžiate funkciją „Gaussian Kernel Python“

Norėdami koduoti aukščiau pateiktą formulę, galite naudoti numerį:

Formulė Lygiavertis „Numpy“ kodas
x x [:, 0] **
y x [:, 1]
x 2 x [:, 0] ** 2
np.sqrt (2) *
xy x [:, 0] * x [:, 1]
y 2 x [:, 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

Naujas kartografavimas turėtų būti trijų matmenų su 16 taškų

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

Padarykime naują diagramą su atitinkamai 3 ašimis, x, y ir z.

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

Mes matome pagerėjimą, tačiau jei pakeisime siužeto orientaciją, akivaizdu, kad duomenų rinkinį dabar galima atskirti

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

Norėdami manipuliuoti dideliu duomenų rinkiniu ir gali tekti sukurti daugiau nei 2 aspektus, naudodamiesi aukščiau pateiktu metodu susidursite su didele problema. Tiesą sakant, turite transformuoti visus duomenų taškus, o tai akivaizdžiai nėra tvaru. Tai užtruks jums per amžius, o jūsų kompiuteryje gali trūkti atminties.

Dažniausias būdas įveikti šią problemą yra branduolio naudojimas .

Kas yra mašininio mokymosi branduolys?

Idėja yra naudoti aukštesnio matmens funkcijų erdvę, kad duomenys būtų beveik atskiriami, kaip parodyta aukščiau esančiame paveikslėlyje.

Yra daug didesnių matmenų erdvių, kad duomenų taškai būtų atskirti. Pavyzdžiui, mes parodėme, kad daugianario atvaizdavimas yra puiki pradžia.

Mes taip pat įrodėme, kad turint daug duomenų, ši transformacija nėra efektyvi. Vietoj to, naudodamiesi mašininio mokymosi branduolio funkcija, galite modifikuoti duomenis, nepakeisdami naujo funkcijų plano.

Branduolio magija yra rasti funkciją, kuri išvengtų visų problemų, kurias reiškia didelio matmens skaičiavimas. Branduolio rezultatas yra skaliaras, arba kitaip sakant, mes grįžome į vienmatę erdvę

Radę šią funkciją, galite ją prijungti prie standartinio linijinio klasifikatoriaus.

Pažiūrėkime pavyzdį, kaip suprasti branduolio mašininio mokymosi sampratą. Jūs turite du vektorius x1 ir x2. Tikslas yra sukurti aukštesnį matmenį naudojant daugianario atvaizdavimą. Išvestis yra lygi taškinio naujojo žemėlapio sandaugai. Pagal aukščiau pateiktą metodą turite:

  1. Transformuokite x1 ir x2 į naują matmenį
  2. Apskaičiuokite taškinį produktą: bendras visiems branduoliams
  3. Transformuokite x1 ir x2 į naują matmenį

Norėdami naudoti aukštesnį aspektą, galite naudoti aukščiau sukurtą funkciją.

## Kernelx1 = np.array([3,6])x2 = np.array([10,10])x_1 = mapping(x1, x2)print(x_1) 

Rezultatas

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

Apskaičiuokite taškinį sandaugą

Norėdami apskaičiuoti taškų sandaugą tarp pirmo ir antro vektoriaus, saugomo x_1, galite naudoti numerio objekto tašką.

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

Išvestis yra 8100. Matote problemą, kad galėtumėte apskaičiuoti taškinį produktą, turite išsaugoti atmintyje naują funkcijų žemėlapį. Jei turite duomenų rinkinį su milijonais įrašų, jis skaičiavimo požiūriu neveiksmingas.

Vietoj to, naudodami daugianario branduolį galite apskaičiuoti taškų sandaugą, neperskirdami vektoriaus. Ši funkcija apskaičiuoja x1 ir x2 taškų sandaugą taip, tarsi šie du vektoriai būtų transformuoti į aukštesnį matmenį. Kitaip sakant, branduolio funkcija apskaičiuoja taškinio produkto rezultatus iš kitos ypatybės vietos.

Daugialypio branduolio funkciją „Python“ galite parašyti taip.

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

Tai dviejų vektorių taškinio sandaugos galia. Žemiau grąžinate antrąjį polinomo branduolio laipsnį. Rezultatas yra lygus kitam metodui. Tai yra branduolio magija.

polynomial_kernel(x1, x2, p=2)8100 

Branduolio metodų tipai

Yra daugybė skirtingų branduolio metodų. Paprasčiausias yra tiesinis branduolys. Ši funkcija gana gerai veikia klasifikuojant tekstą. Kitas branduolys yra:

  • Daugianario branduolys
  • Gauso branduolys

Pavyzdyje su „TensorFlow“ naudosime Random Fourier. „TensorFlow“ turi sąmatos sudarytoją, kad būtų galima apskaičiuoti naujos funkcijos erdvę. Gauso filtro funkcija yra Gauso branduolio funkcijos aproksimacija.

Gauso filtravimo funkcija apskaičiuoja duomenų taškų panašumą daug didesnėje erdvėje.

Traukinio Gauso branduolio klasifikatorius su „TensorFlow“

Algoritmo tikslas yra klasifikuoti namų ūkį, uždirbantį daugiau nei 50 tūkst.

Įvertinsite logistinį branduolio regresijos mašininį mokymąsi, kad turėtumėte etalono modelį. Po to mokysite branduolio klasifikatorių, kad sužinotumėte, ar galite pasiekti geresnių rezultatų.

Naudojate šiuos suaugusiųjų duomenų rinkinio kintamuosius:

  • amžiaus
  • darbo klasė
  • fnlwgt
  • švietimas
  • edukacijos_skaita
  • santuokinis
  • užsiėmimas
  • santykiai
  • lenktynės
  • seksas
  • kapitalo prieaugio
  • kapitalo praradimas
  • darbo valandos
  • Gimtoji šalis
  • etiketė

Prieš treniruodamiesi ir vertindami modelį, elkitės taip:

  • 1 žingsnis) Importuokite bibliotekas
  • 2 žingsnis) Importuokite duomenis
  • 3 žingsnis. Paruoškite duomenis
  • 4 žingsnis) Sukurkite input_fn
  • 5 žingsnis) Sukurkite logistinį modelį: pradinis modelis
  • 6 žingsnis) Įvertinkite modelį
  • 7 žingsnis) Sukurkite branduolio klasifikatorių
  • 8 žingsnis) Įvertinkite branduolio klasifikatorių

1 žingsnis) Importuokite bibliotekas

Norėdami importuoti ir mokyti branduolio modelius dirbtiniame intelekte, turite importuoti tensorflow, pandas ir numpy

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

2 žingsnis) Importuokite duomenis

Jūs atsisiunčiate duomenis iš šios svetainės ir importuojate juos kaip „pandos“ duomenų rėmą.

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

Dabar, kai traukinys ir bandymų rinkinys yra apibrėžti, galite pakeisti stulpelio etiketę iš eilutės į sveiką skaičių. „tensorflow“ nepriima etiketės eilutės vertės.

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 žingsnis. Paruoškite duomenis

Duomenų rinkinyje yra tiek tęstinių, tiek kategorinių ypatybių. Gera praktika yra ištisinių kintamųjų reikšmių standartizavimas. Galite naudoti „sci-kit learn“ funkciją „StandardScaler“. Jūs taip pat sukuriate vartotojo apibrėžtą funkciją, kad būtų lengviau konvertuoti traukinį ir bandymų rinkinį. Atkreipkite dėmesį, kad jūs sujungiate tęstinius ir kategorinius kintamuosius į bendrą duomenų rinkinį, o masyvas turėtų būti tokio tipo: 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 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 

Transformatoriaus funkcija yra paruošta, galite konvertuoti duomenų rinkinį ir sukurti funkciją 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) 

Kitame etape mokysite logistinę regresiją. Tai suteiks jums bazinį tikslumą. Tikslas yra įveikti pradinę padėtį kitu algoritmu, būtent su branduolio klasifikatoriumi.

4 žingsnis) Sukurkite logistinį modelį: pradinis modelis

Sukurkite elementų stulpelį su objekto real_valued_column. Tai užtikrins, kad visi kintamieji būtų tankūs skaitiniai duomenys.

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

Įvertiklis apibrėžiamas naudojant „TensorFlow Estimator“, nurodote funkcijų stulpelius ir kur išsaugoti diagramą.

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} 

Treniruosite logisitc regresiją naudodamiesi 200 dydžio mini partijomis.

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

Galite mokyti modelį naudodami 1 000 iteracijų

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 žingsnis) Įvertinkite modelį

Norėdami įvertinti modelį, nustatykite skaičiaus skaičiuoklę. Vertinimui naudojate visą duomenų rinkinį

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

Turite 82 procentų tikslumą. Kitame skyriuje pabandysite įveikti logistikos klasifikatorių su branduolio klasifikatoriumi

7 žingsnis) Sukurkite branduolio klasifikatorių

Branduolio vertintojas bent jau konstrukcijos požiūriu ne taip skiriasi nuo tradicinio tiesinio klasifikatoriaus. Idėja yra naudoti aiškaus branduolio galią su tiesiniu klasifikatoriumi.

Norint mokyti branduolio klasifikatorių, jums reikia dviejų iš anksto nustatytų skaičiuoklių, esančių „TensorFlow“

  • „RandomFourierFeatureMapper“
  • Branduolio linijinis klasifikatorius

Pirmame skyriuje sužinojote, kad naudodami branduolio funkciją žemą matmenį turite paversti aukštu. Tiksliau, naudosite Random Fourier, kuris yra Gauso funkcijos aproksimacija. Laimei, „Tensorflow“ bibliotekoje yra funkcija: RandomFourierFeatureMapper. Modelį galima išmokyti naudojant „KernelLinearClassifier“ vertiklį.

Norėdami sukurti modelį, atlikite šiuos veiksmus:

  1. Nustatykite aukšto matmens branduolio funkciją
  2. Nustatykite hiperparametrą L2
  3. Sukurkite modelį
  4. Mokykite modelį
  5. Įvertinkite modelį

A žingsnis. Nustatykite aukšto matmens branduolio funkciją

Dabartiniame duomenų rinkinyje yra 14 funkcijų, kurias transformuosite į naują aukštą 5 000 dimensijų vektoriaus matmenį. Norėdami naudoti transformaciją, naudojate atsitiktines Furjė funkcijas. Jei prisiminsite Gauso branduolio formulę, pažymėsite, kad reikia apibrėžti standartinio nuokrypio parametrą. Šis panašumo mato parametras valdomas klasifikuojant.

Visus „RandomFourierFeatureMapper“ parametrus galite suderinti su:

  • įvesties_dim = 14
  • išėjimo_dim = 5000
  • stddev = 4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm') 

Turite sukonstruoti branduolio žemėlapį naudodami anksčiau sukurtus funkcijų stulpelius: feat_column

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

B žingsnis) Nustatykite L2 hiperparametrą

Kad išvengtumėte per didelio įrengimo, jūs baudžiate nuostolių funkciją naudodamiesi reguliatoriumi L2. Jūs nustatote L2 hiperparametrą į 0,1, o mokymosi greitį - į 5

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

C žingsnis. Sukurkite modelį

Kitas žingsnis yra panašus į tiesinę klasifikaciją. Naudojate įmontuotą skaičiuoklę „KernelLinearClassifier“. Atminkite, kad pridedate anksčiau apibrėžtą branduolio žemėlapį ir pakeisite modelio katalogą.

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

D žingsnis) Išmokykite modelį

Dabar, kai yra sukurtas branduolio klasifikatorius, esate pasirengęs jį mokyti. Jūs pasirenkate kartoti 2000 kartų modelį

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

E žingsnis) Įvertinkite modelį

Paskutinis, bet ne mažiau svarbus dalykas - jūs įvertinate savo modelio našumą. Turėtumėte sugebėti įveikti logistinę regresiją.

# 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

Galutinis tikslumas yra 84%, tai yra 2% pagerėjimas, palyginti su logistine regresija. Yra tikslumo tobulinimo ir skaičiavimo išlaidų kompromisas. Turite pagalvoti, ar 2% patobulinimas vertas skirtingo klasifikatoriaus sugaištamo laiko ir ar tai daro įtikinamą poveikį jūsų verslui.

Santrauka

Branduolys yra puikus įrankis netiesinius duomenis paversti (beveik) tiesiniais. Šio metodo trūkumas yra tai, kad jis skaičiavimams užima daug laiko ir yra brangus.

Žemiau galite rasti svarbiausią kodą, kad išmokytumėte branduolio klasifikatorių

Nustatykite aukšto matmens branduolio funkciją

  • įvesties_dim = 14
  • išėjimo_dim = 5000
  • stddev = 4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm') 

Nustatykite hiperparametrą L2

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

Sukurkite modelį

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

Mokykite modelį

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

Įvertinkite modelį

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

Įdomios straipsniai...