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

⚡ Akıllı Özet

Gauss çekirdek yöntemleri, yüksek boyutlu özellik haritası oluşturmaya gerek kalmadan, ayrıştırılamayan verileri doğrusal olarak ayrıştırılabilir hale getirir. Bu kılavuz, polinom haritasını göstermektedir.ping Önce elle hesaplamalar yapar, ardından TensorFlow'da rastgele bir Fourier çekirdek sınıflandırıcı eğitir.

  • 🔘 Ayrılabilirlik problemi: Doğrusal sınıflandırıcılar, orijinal özellik uzayında sınıfları ayıran düz bir çizgi bulunmadığı durumlarda başarısız olur.
  • ☑️ Polinom haritasıping: x kare, kök-iki xy ve y kare dönüşümü, iki boyutu üçe çıkarır ve örnek verileri ayırır.
  • Çekirdek hilesi: Bir çekirdek, eşlenmiş vektörlerin nokta çarpımını doğrudan döndürür, bu nedenle genişletilmiş özellik haritası asla saklanmaz.
  • 🧪 Üç çekirdek: Doğrusal fonksiyonlar metin sınıflandırmasına uygundur, polinom fonksiyonlar özellik etkileşimlerini yakalar ve Gauss RBF ise mesafeye dayalı benzerliği ölçer.
  • TensorFlow derlemesi: RandomFourierFeatureMapper, KernelLinearClassifier'ın Ftrl optimizasyon algoritmasıyla eğitilmesinden önce 14 özelliği 5,000 boyuta yansıtır.
  • 📈 Ölçülen sonuç: Çekirdek sınıflandırıcı, lojistik temel modelin 0.82353663'lük doğruluğuna karşılık 0.83975184'lük bir doğruluk oranına ulaşmaktadır.

Makine Öğreniminde Gauss Çekirdeği

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 kullanarak bir Kernel sınıflandırıcı eğitin.

Birinci bölümde, makine öğreniminde çekirdek (kernel) yönteminin ardındaki fikri anlayacaksınız, ikinci bölümde ise bir çekirdek sınıflandırıcıyı nasıl eğiteceğinizi göreceksiniz. TensorFlowYetişkin veri setini kullanacaksınız. Bu veri setinin amacı, her hanehalkının davranışını bilerek, 50 doların altındaki ve üzerindeki gelirleri 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 bir şekilde tahmin etmektir. Bunun için veri setinin ayrılabilir olması gerekir. Aşağıdaki grafiğe 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 kolaydır. Ancak, bu kadar basit bir veri setine sahip olmak son derece nadirdir. Çoğu durumda, veriler ayrılabilir değildir ve ayrılabilir olmayan veriler, lojistik regresyon gibi basit sınıflandırıcılara zorluk çıkarı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()

Doğrusal olarak ayrılabilir bir veri kümesinin düz siyah bir çizgiyle net bir şekilde ikiye ayrıldığı dağılım grafiği.

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

Bu sorunu çözmenin bir yolu, veri setini alıp verileri başka bir özellik haritasına dönüştürmektir. Bu, verileri doğrusal olarak ayrılabilir başka bir düzleme taşımak için 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()

İki sınıfın üst üste geldiği ve onları ayıran düz bir çizginin bulunmadığı bir veri kümesinin dağılım grafiği.

Yukarıdaki şekildeki veriler 2 boyutlu bir düzlemde yer almaktadır ve ayrıştırılamaz. Bu verileri üç boyutlu hale dönüştürmeyi deneyebilirsiniz; bu da 3 eksenli bir şekil oluşturmanız anlamına gelir.

Gauss çekirdeği örneğimizde, bir polinom dönüşümü uygulayacağız.ping Verilerimizi üçüncü bir boyuta taşımak için. Verileri dönüştürme formülü aşağıdaki gibidir.

Polinom haritasıping x ve y'nin phi formülü, x kare, karekök iki çarpı xy, y kareye eşittir.

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

Sen kullanabilirsiniz Dizi Yukarıdaki formülü kodlamak için. Aşağıdaki her satır, haritanın bir terimini eşleştirir.ping Bunu üreten dizi ifadesiyle birlikte, küçük resim iki faktörün karekökünü işaretler.

formül Eşdeğer NumPy kodu
x x[:,0]
y x[:,1]
x[:,0]**2
Polinom haritasından iki faktörün karekökü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			

Yeni haritaping 3 boyutu ve 16 noktası vardır.

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

Şimdi x, y ve z eksenlerinden oluşan 3 eksenli yeni bir grafik oluşturun.

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

Haritalanmış noktaların 30 derecelik bir yükseklikten ve 185 derecelik bir azimuttan bakıldığında elde edilen üç boyutlu dağılım grafiği.

Bir iyileşme görüyoruz, ancak grafiğin yönünü değiştirirsek veri setinin artık ayrılabilir olduğu açıkça ortaya çıkıyor.

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

Aynı üç boyutlu grafik, iki sınıfı tek bir düzlemin ayırdığı şekilde yatay olarak döndürülmüştür.

Eğer büyük bir veri kümesini işlemeniz ve 2'den fazla boyut oluşturmanız gerekiyorsa, yukarıdaki yöntemle büyük bir sorunla karşılaşacaksınız. Aslında, tüm veri noktalarını dönüştürmeniz gerekecek ki bu açıkça sürdürülebilir bir yöntem değil. Çok uzun zaman alacak ve bilgisayarınızın belleği yetersiz kalabilir.

Bu sorunun üstesinden gelmenin en yaygın yolu bir çekirdek (kernel) kullanmaktır.

Makine öğreniminde Çekirdek nedir?

Amaç, 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ı birbirinden ayırmayı sağlayan birçok yüksek boyutlu uzay vardır. Örneğin, polinom haritasının bunu sağladığını gösterdik.ping harika bir başlangıç.

Ayrıca, çok fazla veriyle bu dönüşümlerin verimli olmadığını da gösterdik. Bunun yerine, makine öğreniminde bir çekirdek fonksiyonu kullanarak verileri yeni bir özellik düzlemine geçmeden değiştirebilirsiniz.

Çekirdeğin sihri, yüksek boyutlu hesaplamanın ima ettiği tüm sorunlardan kaçınan bir fonksiyon bulmaktır. Çekirdeğin sonucu bir skalerdir veya başka bir deyişle, tek boyutlu uzaya geri dönmüş oluruz.

Bu fonksiyonu bulduktan sonra, onu standart doğrusal sınıflandırıcıya entegre edebilirsiniz.

İşte Çekirdek Makine Öğrenimi kavramını somutlaştıran bir örnek. Elinizde x1 ve x2 olmak üzere iki vektör var. Amaç, bir polinom dönüşümü kullanarak daha yüksek bir boyut oluşturmaktır.pingÇıktı, yeni özellik haritasının nokta çarpımına eşittir. Yukarıdaki yöntemden yola çıkarak ş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

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

Nesne noktasını kullanabilirsiniz. Dizi x_1'de saklanan birinci ve ikinci vektör arasındaki nokta çarpımını hesaplamak.

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

Çıktı 8100. Sorunu görüyorsunuz: Nokta çarpımını hesaplamak için bellekte yeni bir özellik haritası saklamanız gerekiyor. Milyonlarca kayıt içeren bir veri setiniz varsa, bu hesaplama açısından verimsizdir.

Bunun yerine, vektörü dönüştürmeden nokta çarpımını hesaplamak için polinom çekirdeğini kullanabilirsiniz. Bu fonksiyon, x1 ve x2 vektörlerinin daha yüksek boyuta dönüştürülmüş gibi nokta çarpımını hesaplar. Başka bir deyişle, bir çekirdek fonksiyonu, nokta çarpımının sonucunu başka bir özellik uzayından hesaplar.

Polinom çekirdek fonksiyonunu şu şekilde yazabilirsiniz: Python aşağıdaki gibi.

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

Çok sayıda farklı çekirdek (kernel) tekniği mevcuttur. En basiti doğrusal çekirdektir (linear kernel). Bu fonksiyon metin sınıflandırması için oldukça iyi çalışır. Diğer çekirdekler şunlardır:

  • polinom çekirdek
  • Gauss Çekirdeği

Aşağıdaki tablo, her birinin ne işe yaradığını ve uygulayıcıların bunları ne zaman kullandığını özetlemektedir.

çekirdek Ne hesaplıyor? Tipik kullanım
doğrusal Orijinal özellik alanındaki düz nokta çarpımı Zaten ayrılabilir veriler ve yüksek boyutlu metin özellikleri
Polinom Özellik etkileşimlerini yakalayan, p derecesine yükseltilmiş nokta çarpımı. Etkileşimlerin önemli olduğu bilindiğinde kavisli sınırlar
Gauss (RBF) Noktalar birbirinden uzaklaştıkça sıfıra doğru azalan, mesafeye dayalı bir benzerlik katsayısı. Sınır şekli bilinmediğinde genellikle ilk tercih edilen yöntemdir.

TensorFlow örneğinde, rastgele Fourier özelliklerini kullanacağız. TensorFlow'un yeni özellik uzayını hesaplamak için yerleşik bir tahminleyicisi vardır. Rastgele Fourier özellik eşleyicisi, aşağıda gösterilen Gauss çekirdek fonksiyonunun bir yaklaşımıdır.

Gauss çekirdeği formülü: e üzeri eksi x eksi y'nin karesel normunun iki sigma kareye bölünmesi

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

Teorik temeller ortaya konulduktan sonra, bu kılavuzun geri kalanında Gauss çekirdeğinin gerçek bir veri kümesi üzerinde nasıl çalıştığı ele alınacaktır.

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.

Öncelikle bir kıyaslama modeli oluşturmak için lojistik regresyonu değerlendireceksiniz. Ardından, daha iyi sonuçlar alıp alamayacağınızı görmek için bir Kernel sınıflandırıcı 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ğitmeden ve değerlendirmeden önce aşağıdaki adımları izleyeceksiniz:

  1. Kitaplıkları içe aktar
  2. Verileri içeri aktarın
  3. Verileri hazırlayın
  4. Lojistik modeli oluşturun: temel model
  5. Modeli değerlendirin
  6. Çekirdek sınıflandırıcıyı oluşturun ve değerlendirin.

Sürüm notu: Aşağıdaki her kod parçası TensorFlow 1.x'i hedeflemektedir. real_valued_column, RandomFourierFeatureMapper ve KernelLinearClassifier'ı sağlayan tf.contrib ad alanı TensorFlow 2.0'da kaldırılmıştır ve tf.estimator'ın kendisi de TensorFlow 2.16'da kaldırılmıştır. Mevcut bir sürümde, aynı işlem hattını tf.keras.layers.experimental.RandomFourierFeatures katmanı ve ardından bir Dense çıktı katmanı ile veya scikit-learn'den RBFSampler ve SGDClassifier çiftiyle oluşturun.

Adım 1) Kütüphaneleri içe aktarın

Çekirdek modellerini içe aktarmak ve eğitmek Yapay ZekaTensorFlow'u içe aktarmanız gerekiyor. pandalar ve 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

Adım 2) Verileri içe aktarın

Verileri şuradan indiriyorsunuz: UCI yetişkin veri seti sayfası ve bunu bir pandas DataFrame olarak içe aktarın.

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

Eğitim ve test veri setleri tanımlandıktan sonra, sütun etiketini metinden tamsayıya değiştirebilirsiniz. TensorFlow, etiket için metin değerlerini kabul etmez.

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)			

Adım 3) 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. Bunun için StandardScaler fonksiyonunu kullanabilirsiniz. scikit-öğrenmeAyrıca, eğitim ve test setlerini dönüştürmeyi kolaylaştırmak için kullanıcı tanımlı bir fonksiyon da oluşturuyorsunuz. Sürekli ve kategorik değişkenleri ortak bir veri setinde birleştirdiğinizi ve dizinin float32 türünde olması gerektiğini unutmayın.

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

Dönüştürücü fonksiyon hazır, bu nedenle 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.

Adım 4) 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(&#x27;features', dimension=14)

Tahminleyici, TensorFlow Estimator API'si kullanılarak tanımlanır; özellik sütunlarını ve grafiğin kaydedileceği yeri siz belirtirsiniz.

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}

Lojistik regresyon modelini 200'lük 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 yineleme ile 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>

Adım 5) Modeli değerlendirin

Modeli değerlendirmek için NumPy giriş fonksiyonunu tanımlarsınız. Değerlendirme için tüm test setini 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
{&#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}

Doğruluk oranınız %82. Bir sonraki bölümde, lojistik sınıflandırıcıyı Kernel sınıflandırıcı ile geçmeyi deneyeceksiniz.

Adım 6) Çekirdek sınıflandırıcısını oluşturun

Çekirdek tahmincisi, en azından yapısı bakımından geleneksel doğrusal sınıflandırıcıdan çok farklı değildir. Buradaki fikir, açık bir çekirdek haritasının gücünü birleştirmektir.ping Doğrusal sınıflandırıcı ile.

Ç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, düşük boyutu bir çekirdek fonksiyonu kullanarak yüksek boyuta dönüştürmeniz gerektiğini öğrendiniz. Daha doğrusu, Gauss fonksiyonunu yaklaşık olarak temsil eden rastgele Fourier özelliklerini kullanacaksınız. TensorFlow 1.x bu eşlemeyi sağlar.ping RandomFourierFeatureMapper olarak adlandırılan 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 fonksiyonunu ayarlayın

Mevcut veri seti, 5,000 boyutlu yeni bir vektöre dönüştüreceğiniz 14 özellik içermektedir. Dönüşümü gerçekleştirmek için rastgele Fourier özelliklerini kullanıyorsunuz. Gauss Çekirdeği formülünü hatırlarsanız, tanımlanması gereken bir standart sapma parametresi olduğunu fark edersiniz. Bu parametre, sınıflandırma sırasında kullanılan benzerlik ölçüsünü kontrol eder: küçük bir standart sapma, çekirdeğin yalnızca çok yakın noktaları benzer olarak ele almasını sağlarken, büyük bir standart sapma karar sınırını yumuşatır.

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

  • giriş_dim = 14
  • çıkış_boyutu = 5000
  • standart sapma = 4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name=&#x27;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ı uyumun önüne geçmek için, kayıp fonksiyonunu L2 düzenleyici ile cezalandırırsınız. L2 hiperparametresini 0.1'e ve öğrenme oranını 5'e ayarlarsınız.

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

C) Modeli oluşturun

Bir sonraki adım doğrusal sınıflandırmaya benzer. Dahili tahminleyici KernelLinearClassifier'ı kullanıyorsunuz. Daha önce tanımlanan çekirdek eşleyiciyi eklemeniz ve model dizinini değiştirmeniz gerektiğini unutmayın.

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

Aşağıdaki kullanım dışı bırakma uyarıları TensorFlow 1.x'te beklenen bir durumdur, çünkü kernel_methods modülü daha eski tf.contrib.learn tahmincileri üzerine kurulmuştur.

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 Adımı) Modeli eğitin

Çekirdek sınıflandırıcı oluşturulduktan sonra, onu eğitmeye hazırsınız. Modeli 2,000 kez yinelemeyi seçiyorsunuz.

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

Nihai doğruluk oranı %84 olup, lojistik regresyon temel çizgisinin yaklaşık 1.6 puan üzerindedir (0.83975184'e karşılık 0.82353663). Doğruluk artışı ile hesaplama maliyeti arasında bir denge söz konusudur. Bu iyileşmenin, daha ağır sınıflandırıcı tarafından tüketilen zamana değip değmeyeceğini ve işletmeniz üzerinde önemli bir etkiye sahip olup olmadığını düşünmeniz gerekir.

SSS

Çekirdek yöntemi, yüksek boyutlu bir dönüşümden sonra iki vektörün sahip olacağı nokta çarpımını hesaplar.pingo haritayı hiç oluşturmadanpingBu eğitimde kullanılan polynomial_kernel fonksiyonu doğrudan 8100 değerini döndürür; bu değer, açık üç boyutlu dönüşümün ürettiği değerle aynıdır.

Hayır. tf.contrib TensorFlow 2.0'da, tf.estimator ise 2.16'da kaldırıldı, bu nedenle real_valued_column, RandomFourierFeatureMapper ve KernelLinearClassifier artık yok. Bunun yerine Dense çıktısı olan tf.keras.layers.experimental.RandomFourierFeatures katmanını veya SGDClassifier ile RBFSampler'ı kullanın.

Otomatik arama araçları, paralel çalıştırmalar boyunca çekirdek türünü, dereceyi, gama veya standart sapmayı ve düzenleme gücünü tarar ve ardından bunları çapraz doğrulanmış puana göre sıralar. Çekirdek seçimini ölçülü bir karşılaştırmaya dönüştürürler, ancak yine de arama bütçesini ve puanlama ölçütünü siz belirlersiniz.

İskeleti hızla oluşturur: özellik ölçeklendirme, eşleyici çağrısı, tahminleyici ve değerlendirme döngüsü. Önerileri ilk taslak olarak değerlendirin, çünkü GitHub Yardımcı Pilotu Mevcut sürümlerde artık içe aktarılamayan, kaldırılmış TensorFlow 1.x API'lerini kolayca yeniden üretir.

Bu, benzerlik çanının genişliğini belirler. Küçük bir standart sapma, yalnızca çok yakın noktaların benzer olarak sayılmasını sağlar ve bu da aşırı uyum sağlayabilen dar, dalgalı bir sınır oluşturur. Büyük bir standart sapma ise sınırı yumuşatır ve modeli doğrusal bir uyuma doğru geri döndürür.

Bu, Gauss çekirdeğini yaklaşık olarak hesaplamak için kullanılan rastgele Fourier özelliklerinin sayısıdır. Daha fazla özellik, çekirdeği daha yakından hesaplar ve genellikle doğruluğu artırır; ancak bu, daha geniş bir ağırlık vektörü ve her veri kümesinde daha yavaş eğitim pahasına olur.

Kesin bir çekirdek yöntemi, her eğitim noktası çiftini karşılaştırır, bu nedenle maliyet kabaca örnek sayısının karesiyle artar. Rastgele Fourier özellikleri ise çekirdeği sabit genişlikli bir projeksiyonla yaklaşık olarak hesaplayarak bu sorunu aşar.

Çekirdek yöntemi özellik haritasını düzeltir.ping Önceden veri toplar ve yalnızca doğrusal ağırlıkları öğrenir, bu nedenle az miktarda veriyle bile hızlı bir şekilde eğitilir. sinir ağı Kendi temsil biçimini öğrenir ve bu da görüntüler gibi çok büyük, yapılandırılmamış veri kümelerinde daha iyi ölçeklenebilirlik sağlar.

Bu yazıyı şu şekilde özetleyin: