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.
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 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()
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()
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.
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² | x[:,0]**2 |
| np.sqrt(2)* | |
| xy | x[:,0]*x[:,1] |
| y² | 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()
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()
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:
- 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
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 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:
- Kitaplıkları içe aktar
- Verileri içeri aktarın
- Verileri hazırlayın
- Lojistik modeli oluşturun: temel model
- Modeli değerlendirin
- Ç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 = {'<=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)
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 = ['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
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('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: {'_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
{'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}
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:
- 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 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='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: {'_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'}
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: '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>]}})
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 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.





