نواة غاوس في التعلم الآلي: Python طرق النواة
⚡ ملخص ذكي
تُحوّل طرق النواة الغاوسية البيانات غير القابلة للفصل إلى بيانات قابلة للفصل خطيًا دون الحاجة إلى إنشاء خريطة الميزات عالية الأبعاد. يُوضح هذا الشرح خريطة متعددة الحدود.ping ثم يقوم بتدريب مصنف نواة فورييه عشوائية يدويًا في TensorFlow.
الغرض من هذا البرنامج التعليمي هو جعل مجموعة البيانات قابلة للفصل خطيًا. ينقسم البرنامج التعليمي إلى قسمين:
- تحويل الميزة
- تدريب مصنف النواة باستخدام 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 لتحويل بياناتنا إلى بُعد ثالث، تكون الصيغة المستخدمة في ذلك كما يلي.
يمكنك تحديد وظيفة في Gaussian Kernel Python لإنشاء خرائط الميزات الجديدة.
يمكنك استخدام نمباي لكتابة الصيغة أعلاه. كل صف أدناه يربط أحد حدود الخريطةping باستخدام تعبير المصفوفة الذي ينتجه، والصورة الصغيرة تشير إلى الجذر التربيعي لعامل اثنين.
| المعادلة | كود NumPy المكافئ |
|---|---|
| x | س[:،0] |
| y | س[:،1] |
| ײ | س[:,0]**2 |
| 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()
نلاحظ تحسناً، ولكن إذا قمنا بتغيير اتجاه الرسم البياني، يصبح من الواضح أن مجموعة البيانات قابلة للفصل الآن.
# 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الناتج يساوي حاصل الضرب النقطي لخريطة الميزات الجديدة. من الطريقة المذكورة أعلاه، عليك القيام بما يلي:
- تحويل x1 وx2 إلى بعد جديد
- حساب المنتج النقطي: مشترك بين جميع النوى
تحويل 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 على مُقدِّر مُدمج لحساب فضاء الميزات الجديد. يُعد مُحوِّل ميزات فورييه العشوائية تقريبًا لدالة النواة الغاوسية الموضحة أدناه.
تحسب وظيفة التصفية الغوسية التشابه بين نقاط البيانات في مساحة ذات أبعاد أعلى بكثير.
بعد حسم النظرية، يشرح الجزء المتبقي من هذا الشرح كيفية تطبيق نواة غاوسية على مجموعة بيانات حقيقية.
تدريب مصنف Gaussian Kernel باستخدام TensorFlow
الهدف من الخوارزمية هو تصنيف دخل الأسرة الذي يزيد أو يقل عن 50 ألفًا.
ستقوم أولاً بتقييم نموذج الانحدار اللوجستي للحصول على نموذج مرجعي. بعد ذلك، ستقوم بتدريب مصنف النواة لمعرفة ما إذا كان بإمكانك الحصول على نتائج أفضل.
تستخدم المتغيرات التالية من مجموعة البيانات الخاصة بالبالغين:
- السن
- فئة العمل
- com.fnlwgt
- التعليم
- education_num
- الزوجي
- احتلال
- صلة
- سباق
- جنس
- مكاسب رأس المال
- خسارة رأس المال
- ساعات_الاسبوع
- الوطن الأم
- ملصق
ستقوم بالخطوات التالية قبل تدريب النموذج وتقييمه:
- قم باستيراد المكتبات
- استيراد البيانات
- تحضير البيانات
- بناء النموذج اللوجستي: النموذج الأساسي
- قيم النموذج
- قم ببناء وتقييم مصنف النواة
ملاحظة حول الإصدار: تستهدف جميع المقاطع البرمجية أدناه 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 = {'<=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 من تعلم الحروفيمكنك أيضًا إنشاء دالة معرفة من قبل المستخدم لتسهيل تحويل مجموعتي التدريب والاختبار. لاحظ أنه يجب عليك دمج المتغيرات المستمرة والفئوية في مجموعة بيانات مشتركة، ويجب أن يكون نوع المصفوفة 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}
ستقوم بتدريب نموذج الانحدار اللوجستي باستخدام دفعات صغيرة بحجم 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
{'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%. في القسم التالي، ستحاول التفوق على المصنف اللوجستي باستخدام مصنف النواة.
الخطوة 6) إنشاء مصنف النواة
لا يختلف مُقدِّر النواة كثيرًا عن المُصنِّف الخطي التقليدي، على الأقل من حيث البنية. وتكمن الفكرة وراءه في الجمع بين قوة خريطة النواة الصريحة.ping باستخدام المصنف الخطي.
أنت بحاجة إلى مقدرين محددين مسبقًا ومتوفرين في TensorFlow لتدريب مصنف Kernel:
- RandomFourierFeatureMapper
- KernelLinearClassifier
لقد تعلمت في القسم الأول أنك بحاجة إلى تحويل الأبعاد المنخفضة إلى أبعاد عالية باستخدام دالة النواة. وبشكل أدق، ستستخدم ميزات فورييه العشوائية، التي تقارب دالة غاوس. يوفر TensorFlow 1.x هذه الخريطة.ping كـ RandomFourierFeatureMapper، ويمكن تدريب النموذج باستخدام المقدر KernelLinearClassifier.
لبناء النموذج، سيتم اتباع الخطوات التالية:
- قم بتعيين وظيفة Kernel ذات البعد العالي
- قم بتعيين المعلمة الفائقة L2
- قم ببناء النموذج
- درب النموذج
- قيم النموذج
الخطوة أ) ضبط دالة النواة عالية الأبعاد
تحتوي مجموعة البيانات الحالية على 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='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: {'_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'}
الخطوة د) تدريب النموذج
الآن وقد تم بناء مصنف النواة، فأنت جاهز لتدريبه. اخترت تكرار النموذج 2,000 مرة.
### 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%، أي بزيادة قدرها 1.6 نقطة مئوية تقريبًا عن خط الأساس للانحدار اللوجستي (0.83975184 مقابل 0.82353663). يوجد توازن دقيق بين تحسين الدقة والتكلفة الحسابية. عليك التفكير مليًا فيما إذا كان هذا التحسين يستحق الوقت الذي يستغرقه المصنف الأكثر تعقيدًا، وما إذا كان له تأثير ملموس على أعمالك.





