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:
- Özellik dönüşümü
- 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()
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()
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.
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 |
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()
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()
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:
- x1 ve x2'yi yeni bir boyuta dönüştürün
- 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
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.
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:
- Yüksek boyutlu Çekirdek işlevini ayarlayın
- L2 hiperparametresini ayarlayın
- Modeli oluşturun
- Modeli eğitin
- 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)