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

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

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

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

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

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

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

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

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

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

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

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

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

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

مثال التصنيف الثنائي

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

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

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

نموذج خطي

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

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

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

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

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

مثال على الوظيفة اللوجستية

مثال على الوظيفة اللوجستية
مثال على الوظيفة اللوجستية

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

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

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

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

دقة

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

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

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

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

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

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

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

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

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

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

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

دقة

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

دقة

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

حساسية

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

حساسية

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

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

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

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

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

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

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

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

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

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

  • الخطوة 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 أعلاه. النسبة هي نفسها تقريبًا لمجموعة الاختبار. يرجى الرجوع إلى هذا البرنامج التعليمي على Facets للمزيد.

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. سنقوم بطباعة القيمة المحولة للعمر وهي لغرض توضيحي، وبالتالي ليست هناك حاجة لفهم كود بايثون. يمكنك الرجوع إلى الوثائق الرسمية لفهم الرموز.

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 عمودين جديدين، أحدهما للذكر والآخر للإناث. إذا كان الجنس مساويًا للذكر، فسيكون العمود الجديد للذكر مساويًا لـ 2 والإناث مساويًا لـ 1. يتم عرض هذا المثال في الجدول أدناه:

الصفوف جنس بعد التحول ذكر أنثى
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

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

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

الآن، انظر إلى الصورة اليسرى من الصورة أدناه، أضفنا خمسة حدود إلى الانحدار (أي 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}

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

الملخص

لتدريب نموذج، تحتاج إلى:

  • تحديد السمات: المتغيرات المستقلة: X
  • تحديد التسمية: المتغير التابع: y
  • بناء مجموعة القطار/الاختبار
  • تحديد الوزن الأولي
  • تحديد دالة الخسارة: MSE
  • تحسين النموذج: نزول التدرج
  • تعريف:
    • معدل التعليم
    • عدد العصر
    • حجم الدفعة
    • عدد الصف

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

  1. أعمدة مميزة. إذا كان مستمرًا: tf.feature_column.numeric_column(). يمكنك ملء قائمة بفهم قائمة بايثون
  2. المقدر: tf.estimator.LinearClassifier(feature_columns, model_dir, n_classes = 2)
  3. وظيفة لاستيراد البيانات وحجم الدفعة والعصر: input_fn()

بعد ذلك، أنت جاهز للتدريب والتقييم والتنبؤ باستخدام القطار () والتقييم () والتنبؤ ()

لتحسين أداء النموذج، يمكنك:

  • استخدام الانحدار متعدد الحدود
  • مصطلح التفاعل: tf.feature_column.crossed_column
  • إضافة معلمة التنظيم