التصنيف الثنائي TensorFlow: مثال على المصنف الخطي

⚡ ملخص ذكي

تُصنّف المصنفات الخطية كل مشاهدة إلى فئة بناءً على مجموع مرجّح لخصائصها. يشرح هذا الدليل كيفية بناء مصنف ثنائي باستخدام TensorFlow على مجموعة بيانات التعداد السكاني، مما يرفع دقة التصنيف من 0.76 إلى 0.84.

  • 🔘 التعريف الأساسي: يتنبأ المصنف الخطي بفئة منفصلة من خلال توليفة خطية من قيم الميزات.
  • ☑️ خطوة الاحتمالية: تقوم الدالة اللوجستية بتحويل مخرجات النموذج الخطي إلى احتمال يتراوح بين 0 و 1.
  • المقاييس مهمة: إن الدقة وحدها قد تضلل في حالة وجود تصنيفات غير متوازنة، لذا قم بإقرانها بمصفوفة الارتباك والدقة والاستدعاء.
  • 🧪 شرح تفصيلي لعملية التعداد السكاني: تتحول ستة أعمدة متصلة وثمانية أعمدة فئوية إلى موترات قبل أن يراها المقدر على الإطلاق.
  • 🛠️ هندسة الميزات: يؤدي تربيع العمر، وتصنيفه إلى فئات، ثم الجمع بين التعليم والمهنة إلى رفع الدقة من 0.7616 إلى 0.8358.
  • 📈 التنظيم: يؤدي استخدام مُحسِّن Ftrl مع L1 عند 0.9 و L2 عند 5 إلى تحسين الدقة النهائية إلى 0.8383.

مصنف خطي للتصنيف الثنائي باستخدام TensorFlow

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

ما هو المصنف الخطي؟

A المصنف الخطي في التعلم الآلي هي طريقة للعثور على فئة الكائن بناءً على خصائصه للتصنيف الإحصائي. يتخذ قرار التصنيف بناءً على قيمة مجموعة خطية من خصائص الكائن. يستخدم المصنف الخطي في المسائل العملية مثل تصنيف المستندات والمسائل التي تحتوي على العديد من المتغيرات.

تمثل مشكلات التصنيف حوالي 80 بالمائة من مهمة التعلم الآلي. يهدف التصنيف إلى التنبؤ باحتمالية كل فئة بالنظر إلى مجموعة من المدخلات. التسمية (أي المتغير التابع) هي قيمة منفصلة تسمى فئة.

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

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

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

بعد تحديد التعريف، تتمثل الخطوة التالية في معرفة كيف تحول الخوارزمية الميزات الأولية إلى قرار تصنيفي.

كيف يعمل المصنف الثنائي؟

لقد تعلمت في البرنامج التعليمي السابق أن الدالة تتكون من نوعين من المتغيرات، متغير تابع ومجموعة من الميزات (المتغيرات المستقلة). في الانحدار الخطي، المتغير التابع هو رقم حقيقي بدون نطاق. الهدف الأساسي هو التنبؤ بقيمته عن طريق تقليل متوسط ​​الخطأ التربيعي.

في عمل TensorFlow في المصنف الثنائي، يمكن أن تأخذ التسمية قيمتين صحيحتين محتملتين. في أغلب الأحيان، تكون إما [0,1] أو [1,2]. على سبيل المثال، الهدف هو التنبؤ بما إذا كان العميل سيشتري منتجًا أم لا. تُعرَّف التسمية كما يلي:

  • Y = 1 (قام العميل بشراء المنتج)
  • Y = 0 (لا يشتري العميل المنتج)

يستخدم النموذج الميزات X لتصنيف كل عميل في الفئة الأكثر احتمالا التي ينتمي إليها، وهي مشتري محتمل أم لا.

يتم حساب احتمالية النجاح باستخدام الانحدار اللوجستي. ستحسب الخوارزمية الاحتمالية بناءً على الميزة X وتتنبأ بالنجاح عندما يكون هذا الاحتمال أعلى من 50 بالمائة. وبشكل أكثر رسمية، يتم حساب الاحتمال كما هو موضح في مثال تصنيف TensorFlow الثنائي أدناه:

صيغة الاحتمالية السينية المستخدمة بواسطة مصنف ثنائي في TensorFlow

حيث 0 هي مجموعة الأوزان والميزات والتحيز b.

يمكن تقسيم الدالة إلى قسمين:

  • النموذج الخطي
  • الوظيفة اللوجستية

نموذج خطي

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

تشير الأوزان إلى اتجاه الارتباط بين السمات xi والتسمية ذ. يزيد الارتباط الإيجابي من احتمالية الفئة الإيجابية بينما يؤدي الارتباط السلبي إلى اقتراب الاحتمال من 0 (أي الفئة السلبية).

يُرجع النموذج الخطي الرقم الحقيقي فقط، وهو ما لا يتوافق مع مقياس الاحتمالية للمدى [0,1]. الوظيفة اللوجستية مطلوبة لتحويل مخرجات النموذج الخطي إلى احتمالية،

وظيفة لوجستية

الدالة اللوجستية، أو الدالة السيني، لها شكل S ويكون إخراج هذه الدالة دائمًا بين 0 و1.

توضح الصيغة أدناه عملية التحويل، ويُظهر الرسم البياني التالي أن المنحنى الناتج يتسطح باتجاه 0 على اليسار وباتجاه 1 على اليمين.

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

منحنى سيجمويد على شكل حرف S محصور بين 0 و 1
مثال على الوظيفة اللوجستية

من السهل استبدال مخرجات الانحدار الخطي بالدالة السيني. وينتج عنه رقم جديد باحتمال بين 0 و 1.

يمكن للمصنف تحويل الاحتمال إلى فئة

  • القيم من 0 إلى 0.49 تصبح فئة 0
  • القيم من 0.5 إلى 1 تصبح فئة 1

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

كيفية قياس أداء المصنف الخطي؟

الدقة

يتم قياس الأداء العام للمصنف بمقياس الدقة. تقوم الدقة بجمع كافة القيم الصحيحة مقسومة على إجمالي عدد الملاحظات. على سبيل المثال، تعني قيمة الدقة البالغة 80 بالمائة أن النموذج صحيح في 80 بالمائة من الحالات.

صيغة الدقة لحساب التنبؤات الصحيحة من إجمالي المشاهدات

قياس أداء المصنف الخطي باستخدام مقياس الدقة

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

الارتباك مصفوفة

أفضل طريقة لتقييم أداء المصنف هي النظر إلى مصفوفة الارتباك.

مصفوفة الارتباك الثنائية التي توضح مربعات TP وFP وFN وTN

قياس أداء المصنف الخطي باستخدام مصفوفة الارتباك

استخدم الارتباك مصفوفة يتصور دقة المصنف من خلال مقارنة الفئات الفعلية والمتوقعة كما هو موضح في مثال المصنف الخطي أعلاه. تتكون مصفوفة الارتباك الثنائية من مربعات:

  • TP: إيجابي حقيقي: تم التنبؤ بالقيم المتوقعة بشكل صحيح على أنها إيجابية فعلية
  • FP: تنبأت القيم المتوقعة بشكل غير صحيح بإيجابية فعلية. أي، توقع القيم السلبية على أنها إيجابية
  • FN: سلبي كاذب: القيم الإيجابية المتوقعة سلبية
  • TN: سلبي حقيقي: تم التنبؤ بالقيم المتوقعة بشكل صحيح على أنها سلبية فعلية

من خلال مصفوفة الارتباك، من السهل مقارنة الفصل الفعلي والفصل المتوقع.

الدقة والحساسية

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

دقة

يُظهر مقياس الدقة دقة الفئة الإيجابية. إنه يقيس مدى احتمالية صحة التنبؤ بالفئة الإيجابية.

صيغة الدقة، الإيجابيات الحقيقية مقسومة على الإيجابيات المتوقعة

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

حساسية

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

صيغة الحساسية، الإيجابيات الحقيقية مقسومة على الإيجابيات الفعلية

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

المصنف الخطي مع TensorFlow

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

  • بقيمة 1 إذا كان الدخل > 50 ألفًا
  • 0 إذا كان الدخل أقل من 50 ألفًا.

هذا المتغير هو التسمية الخاصة بك

تتضمن مجموعة البيانات هذه ثمانية متغيرات فئوية:

  • مكان العمل
  • التعليم
  • الزوجي
  • احتلال
  • صلة
  • سباق
  • جنس
  • الوطن الأم

علاوة على ذلك، ستة متغيرات مستمرة:

  • السن
  • com.fnlwgt
  • education_num
  • مكاسب رأس المال
  • خسارة رأس المال
  • ساعات_الاسبوع

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

ملاحظة حول الإصدار: يستخدم الكود أدناه واجهة برمجة تطبيقات TensorFlow 1.x Estimator. tf-estimator تم إصدار النسخة النهائية من الحزمة مع TensorFlow 2.15، وهي غير متوفرة في TensorFlow 2.16 أو الإصدارات الأحدث، لذا قم بتشغيل هذه الأجزاء البرمجية على TensorFlow 1.x، أو قم بنقلها باستخدام الإصدار الرسمي. دليل ترحيل المُقدِّر الجاهزتبقى المفاهيم وهندسة الميزات والمقاييس كما هي.

سنتصرف على النحو التالي:

  • الخطوة 1) استيراد البيانات
  • الخطوة 2) تحويل البيانات
  • الخطوة 3) تدريب المصنف
  • الخطوة 4) تحسين النموذج
  • الخطوة 5) المعلمة الفائقة: Lasso & Ridge

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

عليك أولاً استيراد المكتبات المستخدمة أثناء البرنامج التعليمي.

import tensorflow as tf
import pandas as pd

بعد ذلك، قم باستيراد البيانات من أرشيف UCI وقم بتحديد أسماء الأعمدة. سوف تستخدم الأعمدة لتسمية الأعمدة في إطار بيانات pandas.

لاحظ أنك ستقوم بتدريب المصنف باستخدام إطار بيانات Pandas.

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

البيانات المخزنة على الإنترنت مقسمة بالفعل بين مجموعة القطار ومجموعة الاختبار.

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)

تحتوي مجموعة القطار على 32,561 ملاحظة ومجموعة الاختبار 16,281

print(df_train.shape, df_test.shape)
print(df_train.dtypes)
(32561, 15) (16281, 15)
age                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label             object
dtype: object

يتطلب 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]

في بيانات التدريب، يوجد 24,720 دخلاً أقل من 50 ألفاً و7841 دخلاً أعلى. النسبة متقاربة في مجموعة الاختبار، لذا فإن حوالي 76% من كلا المجموعتين تندرج ضمن الفئة السلبية.

print(df_train["label"].value_counts())
### The model will be correct in atleast 70% of the case
print(df_test["label"].value_counts())
## Unbalanced label
print(df_train.dtypes)
0    24720
1     7841
Name: label, dtype: int64
0    12435
1     3846
Name: label, dtype: int64
age                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label              int64
dtype: object

الخطوة 2) تحويل البيانات

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

يحتاج المقدر إلى قائمة من الميزات لتدريب النموذج. وبالتالي، يجب تحويل بيانات العمود إلى موتر.

من الممارسات الجيدة تحديد قائمتين من المعالم بناءً على نوعها ثم تمريرهما في أعمدة_الميزات الخاصة بالمقدر.

ستبدأ بتحويل المعالم المستمرة، ثم تحدد مجموعة البيانات الفئوية.

تحتوي ميزات مجموعة البيانات على تنسيقين:

  • عدد صحيح
  • هدف

يتم إدراج كل ميزة في المتغيرين التاليين حسب أنواعها.

## Add features to the bucket: 
### Define continuous list
CONTI_FEATURES  = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']
### Define the categorical list
CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']

تم تجهيز feature_column بكائن numeric_column للمساعدة في تحويل المتغيرات المستمرة إلى موتر. في الكود أدناه، يمكنك تحويل كافة المتغيرات من CONTI_FEATURES إلى موتر بقيمة رقمية. وهذا أمر إلزامي لبناء النموذج. يجب تحويل جميع المتغيرات المستقلة إلى النوع المناسب من الموتر.

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

def print_transformation(feature = "age", continuous = True, size = 2): 
    #X = fc.numeric_column(feature)
    ## Create feature name
    feature_names = [
    feature]

    ## Create dict with the data
    d = dict(zip(feature_names, [df_train[feature]]))

    ## Convert age
    if continuous == True:
        c = tf.feature_column.numeric_column(feature)
        feature_columns = [c]
    else: 
        c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size) 
        c_indicator = tf.feature_column.indicator_column(c)
        feature_columns = [c_indicator]
    
## Use input_layer to print the value
    input_layer = tf.feature_column.input_layer(
        features=d,
        feature_columns=feature_columns
        )
    ## Create lookup table
    zero = tf.constant(0, dtype=tf.float32)
    where = tf.not_equal(input_layer, zero)
    ## Return lookup tble
    indices = tf.where(where)
    values = tf.gather_nd(input_layer, indices)
    ## Initiate graph
    sess = tf.Session()
    ## Print value
    print(sess.run(input_layer))
print_transformation(feature = "age", continuous = True) 
[[39.]
 [50.]
 [38.]
 ...
 [58.]
 [22.]
 [52.]]

القيم هي نفسها تمامًا كما في df_train

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]

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

على سبيل المثال، إذا كانت حالة المتغير تحتوي على ثلاث قيم مميزة:

  • زوج
  • زوجتك
  • غير متزوجة

ثم سيتم تخصيص ثلاثة معرفات. على سبيل المثال، سيكون لدى الزوج المعرف 1، والزوجة المعرف 2، وهكذا.

لأغراض التوضيح، يمكنك استخدام هذا الرمز لتحويل متغير كائن إلى عمود فئوي في TensorFlow.

لا يمكن أن تأخذ خاصية الجنس سوى قيمتين: ذكر أو أنثى. عند تحويل خاصية الجنس، يُنشئ TensorFlow عمودين جديدين، أحدهما للذكور والآخر للإناث. إذا كانت قيمة الجنس تساوي ذكرًا، فإن قيمة عمود الذكور الجديد ستكون 1 وقيمة عمود الإناث 0. يوضح الجدول أدناه هذا المثال:

الصفوف جنس بعد التحول ذكر أنثى
1 ذكر => 1 0
2 ذكر => 1 0
3 أنثى => 0 1

في Tensorflow:

print_transformation(feature = "sex", continuous = False, size = 2)
[[1. 0.]
 [1. 0.]
 [1. 0.]
 ...
 [0. 1.]
 [1. 0.]
 [0. 1.]]

relationship = tf.feature_column.categorical_column_with_vocabulary_list(
    'relationship', [
        'Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried',
        'Other-relative'])

أدناه، أضفنا Python رمز لطباعة الترميز. مرة أخرى، لا تحتاج إلى فهم الكود، والغرض هو رؤية التحويل

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

في الكود أدناه، يمكنك إنشاء حلقة فوق كافة الميزات الفئوية.

categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]

الخطوة 3) تدريب المصنف

يوفر TensorFlow حاليًا مُقدِّرًا للانحدار الخطي والتصنيف الخطي.

  • الانحدار الخطي: LinearRegressor
  • التصنيف الخطي: LinearClassifier

بناء جملة المصنف الخطي هو نفسه الموجود في البرنامج التعليمي الانحدارالخطي باستثناء وسيطة واحدة، n_class. تحتاج إلى تحديد عمود الميزة ودليل النموذج والمقارنة مع الانحدار الخطي؛ لديك تحديد عدد الطبقة. بالنسبة للانحدار اللوغاريتمي، يكون عدد الفئة يساوي 2.

سيحسب النموذج أوزان الأعمدة الموجودة في الميزات المستمرة والميزات_الفئوية.

model = tf.estimator.LinearClassifier(
    n_classes = 2,
    model_dir="ongoing/train", 
    feature_columns=categorical_features+ continuous_features)

الناتج

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train', '_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 0x181f24c898>, '_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}

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

FEATURES = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country']
LABEL= 'label'
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

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

دعونا ندرب النموذج باستخدام الكائن model.train. يمكنك استخدام الوظيفة المحددة مسبقًا لتغذية النموذج بالقيم المناسبة. لاحظ أنك قمت بتعيين حجم الدفعة على 128 وعدد العصور على لا شيء. سيتم تدريب النموذج على ألف خطوة.

model.train(input_fn=get_input_fn(df_train, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      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 ongoing/train/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 65.8282
INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)
INFO:tensorflow:global_step/sec: 118.386
INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)
INFO:tensorflow:global_step/sec: 110.542
INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)
INFO:tensorflow:global_step/sec: 199.03
INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)
INFO:tensorflow:global_step/sec: 167.488
INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)
INFO:tensorflow:global_step/sec: 220.155
INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)
INFO:tensorflow:global_step/sec: 199.016
INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)
INFO:tensorflow:global_step/sec: 197.531
INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)
INFO:tensorflow:global_step/sec: 208.479
INFO:tensorflow:loss = 22201.918, step = 901 (0.479 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt.
INFO:tensorflow:Loss for final step: 5444.363.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181f223630>

لاحظ أن الخسارة انخفضت لاحقا خلال آخر 100 خطوة، أي من 901 إلى 1000.

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

model.evaluate(input_fn=get_input_fn(df_test, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									  
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-06-02-08:28:22
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:23
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546

{'accuracy': 0.7615626,
 'accuracy_baseline': 0.76377374,
 'auc': 0.63300294,
 'auc_precision_recall': 0.50891197,
 'average_loss': 47.12155,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 5993.6406,
 'precision': 0.49401596,
 'prediction/mean': 0.18454961,
 'recall': 0.38637546}

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

الخطوة 4) تحسين النموذج

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

يعد الانحدار متعدد الحدود مفيدًا عندما يكون هناك عدم خطية في البيانات. هناك طريقتان لالتقاط عدم الخطية في البيانات.

  • إضافة مصطلح متعدد الحدود
  • قم بتجميع المتغير المستمر في متغير قاطع

مصطلح كثير الحدود

من الصورة أدناه، يمكنك أن ترى ما هو الانحدار متعدد الحدود. إنها معادلة ذات متغيرات X ذات قوى مختلفة. يحتوي الانحدار متعدد الحدود من الدرجة الثانية على متغيرين، X وX تربيع. الدرجة الثالثة لديها ثلاثة متغيرات، X، X2، وX3

معادلات الانحدار متعددة الحدود من الدرجة الثانية والثالثة

ما هو الانحدار متعدد الحدود

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

الآن، انظر إلى الصورة اليسرى من الصورة أدناه، أضفنا خمسة حدود إلى الانحدار (أي y=x+x2+x3+x4+x5. يلتقط النموذج الآن النمط بشكل أفضل. هذه هي قوة الانحدار متعدد الحدود.

مقارنة بين التوافق الخطي والتوافق متعدد الحدود ذي الخمسة حدود على نفس مخطط التشتت

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

دعونا نرى ما إذا كان يزيد من الدقة.

تحتاج إلى إضافة هذه الميزة الجديدة إلى مجموعة البيانات وفي قائمة الميزات المستمرة.

يمكنك إضافة المتغير الجديد في مجموعة بيانات التدريب والاختبار، لذلك يكون كتابة دالة أكثر ملاءمة.

def square_var(df_t, df_te, var_name = 'age'):
    df_t['new'] = df_t[var_name].pow(2) 
    df_te['new'] = df_te[var_name].pow(2) 
    return df_t, df_te

تحتوي الدالة على 3 وسيطات:

  • df_t: تحديد مجموعة التدريب
  • df_te: تحديد مجموعة الاختبار
  • var_name = 'age': تحديد المتغير المراد تحويله

يمكنك استخدام الكائن pow(2) لتربيع العمر المتغير. لاحظ أن المتغير الجديد يسمى "جديد"

الآن وبعد كتابة الدالة Square_var، يمكنك إنشاء مجموعات البيانات الجديدة.

df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')

كما ترون، تحتوي مجموعة البيانات الجديدة على ميزة أخرى.

print(df_train_new.shape, df_test_new.shape)			
(32561, 16) (16281, 16)

يسمى المتغير المربع جديد في مجموعة البيانات. تحتاج إلى إضافته إلى قائمة الميزات المستمرة.

CONTI_FEATURES_NEW  = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week', 'new']
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]

ملاحظات أنك قمت بتغيير دليل الرسم البياني. لا يمكنك تدريب نماذج مختلفة في نفس الدليل. وهذا يعني أنك بحاجة إلى تغيير مسار الوسيطة model_dir. إذا لم تقم بذلك، فسيقوم TensorFlow بإلقاء خطأ.

model_1 = tf.estimator.LinearClassifier(
    model_dir="ongoing/train1", 
    feature_columns=categorical_features+ continuous_features_new)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train1', '_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 0x1820f04b70>, '_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}
FEATURES_NEW = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'new']
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES_NEW}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

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

model_1.train(input_fn=get_input_fn(df_train, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      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 ongoing/train1/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 81.487
INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)
INFO:tensorflow:global_step/sec: 111.169
INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)
INFO:tensorflow:global_step/sec: 128.91
INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)
INFO:tensorflow:global_step/sec: 132.546
INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)
INFO:tensorflow:global_step/sec: 162.194
INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)
INFO:tensorflow:global_step/sec: 204.852
INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)
INFO:tensorflow:global_step/sec: 188.923
INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)
INFO:tensorflow:global_step/sec: 192.041
INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)
INFO:tensorflow:global_step/sec: 197.025
INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt.
INFO:tensorflow:Loss for final step: 28861.898.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1820f04c88>
model_1.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
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-06-02-08:28:37
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:39
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703

{'accuracy': 0.7944229,
 'accuracy_baseline': 0.76377374,
 'auc': 0.6093755,
 'auc_precision_recall': 0.54885805,
 'average_loss': 111.0046,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 14119.265,
 'precision': 0.6682401,
 'prediction/mean': 0.09116262,
 'recall': 0.2576703}

أدى المتغير التربيعي إلى تحسين الدقة من 0.76 إلى 0.79. دعونا نرى ما إذا كان بإمكانك القيام بعمل أفضل من خلال الجمع بين مصطلح الجرد والتفاعل معًا.

التخصيص والتفاعل

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

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

في TensorFlow، يتم ذلك باستخدام Bucketized_column. تحتاج إلى إضافة نطاق القيم في الحدود.

age = tf.feature_column.numeric_column('age')
age_buckets = tf.feature_column.bucketized_column(
    age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

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

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

education_x_occupation = [tf.feature_column.crossed_column(
    ['education', 'occupation'], hash_bucket_size=1000)]
age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column(
    [age_buckets, 'education', 'occupation'], hash_bucket_size=1000)]

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

يجب تربيع age_buckets قبل إضافته إلى أعمدة الميزات. يمكنك أيضًا إضافة الميزات الجديدة إلى أعمدة الميزات وإعداد المقدر

base_columns = [
    age_buckets,
]

model_imp = tf.estimator.LinearClassifier(
    model_dir="ongoing/train3", 
    feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)

الناتج

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train3', '_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 0x1823021be0>, '_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}
FEATURES_imp = ['age','workclass', 'education', 'education_num', 'marital',
                'occupation', 'relationship', 'race', 'sex', 'native_country', 'new']

def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES_imp}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

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

model_imp.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      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 ongoing/train3/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 94.969
INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)
INFO:tensorflow:global_step/sec: 242.342
INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)
INFO:tensorflow:global_step/sec: 213.686
INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)
INFO:tensorflow:global_step/sec: 174.084
INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 191.78
INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)
INFO:tensorflow:global_step/sec: 163.436
INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)
INFO:tensorflow:global_step/sec: 164.347
INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)
INFO:tensorflow:global_step/sec: 154.274
INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)
INFO:tensorflow:global_step/sec: 189.14
INFO:tensorflow:loss = 44.69645, step = 901 (0.531 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt.
INFO:tensorflow:Loss for final step: 44.18133.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1823021cf8>
model_imp.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									  
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-06-02-08:28:52
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:54
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216


{'accuracy': 0.8358209,
 'accuracy_baseline': 0.76377374,
 'auc': 0.88401634,
 'auc_precision_recall': 0.69599575,
 'average_loss': 0.35122654,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 44.67437,
 'precision': 0.68986726,
 'prediction/mean': 0.23320661,
 'recall': 0.55408216}

مستوى الدقة الجديد هو 83.58 بالمائة. وهو أعلى بنسبة أربعة بالمائة من النموذج السابق.

وأخيرًا، يمكنك إضافة مصطلح تنظيم لمنع التجهيز الزائد.

الخطوة 5) المعلمة الفائقة: Lasso & Ridge

النموذج الخاص بك يمكن أن يعاني من المفرط or غير مناسب.

  • التجهيز الزائد: النموذج غير قادر على تعميم التنبؤ على البيانات الجديدة
  • Underfitting: النموذج غير قادر على التقاط نمط البيانات. أي الانحدار الخطي عندما تكون البيانات غير خطية

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

لمنع الإفراط في التجهيز، يمنحك التنظيم الإمكانيات للتحكم في مثل هذا التعقيد وجعله أكثر قابلية للتعميم. هناك طريقتان للتنظيم:

  • L1: لاسو
  • L2: ريدج

في TensorFlow، يمكنك إضافة هاتين المعلمتين الفائقتين في المُحسِّن. على سبيل المثال، كلما ارتفع المعلمة الفائقة L2، يميل الوزن إلى أن يكون منخفضًا جدًا وقريبًا من الصفر. سيكون الخط المجهز مسطحًا جدًا، بينما يشير L2 القريب من الصفر إلى أن الأوزان قريبة من الانحدار الخطي المنتظم.

يمكنك تجربة القيمة المختلفة للمعلمات الفائقة بنفسك ومعرفة ما إذا كان بإمكانك زيادة مستوى الدقة.

ملاحظات أنه إذا قمت بتغيير المعلمة الفائقة، فأنت بحاجة إلى حذف المجلد ongoing/train4 وإلا سيبدأ النموذج بالنموذج المدرب مسبقًا.

دعونا نرى كيف هي الدقة مع الضجيج

model_regu = tf.estimator.LinearClassifier(
    model_dir="ongoing/train4", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,
    optimizer=tf.train.FtrlOptimizer(
        learning_rate=0.1,
        l1_regularization_strength=0.9,
        l2_regularization_strength=5))

الناتج

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_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 0x1820d9c128>, '_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}
model_regu.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      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 ongoing/train4/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 77.4165
INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)
INFO:tensorflow:global_step/sec: 187.889
INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)
INFO:tensorflow:global_step/sec: 201.895
INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)
INFO:tensorflow:global_step/sec: 217.992
INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)
INFO:tensorflow:global_step/sec: 193.676
INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)
INFO:tensorflow:global_step/sec: 202.195
INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)
INFO:tensorflow:global_step/sec: 216.756
INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)
INFO:tensorflow:global_step/sec: 240.215
INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)
INFO:tensorflow:global_step/sec: 220.336
INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.
INFO:tensorflow:Loss for final step: 43.4942.


<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181ff39e48>
model_regu.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

الناتج

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-06-02-08:29:07
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:29:09
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823





{'accuracy': 0.83833915,
 'accuracy_baseline': 0.76377374,
 'auc': 0.8869794,
 'auc_precision_recall': 0.7014905,
 'average_loss': 0.34691378,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 44.12581,
 'precision': 0.69720596,
 'prediction/mean': 0.23662092,
 'recall': 0.5579823}

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

الموديل مجموعة الميزات الدقة AUC دقة تذكر
نموذج خط الأساس المستمر + الفئوي 0.7615626 0.63300294 0.49401596 0.38637546
model_1 العمر الأساسي بالإضافة إلى مربع العمر 0.7944229 0.6093755 0.6682401 0.2576703
نموذج_إمب العمر المصنف بالإضافة إلى الأعمدة المتقاطعة 0.8358209 0.88401634 0.68986726 0.55408216
نموذج_ريجو الأعمدة المتقاطعة بالإضافة إلى L1 و L2 0.83833915 0.8869794 0.69720596 0.5579823

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

في الدرس التالي، ستتعلم كيفية تحسين المصنف الخطي باستخدام طريقة النواة.

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

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

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

لا. تم إصدار حزمة tf-estimator آخر مرة مع TensorFlow 2.15، وهي غير متوفرة في TensorFlow 2.16 وما بعده. يمكنك تطبيق هذا الدليل على TensorFlow 1.x، أو نقل المُقدِّر الجاهز إلى نموذج خطي في Keras باستخدام دليل النقل الرسمي.

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

يقوم Copilot بإنشاء نماذج أولية متكررة لأعمدة الميزات بسرعة، بما في ذلك عبارات التكرار على الأعمدة المتصلة وكتل الأعمدة المتقاطعة. تعامل مع الناتج كمسودة أولية - تحقق من كل اسم API مقابل الإصدار الذي تستخدمه، لأن Copilot يمزج بين صيغ TensorFlow 1.x و 2.x.

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

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

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

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