Makine Öğreniminde Gauss Çekirdeği: Python Çekirdek Yöntemleri

Bu eğitimin amacı bir veri kümesini doğrusal olarak ayrılabilir hale getirmektir. Öğretici iki bölüme ayrılmıştır:

  1. Özellik dönüşümü
  2. Tensorflow ile Çekirdek sınıflandırıcıyı eğitme

İlk bölümde, Makine Öğrenmesinde bir Kernel yönteminin ardındaki fikri anlayacaksınız, ikinci bölümde ise Tensorflow ile bir çekirdek sınıflandırıcıyı nasıl eğiteceğinizi göreceksiniz. Yetişkin veri setini kullanacaksınız. Bu veri setinin amacı, her hanenin davranışını bilerek 50 binin altındaki ve üstündeki geliri sınıflandırmaktır.

Neden Çekirdek Yöntemlerine ihtiyacınız var?

Her sınıflandırıcının amacı sınıfları doğru tahmin etmektir. Bunun için veri kümesinin ayrılabilir olması gerekir. Aşağıdaki şemaya bakın; siyah çizginin üzerindeki tüm noktaların birinci sınıfa, diğer noktaların ise ikinci sınıfa ait olduğunu görmek oldukça basittir. Ancak bu kadar basit bir veri setine sahip olmak son derece nadirdir. Çoğu durumda veriler ayrılamaz. Makine Öğrenimindeki çekirdek yöntemleri, lojistik regresyon gibi saf sınıflandırıcılara zor anlar yaşatır.

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

Çekirdek Yöntemi

Aşağıdaki şekilde doğrusal olarak ayrılamayan bir veri kümesini çiziyoruz. Düz bir çizgi çizersek noktaların çoğu doğru sınıfta sınıflandırılmayacaktır.

Bu sorunu çözmenin bir yolu, veri kümesini alıp verileri başka bir özellik haritasına dönüştürmektir. Bu, verileri başka bir planda dönüştürmek için doğrusal olması gereken bir fonksiyon kullanacağınız anlamına gelir.

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

Çekirdek Yöntemi

Yukarıdaki şekildeki veriler, ayrılamayan 2 boyutlu Gauss Çekirdek planındadır. Bu verileri üç boyutlu hale getirmeyi deneyebilirsiniz, yani 3 eksenli bir şekil oluşturmuş olursunuz.

Gaussian Kernel örneğimizde verilerimizi 3 boyutlu boyuta getirmek için polinom eşleme uygulayacağız. Verileri dönüştürme formülü aşağıdaki gibidir.

Çekirdek Yöntemi

Gauss Çekirdeğinde bir fonksiyon tanımlarsınız Python yeni özellik haritaları oluşturmak için

Sen kullanabilirsiniz dizi Yukarıdaki formülü kodlamak için:

formül Eşdeğer Numpy Kodu
x x[:,0]**
y x[:,1]
x2 x[:,0]**2
Çekirdek Yöntemi 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			

Yeni haritalama 3 noktalı 16 boyutlu olmalıdır

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

Sırasıyla x, y ve z olmak üzere 3 eksenli yeni bir çizim yapalım.

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

Çekirdek Yöntemi

Bir gelişme görüyoruz ancak grafiğin yönünü değiştirirsek veri kümesinin artık ayrılabilir olduğu açıktır

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

Çekirdek Yöntemi

Büyük bir veri kümesini işlemek için 2'den fazla boyut oluşturmanız gerekebilir, yukarıdaki yöntemi kullanırken büyük bir sorunla karşılaşacaksınız. Aslında tüm veri noktalarını dönüştürmeniz gerekiyor ki bunun sürdürülebilir olmadığı çok açık. Bu işlem uzun zaman alır ve bilgisayarınızın belleği tükenebilir.

Bu sorunu aşmanın en yaygın yolu kullanmaktır. çekirdek.

Makine öğreniminde Çekirdek nedir?

Buradaki fikir, yukarıdaki şekilde gösterildiği gibi verileri neredeyse doğrusal olarak ayrılabilir hale getirmek için daha yüksek boyutlu bir özellik alanı kullanmaktır.

Veri noktalarını ayrılabilir hale getirmek için çok sayıda yüksek boyutlu alan vardır. Örneğin polinom haritalamanın harika bir başlangıç ​​olduğunu gösterdik.

Ayrıca çok fazla veri olduğunda bu dönüşümün verimli olmadığını da gösterdik. Bunun yerine, yeni bir özellik planına geçmeden verileri değiştirmek için Makine Öğrenimi'ndeki Çekirdek işlevini kullanabilirsiniz.

Çekirdeğin büyüsü, yüksek boyutlu hesaplamanın ima ettiği tüm sorunları ortadan kaldıran bir fonksiyon bulmaktır. Çekirdeğin sonucu skalerdir, başka bir deyişle tek boyutlu uzaya geri döndük

Bu fonksiyonu bulduktan sonra onu standart doğrusal sınıflandırıcıya bağlayabilirsiniz.

Çekirdek Makine Öğrenimi kavramını anlamak için bir örnek görelim. İki vektörünüz var, x1 ve x2. Amaç, polinom eşlemesi kullanarak daha yüksek bir boyut oluşturmaktır. Çıktı, yeni özellik haritasının nokta çarpımına eşittir. Yukarıdaki yöntemden şunları yapmanız gerekir:

  1. x1 ve x2'yi yeni bir boyuta dönüştürün
  2. Nokta çarpımını hesaplayın: tüm çekirdekler için ortak
  3. x1 ve x2'yi yeni bir boyuta dönüştürün

Daha yüksek boyutu hesaplamak için yukarıda oluşturulan fonksiyonu kullanabilirsiniz.

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

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

Çıktı

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

Nokta çarpımı hesaplayın

X_1'de depolanan birinci ve ikinci vektör arasındaki nokta çarpımı hesaplamak için numpy'deki nokta nesnesini kullanabilirsiniz.

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

Çıktı 8100. Sorunu görüyorsunuz, nokta çarpımı hesaplamak için hafızaya yeni bir özellik haritası kaydetmeniz gerekiyor. Milyonlarca kayıttan oluşan bir veri kümeniz varsa, hesaplama açısından etkisizdir.

Bunun yerine, polinom çekirdeği vektörü dönüştürmeden nokta çarpımı hesaplamak için. Bu fonksiyon, sanki bu iki vektör bir üst boyuta dönüştürülmüş gibi x1 ve x2'nin nokta çarpımını hesaplar. Başka bir deyişle, bir çekirdek işlevi, nokta çarpımının sonuçlarını başka bir özellik uzayından hesaplar.

Polinom çekirdek fonksiyonunu şu şekilde yazabilirsiniz: Python takip eden

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

İki vektörün nokta çarpımının kuvvetidir. Aşağıda polinom çekirdeğinin ikinci derecesini döndürüyorsunuz. Çıktı diğer yönteme eşittir. Bu çekirdeğin büyüsüdür.

polynomial_kernel(x1, x2, p=2)			
8100

Çekirdek Yöntem Türleri

Pek çok farklı Kernel tekniği mevcut. En basiti doğrusal çekirdektir. Bu işlev metin sınıflandırması için oldukça iyi çalışır. Diğer çekirdek ise:

  • polinom çekirdek
  • Gauss Çekirdeği

Örnekte TensorFlowRastgele Fourier'i kullanacağız. TensorFlow, yeni özellik alanını hesaplamak için yerleşik bir tahmin aracına sahiptir. Gauss filtre fonksiyonu Gauss çekirdek fonksiyonunun bir yaklaşımıdır.

Çekirdek Yöntem Türleri

Gauss filtreleme işlevi, çok daha yüksek boyutlu bir uzaydaki veri noktaları arasındaki benzerliği hesaplar.

TensorFlow ile Gauss Çekirdek sınıflandırıcısını eğitme

Algoritmanın amacı hane halkı kazancını 50 binden fazla veya az olarak sınıflandırmaktır.

Karşılaştırmalı bir modele sahip olmak için lojistik Çekirdek Regresyon Makine Öğrenimini değerlendireceksiniz. Bundan sonra, daha iyi sonuçlar alıp alamayacağınızı görmek için bir Çekirdek sınıflandırıcıyı eğiteceksiniz.

Yetişkin veri setinden aşağıdaki değişkenleri kullanıyorsunuz:

  • yaş
  • çalışma sınıfı
  • fnlwgt
  • eğitim
  • eğitim_num
  • evlilik
  • işgal
  • ilişki
  • yarış
  • seks
  • Sermaye kazancı
  • sermaye_kaybı
  • saat_hafta
  • ana vatan
  • etiket

Modeli eğitip değerlendirmeden önce aşağıdaki şekilde ilerleyeceksiniz:

  • Adım 1) Kütüphaneleri içe aktarın
  • Adım 2) Verileri içe aktarın
  • Adım 3) Verileri hazırlayın
  • Adım 4) input_fn'yi oluşturun
  • Adım 5) Lojistik modeli oluşturun: Temel model
  • Adım 6) Modeli değerlendirin
  • Adım 7) Çekirdek sınıflandırıcısını oluşturun
  • Adım 8) Çekirdek sınıflandırıcısını değerlendirin

) 1 Adım Kitaplıkları içe aktar

Çekirdek modellerini içe aktarmak ve eğitmek Yapay Zekatensorflow'u içe aktarmanız gerekiyor, pandalar ve uyuşuk

#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 Adım Verileri içeri aktarın

Verileri aşağıdakilerden indirin Web sitesi ve onu bir panda veri çerçevesi olarak içe aktarıyorsunuz.

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

Artık eğitim ve test kümesi tanımlandığına göre sütun etiketini dizeden tam sayıya değiştirebilirsiniz. tensorflow, etiket için dize değerini kabul etmez.

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 Adım Verileri hazırlayın

Veri seti hem sürekli hem de kategorik özellikler içermektedir. Sürekli değişkenlerin değerlerini standartlaştırmak iyi bir uygulamadır. Sci-kit Learn'deki StandardScaler fonksiyonunu kullanabilirsiniz. Eğitim ve test setini dönüştürmeyi kolaylaştırmak için kullanıcı tanımlı bir fonksiyon da yaratırsınız. Sürekli ve kategorik değişkenleri ortak bir veri kümesinde birleştirdiğinizi ve dizinin şu türden olması gerektiğini unutmayın: 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

Transformatör fonksiyonu hazır, veri setini dönüştürebilir ve input_fn fonksiyonunu oluşturabilirsiniz.

X_train, y_train = prep_data_str(df_train)
X_test, y_test = prep_data_str(df_test)
print(X_train.shape)			
(32561, 14)

Bir sonraki adımda lojistik regresyonu eğiteceksiniz. Size temel bir doğruluk verecektir. Amaç, temel çizgiyi farklı bir algoritma, yani Çekirdek sınıflandırıcı ile aşmaktır.

) 4 Adım Lojistik modeli oluşturun: Temel model

Özellik sütununu real_valued_column nesnesiyle oluşturursunuz. Tüm değişkenlerin yoğun sayısal veriler olmasını sağlayacaktır.

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

Tahminci, TensorFlow Tahmincisi kullanılarak tanımlanır; özellik sütunlarına ve grafiğin nereye kaydedileceğine talimat verirsiniz.

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}

Logisitc regresyonunu 200 boyutunda mini gruplar kullanarak eğiteceksiniz.

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

Modeli 1.000 iterasyonla eğitebilirsiniz.

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 Adım Modeli değerlendirin

Modeli değerlendirmek için numpy tahmincisini tanımlarsınız. Değerlendirme için veri kümesinin tamamını kullanırsınız

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

Yüzde 82 doğruluk oranınız var. Bir sonraki bölümde lojistik sınıflandırıcıyı Kernel sınıflandırıcıyla yenmeye çalışacaksınız.

) 7 Adım Çekirdek sınıflandırıcısını oluşturma

Çekirdek tahmincisi, en azından yapı açısından, geleneksel doğrusal sınıflandırıcıdan çok farklı değildir. Arkasındaki fikir, açık çekirdeğin gücünü doğrusal sınıflandırıcıyla kullanmaktır.

Çekirdek Sınıflandırıcısını eğitmek için TensorFlow'da mevcut iki önceden tanımlanmış tahminciye ihtiyacınız vardır:

  • RastgeleFourierÖzellikMapper
  • ÇekirdekDoğrusal Sınıflandırıcı

İlk bölümde bir çekirdek fonksiyonu kullanarak düşük boyutu yüksek boyuta dönüştürmeniz gerektiğini öğrendiniz. Daha doğrusu, Gauss fonksiyonunun bir yaklaşımı olan Rastgele Fourier'i kullanacaksınız. Neyse ki Tensorflow'un kütüphanesinde şu fonksiyon var: RandomFourierFeatureMapper. Model, KernelLinearClassifier tahmincisi kullanılarak eğitilebilir.

Modeli oluşturmak için şu adımları izleyeceksiniz:

  1. Yüksek boyutlu Çekirdek işlevini ayarlayın
  2. L2 hiperparametresini ayarlayın
  3. Modeli oluşturun
  4. Modeli eğitin
  5. Modeli değerlendirin

Adım A) Yüksek boyutlu Çekirdek işlevini ayarlayın

Mevcut veri kümesi, 14 boyutlu vektörün yeni yüksek boyutuna dönüştüreceğiniz 5.000 özellik içerir. Dönüşümü gerçekleştirmek için rastgele Fourier özelliklerini kullanırsınız. Gauss Çekirdeği formülünü hatırlarsanız, tanımlanması gereken standart sapma parametresinin olduğunu fark edersiniz. Bu parametre, sınıflandırma sırasında kullanılan benzerlik ölçüsünü kontrol eder.

RandomFourierFeatureMapper'daki tüm parametreleri aşağıdakilerle ayarlayabilirsiniz:

  • giriş_dim = 14
  • çıktı_dim= 5000
  • stddev=4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

Daha önce oluşturulan özellik sütunlarını kullanarak çekirdek eşleyicisini oluşturmanız gerekir: feat_column

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

Adım B) L2 hiperparametresini ayarlayın

Aşırı uyumu önlemek için kayıp fonksiyonunu L2 düzenleyiciyle cezalandırırsınız. L2 hiperparametresini 0.1'e ve öğrenme oranını 5'e ayarladınız

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

Adım C) Modeli oluşturun

Bir sonraki adım doğrusal sınıflandırmaya benzer. Yerleşik tahmin aracı KernelLinearClassifier'ı kullanırsınız. Daha önce tanımlanan çekirdek eşleyiciyi eklediğinizi ve model dizinini değiştirdiğinizi unutmayın.

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

Adım D) Modeli eğitin

Artık Çekirdek sınıflandırıcı oluşturulduğuna göre onu eğitmeye hazırsınız. Modeli 2000 kez yinelemeyi seçersiniz

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

Adım E) Modeli değerlendirin

Son fakat bir o kadar da önemlisi, modelinizin performansını değerlendirirsiniz. Lojistik regresyonu yenebilmelisiniz.

# 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

Nihai doğruluk %84'tür, lojistik regresyonla karşılaştırıldığında %2'lik bir iyileşmedir. Doğruluk iyileştirmesi ile hesaplama maliyeti arasında bir denge vardır. Farklı sınıflandırıcıların harcadığı zamana değip değmeyeceğini ve işletmeniz üzerinde zorlayıcı bir etkisinin olup olmadığını düşünmeniz gerekir.

ÖZET

Çekirdek, doğrusal olmayan verileri (neredeyse) doğrusala dönüştürmek için harika bir araçtır. Bu yöntemin dezavantajı hesaplama açısından zaman alıcı ve maliyetli olmasıdır.

Aşağıda bir çekirdek sınıflandırıcıyı eğitmek için en önemli kodu bulabilirsiniz.

Yüksek boyutlu Çekirdek işlevini ayarlayın

  • giriş_dim = 14
  • çıktı_dim= 5000
  • stddev=4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

L2 hiperparametresini ayarlayın

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

Modeli oluşturun

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

Modeli eğitin

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

Modeli değerlendirin

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