نواة غاوس في التعلم الآلي: Python طرق النواة

الغرض من هذا البرنامج التعليمي هو جعل مجموعة البيانات قابلة للفصل خطيًا. ينقسم البرنامج التعليمي إلى قسمين:

  1. تحويل الميزة
  2. تدريب مصنف Kernel باستخدام Tensorflow

في الجزء الأول، ستفهم الفكرة وراء طريقة Kernel في التعلم الآلي، بينما في الجزء الثاني، سترى كيفية تدريب مصنف Kernel باستخدام Tensorflow. ستستخدم مجموعة البيانات الخاصة بالبالغين. والهدف من مجموعة البيانات هذه هو تصنيف الإيرادات التي تقل عن 50 ألف دولار أو تزيد عنها، مع معرفة سلوك كل أسرة.

لماذا تحتاج إلى طرق Kernel؟

الهدف من كل مصنف هو التنبؤ بالفئات بشكل صحيح. ولهذا السبب، يجب أن تكون مجموعة البيانات قابلة للفصل. انظر إلى المؤامرة أدناه؛ فمن السهل إلى حد ما أن نرى أن جميع النقاط الموجودة فوق الخط الأسود تنتمي إلى الفئة الأولى والنقاط الأخرى إلى الفئة الثانية. ومع ذلك، فمن النادر جدًا أن يكون لديك مجموعة بيانات بهذه البساطة. في معظم الحالات، لا تكون البيانات قابلة للفصل. طرق Kernel في التعلم الآلي تعطي المصنفات الساذجة مثل الانحدار اللوجستي وقتًا عصيبًا.

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

طريقة النواة

في الشكل أدناه، نرسم مجموعة بيانات غير قابلة للفصل خطيًا. إذا رسمنا خطًا مستقيمًا، فلن يتم تصنيف معظم النقاط في الفئة الصحيحة.

إحدى طرق معالجة هذه المشكلة هي أخذ مجموعة البيانات وتحويلها إلى خريطة ميزات أخرى. وهذا يعني أنك ستستخدم دالة لتحويل البيانات في خطة أخرى، والتي يجب أن تكون خطية.

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

طريقة النواة

البيانات الواردة في الشكل أعلاه موجودة في خطة Gaussian Kernel ثنائية الأبعاد وهي غير قابلة للفصل. يمكنك محاولة تحويل هذه البيانات إلى شكل ثلاثي الأبعاد، أي إنشاء شكل بثلاثة محاور.

في مثالنا للنواة Gaussian، سنطبق رسمًا متعدد الحدود لجلب بياناتنا إلى بُعد ثلاثي الأبعاد. صيغة تحويل البيانات هي كما يلي.

طريقة النواة

يمكنك تحديد وظيفة في Gaussian Kernel Python لإنشاء خرائط الميزات الجديدة

يمكنك استخدام نمباي لترميز الصيغة أعلاه:

المعادلة رمز Numpy المكافئ
x س[:,0]**
y س[:،1]
x2 س[:,0]**2
طريقة النواة np.sqrt(2)*
xy س[:,0]*س[:,1]
y2 س[:,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			

وينبغي أن يكون التخطيط الجديد ثلاثي الأبعاد بواقع 3 نقطة

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

لنقم بإنشاء قطعة أرض جديدة ذات 3 محاور، x وy وz على التوالي.

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

طريقة النواة

نحن نرى تحسنا ولكن إذا قمنا بتغيير اتجاه المؤامرة، فمن الواضح أن مجموعة البيانات أصبحت الآن قابلة للفصل

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

طريقة النواة

لمعالجة مجموعة بيانات كبيرة وقد تضطر إلى إنشاء أكثر من بُعدين، ستواجه مشكلة كبيرة باستخدام الطريقة المذكورة أعلاه. في الواقع، تحتاج إلى تحويل جميع نقاط البيانات، وهو أمر غير مستدام بشكل واضح. سوف يستغرق الأمر وقتًا طويلاً، وقد تنفد ذاكرة جهاز الكمبيوتر الخاص بك.

الطريقة الأكثر شيوعًا للتغلب على هذه المشكلة هي استخدام نواة.

ما هو النواة في التعلم الآلي؟

تتمثل الفكرة في استخدام مساحة ميزة ذات أبعاد أعلى لجعل البيانات قابلة للفصل خطيًا تقريبًا كما هو موضح في الشكل أعلاه.

هناك الكثير من المساحات ذات الأبعاد الأعلى لجعل نقاط البيانات قابلة للفصل. على سبيل المثال، لقد أظهرنا أن رسم خرائط كثيرات الحدود يعد بداية رائعة.

لقد أثبتنا أيضًا أنه مع وجود الكثير من البيانات، فإن هذا التحويل ليس فعالاً. بدلاً من ذلك، يمكنك استخدام وظيفة Kernel في التعلم الآلي لتعديل البيانات دون التغيير إلى خطة ميزات جديدة.

يكمن سحر النواة في العثور على دالة تتجنب كل المشاكل التي تنطوي عليها الحسابات عالية الأبعاد. نتيجة النواة هي العددية، أو يقال بشكل مختلف أننا عدنا إلى الفضاء أحادي البعد

بعد العثور على هذه الوظيفة، يمكنك توصيلها بالمصنف الخطي القياسي.

دعونا نرى مثالاً لفهم مفهوم التعلم الآلي لـ Kernel. لديك متجهان، x1 وx2. الهدف هو إنشاء بُعد أعلى باستخدام رسم خرائط متعدد الحدود. الناتج يساوي المنتج النقطي لخريطة الميزات الجديدة. من الطريقة المذكورة أعلاه، تحتاج إلى:

  1. تحويل x1 وx2 إلى بعد جديد
  2. حساب المنتج النقطي: مشترك بين جميع النوى
  3. تحويل x1 وx2 إلى بعد جديد

يمكنك استخدام الدالة التي تم إنشاؤها أعلاه لحساب البعد الأعلى.

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

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

الناتج

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

حساب المنتج النقطي

يمكنك استخدام نقطة الكائن من numpy لحساب منتج النقطة بين المتجه الأول والثاني المخزن في x_1.

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

الإخراج هو 8100. كما ترى المشكلة، تحتاج إلى تخزين خريطة ميزات جديدة في الذاكرة لحساب المنتج النقطي. إذا كانت لديك مجموعة بيانات تحتوي على ملايين السجلات، فهي غير فعالة من الناحية الحسابية.

بدلاً من ذلك ، يمكنك استخدام ملف نواة كثيرة الحدود لحساب المنتج النقطي دون تحويل المتجه. تحسب هذه الوظيفة المنتج النقطي لـ x1 وx2 كما لو تم تحويل هذين المتجهين إلى البعد الأعلى. وبعبارة أخرى، تحسب وظيفة النواة نتائج المنتج النقطي من مساحة ميزة أخرى.

يمكنك كتابة دالة kernel متعددة الحدود Python على النحو التالي.

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

إنها قوة المنتج النقطي لمتجهين. أدناه، تقوم بإرجاع الدرجة الثانية من نواة متعدد الحدود. الإخراج يساوي الطريقة الأخرى. هذا هو سحر النواة.

polynomial_kernel(x1, x2, p=2)			
8100

أنواع طرق النواة

هناك الكثير من تقنيات Kernel المختلفة المتاحة. أبسطها هو النواة الخطية. تعمل هذه الوظيفة بشكل جيد لتصنيف النص. النواة الأخرى هي:

  • نواة متعددة الحدود
  • نواة غاوس

في المثال مع TensorFlow، سوف نستخدم فورييه العشوائي. لدى TensorFlow مُقدِّر مدمج لحساب مساحة الميزة الجديدة. تعد وظيفة المرشح Gaussian تقريبًا لوظيفة Gaussian kernel.

أنواع طرق النواة

تحسب وظيفة التصفية الغوسية التشابه بين نقاط البيانات في مساحة ذات أبعاد أعلى بكثير.

تدريب مصنف Gaussian Kernel باستخدام TensorFlow

الهدف من الخوارزمية هو تصنيف دخل الأسرة الذي يزيد أو يقل عن 50 ألفًا.

ستقوم بتقييم التعلم الآلي لانحدار Kernel اللوجستي للحصول على نموذج معياري. بعد ذلك، سوف تقوم بتدريب مصنف Kernel لمعرفة ما إذا كان بإمكانك الحصول على نتائج أفضل.

تستخدم المتغيرات التالية من مجموعة البيانات الخاصة بالبالغين:

  • السن
  • فئة العمل
  • com.fnlwgt
  • التعليم
  • education_num
  • الزوجي
  • احتلال
  • صلة
  • سباق
  • جنس
  • مكاسب رأس المال
  • خسارة رأس المال
  • ساعات_الاسبوع
  • الوطن الأم
  • ملصق

ستتبع ما يلي قبل تدريب النموذج وتقييمه:

  • الخطوة 1) استيراد المكتبات
  • الخطوة 2) استيراد البيانات
  • الخطوة 3) إعداد البيانات
  • الخطوة 4) إنشاء ملف input_fn
  • الخطوة 5) بناء النموذج اللوجستي: النموذج الأساسي
  • الخطوة 6) تقييم النموذج
  • الخطوة 7) إنشاء مصنف النواة
  • الخطوة 8) تقييم مصنف Kernel

الخطوة 1) قم باستيراد المكتبات

لاستيراد وتدريب نماذج Kernel في الذكاء الاصطناعي، تحتاج إلى استيراد Tensorflow، الباندا و 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

الخطوة 2) استيراد البيانات

يمكنك تنزيل البيانات من التالي موقع الكتروني وقمت باستيراده كإطار بيانات الباندا.

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

الآن بعد أن تم تعريف مجموعة التدريب والاختبار، يمكنك تغيير تسمية العمود من سلسلة إلى عدد صحيح. لا يقبل Tensorflow قيمة السلسلة للتسمية.

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) تحضير البيانات

تحتوي مجموعة البيانات على ميزات مستمرة وفئوية. من الممارسات الجيدة توحيد قيم المتغيرات المستمرة. يمكنك استخدام وظيفة StandardScaler من sci-kit learn. يمكنك أيضًا إنشاء وظيفة معرفة من قبل المستخدم لتسهيل تحويل القطار ومجموعة الاختبار. لاحظ أنه يمكنك ربط المتغيرات المستمرة والفئوية بمجموعة بيانات مشتركة ويجب أن تكون المصفوفة من النوع: 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

وظيفة المحول جاهزة، يمكنك تحويل مجموعة البيانات وإنشاء وظيفة input_fn.

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

في الخطوة التالية، سوف تقوم بتدريب الانحدار اللوجستي. وسوف تعطيك دقة خط الأساس. الهدف هو التغلب على خط الأساس باستخدام خوارزمية مختلفة، وهي مصنف Kernel.

الخطوة 4) بناء النموذج اللوجستي: النموذج الأساسي

يمكنك إنشاء عمود الميزة باستخدام الكائن real_valued_column. سيتأكد من أن جميع المتغيرات عبارة عن بيانات رقمية كثيفة.

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

يتم تعريف المقدر باستخدام TensorFlow Estimator، حيث تقوم بإرشاد أعمدة الميزات ومكان حفظ الرسم البياني.

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 باستخدام دفعات صغيرة بحجم 200.

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

يمكنك تدريب النموذج بتكرار 1.000

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) قيم النموذج

يمكنك تحديد المقدر numpy لتقييم النموذج. يمكنك استخدام مجموعة البيانات بأكملها للتقييم

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

لديك دقة 82 بالمئة. في القسم التالي، ستحاول التغلب على المصنف اللوجستي باستخدام مصنف Kernel

الخطوة 7) بناء مصنف النواة

لا يختلف مُقدِّر النواة كثيرًا عن المُصنِّف الخطي التقليدي، على الأقل من حيث البناء. الفكرة وراء ذلك هي استخدام قوة النواة الصريحة مع المصنف الخطي.

أنت بحاجة إلى مقدرين محددين مسبقًا ومتوفرين في TensorFlow لتدريب مصنف Kernel:

  • RandomFourierFeatureMapper
  • KernelLinearClassifier

لقد تعلمت في القسم الأول أنك تحتاج إلى تحويل البعد المنخفض إلى بعد مرتفع باستخدام وظيفة النواة. بتعبير أدق، سوف تستخدم Random Fourier، وهو تقريب للدالة الغوسية. لحسن الحظ، لدى Tensorflow الوظيفة في مكتبته: RandomFourierFeatureMapper. يمكن تدريب النموذج باستخدام المقدر KernelLinearClassifier.

لبناء النموذج، سيتم اتباع الخطوات التالية:

  1. قم بتعيين وظيفة Kernel ذات البعد العالي
  2. قم بتعيين المعلمة الفائقة L2
  3. قم ببناء النموذج
  4. درب النموذج
  5. قيم النموذج

الخطوة أ) قم بتعيين وظيفة Kernel ذات البعد العالي

تحتوي مجموعة البيانات الحالية على 14 ميزة ستحولها إلى بُعد عالٍ جديد للمتجه ذي الـ 5.000 بُعد. يمكنك استخدام ميزات فورييه العشوائية لتحقيق التحويل. إذا كنت تتذكر صيغة Gaussian Kernel، فستلاحظ أن هناك معلمة الانحراف المعياري التي يجب تحديدها. تتحكم هذه المعلمة في مقياس التشابه الذي يستخدم أثناء التصنيف.

يمكنك ضبط جميع المعلمات في RandomFourierFeatureMapper باستخدام:

  • الإدخال_ديم = 14
  • الإخراج_ديم = 5000
  • ستديف=4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

تحتاج إلى إنشاء مخطط kernel باستخدام أعمدة الميزات التي تم إنشاؤها من قبل: feat_column

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

الخطوة ب) قم بتعيين المعلمة الفائقة L2

لمنع التجهيز الزائد، يمكنك معاقبة وظيفة الخسارة باستخدام منظم L2. قمت بتعيين المعلمة الفائقة L2 على 0.1 ومعدل التعلم على 5

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

الخطوة ج) قم ببناء النموذج

الخطوة التالية مشابهة للتصنيف الخطي. يمكنك استخدام المقدر المدمج KernelLinearClassifier. لاحظ أنك قمت بإضافة مخطط kernel المحدد مسبقًا وقمت بتغيير دليل النموذج.

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

الخطوة د) درب النموذج

الآن بعد أن تم إنشاء مصنف Kernel، أنت جاهز لتدريبه. اخترت تكرار النموذج 2000 مرة

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

الخطوة ه) قيم النموذج

وأخيرًا وليس آخرًا، عليك تقييم أداء النموذج الخاص بك. يجب أن تكون قادرًا على التغلب على الانحدار اللوجستي.

# 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

الدقة النهائية هي 84%، وهو تحسن بنسبة 2% مقارنة بالانحدار اللوجستي. هناك مقايضة بين تحسين الدقة والتكلفة الحسابية. عليك أن تفكر فيما إذا كان التحسين بنسبة 2% يستحق الوقت الذي يستهلكه المصنف المختلف وما إذا كان له تأثير مقنع على عملك.

الملخص

تعد النواة أداة رائعة لتحويل البيانات غير الخطية إلى بيانات خطية (تقريبًا). عيب هذه الطريقة هو أنها تستغرق وقتًا طويلاً ومكلفة من الناحية الحسابية.

أدناه، يمكنك العثور على الكود الأكثر أهمية لتدريب مصنف النواة

قم بتعيين وظيفة Kernel ذات البعد العالي

  • الإدخال_ديم = 14
  • الإخراج_ديم = 5000
  • ستديف=4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

قم بتعيين المعلمة الفائقة L2

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

قم ببناء النموذج

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

درب النموذج

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

قيم النموذج

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