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

⚡ ملخص ذكي

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

  • 🔘 مشكلة قابلية الفصل: تفشل المصنفات الخطية عندما لا يفصل خط مستقيم بين الفئات في فضاء الميزات الأصلي.
  • ☑️ خريطة متعددة الحدودping: التحويل إلى x تربيع، جذر اثنين xy و y تربيع يرفع بعدين إلى ثلاثة ويفصل بيانات العينة.
  • خدعة النواة: تقوم النواة بإرجاع حاصل الضرب النقطي للمتجهات التي تم تعيينها مباشرة، لذلك لا يتم تخزين أي خريطة ميزات موسعة على الإطلاق.
  • 🧪 ثلاث حبات: تُناسب النماذج الخطية تصنيف النصوص، وتلتقط النماذج متعددة الحدود تفاعلات الميزات، وتقيس نماذج RBF الغاوسية التشابه القائم على المسافة.
  • 🛠️ بناء TensorFlow: يقوم RandomFourierFeatureMapper بإسقاط 14 ميزة في 5,000 بُعد قبل أن يتم تدريب KernelLinearClassifier باستخدام مُحسِّن Ftrl.
  • 📈 النتيجة المقاسة: يصل المصنف الأساسي إلى دقة 0.83975184 مقابل 0.82353663 للخط الأساسي اللوجستي.

نواة غاوس في التعلم الآلي

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

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

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

لماذا تحتاج إلى طرق 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()

مخطط التشتت لمجموعة بيانات تتداخل فيها الفئتان ولا يفصل بينهما خط مستقيم

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

في مثالنا على النواة الغاوسية، سنطبق خريطة متعددة الحدودping لتحويل بياناتنا إلى بُعد ثالث، تكون الصيغة المستخدمة في ذلك كما يلي.

خريطة متعددة الحدودping صيغة φ لـ x و y تساوي x تربيع، الجذر التربيعي لـ 2 مضروبة في xy، y تربيع

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

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

المعادلة كود NumPy المكافئ
x س[:،0]
y س[:،1]
ײ س[:,0]**2
الجذر التربيعي لعامل اثنين من خريطة كثير الحدودping np.sqrt(2)*
xy س[:,0]*س[:,1]
ص² س[:,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			

الخريطة الجديدةping له 3 أبعاد و 16 نقطة.

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

الآن قم بإنشاء رسم بياني جديد بثلاثة محاور، 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()

مخطط تشتت ثلاثي الأبعاد للنقاط المحددة على الخريطة، يُرى من ارتفاع 30 درجة واتجاه سمت 185 درجة

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

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

نفس الرسم البياني ثلاثي الأبعاد مُدار بشكل مسطح، حيث يفصل مستوى واحد بين الفئتين

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

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

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

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

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

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

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

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

إليك مثالٌ يُجسّد مفهوم التعلّم الآلي باستخدام النواة. لديك متجهان، x1 و x2. الهدف هو إنشاء بُعدٍ أعلى باستخدام خريطة متعددة الحدود.pingالناتج يساوي حاصل الضرب النقطي لخريطة الميزات الجديدة. من الطريقة المذكورة أعلاه، عليك القيام بما يلي:

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

تحويل 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.        ]]

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

يمكنك استخدام نقطة الكائن من نمباي لحساب حاصل الضرب النقطي بين المتجه الأول والثاني المخزنين في 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

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

تتوفر العديد من تقنيات النواة المختلفة. أبسطها النواة الخطية، وهي فعالة جدًا في تصنيف النصوص. أما النوى الأخرى فهي:

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

يلخص الجدول أدناه وظيفة كل منها ومتى يلجأ إليها الممارسون.

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

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

صيغة نواة غاوس: e مرفوعة إلى سالب مربع معيار x ناقص y مقسومًا على مربع اثنين سيجما

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

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

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

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

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

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

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

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

  1. قم باستيراد المكتبات
  2. استيراد البيانات
  3. تحضير البيانات
  4. بناء النموذج اللوجستي: النموذج الأساسي
  5. قيم النموذج
  6. قم ببناء وتقييم مصنف النواة

ملاحظة حول الإصدار: تستهدف جميع المقاطع البرمجية أدناه TensorFlow 1.x. تم حذف مساحة الاسم tf.contrib، التي توفر real_valued_column وRandomFourierFeatureMapper وKernelLinearClassifier، في TensorFlow 2.0، كما تم حذف tf.estimator نفسه في TensorFlow 2.16. في الإصدار الحالي، قم ببناء نفس مسار المعالجة باستخدام طبقة tf.keras.layers.experimental.RandomFourierFeatures متبوعة بطبقة إخراج Dense، أو باستخدام زوج RBFSampler وSGDClassifier من مكتبة scikit-learn.

الخطوة 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 = {&#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)			

الخطوة 3) إعداد البيانات

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

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

دالة التحويل جاهزة، لذا يمكنك تحويل مجموعة البيانات وإنشاء دالة 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(&#x27;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: {&#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}

ستقوم بتدريب نموذج الانحدار اللوجستي باستخدام دفعات صغيرة بحجم 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>

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

تقوم بتحديد دالة الإدخال في 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
{&#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}

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

الخطوة 6) إنشاء مصنف النواة

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

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

  • RandomFourierFeatureMapper
  • KernelLinearClassifier

لقد تعلمت في القسم الأول أنك بحاجة إلى تحويل الأبعاد المنخفضة إلى أبعاد عالية باستخدام دالة النواة. وبشكل أدق، ستستخدم ميزات فورييه العشوائية، التي تقارب دالة غاوس. يوفر TensorFlow 1.x هذه الخريطة.ping كـ RandomFourierFeatureMapper، ويمكن تدريب النموذج باستخدام المقدر KernelLinearClassifier.

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

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

الخطوة أ) ضبط دالة النواة عالية الأبعاد

تحتوي مجموعة البيانات الحالية على 14 خاصية ستقوم بتحويلها إلى متجه جديد ذي 5,000 بُعد. ستستخدم خصائص فورييه العشوائية لإجراء هذا التحويل. إذا تذكرت صيغة نواة غاوس، ستلاحظ وجود مُعامل انحراف معياري يجب تحديده. يتحكم هذا المُعامل في مقياس التشابه المُستخدم أثناء التصنيف: قيمة صغيرة للانحراف المعياري تجعل النواة تُعامل النقاط المتقاربة جدًا فقط على أنها متشابهة، بينما قيمة كبيرة تُنعّم حدود القرار.

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

  • الإدخال_ديم = 14
  • output_dim = 5000
  • الانحراف المعياري = 4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name=&#x27;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. لاحظ أنك ستضيف مُعرِّف النواة المُعرَّف سابقًا وتُغيِّر دليل النموذج.

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

من المتوقع ظهور تحذيرات الإهمال أدناه في TensorFlow 1.x، لأن وحدة kernel_methods مبنية على مقدرات tf.contrib.learn الأقدم.

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

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

الآن وقد تم بناء مصنف النواة، فأنت جاهز لتدريبه. اخترت تكرار النموذج 2,000 مرة.

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

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

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

# 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

بلغت دقة النموذج النهائية 84%، أي بزيادة قدرها 1.6 نقطة مئوية تقريبًا عن خط الأساس للانحدار اللوجستي (0.83975184 مقابل 0.82353663). يوجد توازن دقيق بين تحسين الدقة والتكلفة الحسابية. عليك التفكير مليًا فيما إذا كان هذا التحسين يستحق الوقت الذي يستغرقه المصنف الأكثر تعقيدًا، وما إذا كان له تأثير ملموس على أعمالك.

الأسئلة الشائعة

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

لا، تم حذف tf.contrib في TensorFlow 2.0 وtf.estimator في 2.16، لذا فإن real_valued_column وRandomFourierFeatureMapper وKernelLinearClassifier غير متوفرة. استخدم طبقة tf.keras.layers.experimental.RandomFourierFeatures مع مخرج Dense، أو RBFSampler مع SGDClassifier.

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

يقوم البرنامج بإنشاء الهيكل الأساسي بسرعة: قياس الميزات، واستدعاء المُعالج، والمُقدِّر، وحلقة التقييم. تعامل مع الاقتراحات على أنها محاولة أولية، لأن مساعد الطيار جيثب يُعيد إنتاج واجهات برمجة تطبيقات TensorFlow 1.x التي تمت إزالتها والتي لم تعد تُستورد في الإصدارات الحالية بسهولة.

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

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

تقارن طريقة النواة الدقيقة كل زوج من نقاط التدريب، لذا يزداد التكلفة تقريبًا مع مربع عدد العينات. تتجاوز ميزات فورييه العشوائية ذلك بتقريب النواة بإسقاط ذي عرض ثابت بدلاً من ذلك.

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

تلخيص هذه التدوينة بـ: