البرنامج التعليمي للانحدار الخطي باستخدام TensorFlow [أمثلة]

ما هو الانحدار الخطي؟

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

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

  • واجهة برمجة التطبيقات ذات المستوى المنخفض:قم ببناء البنية التحتية وتحسين النموذج من الصفر. إنه أمر معقد بالنسبة للمبتدئين
  • API عالي المستوى:قم بتحديد الخوارزمية. إنها أسهل طريقة. يوفر TensorFlow مجموعة أدوات تسمى مقدر لبناء وتدريب وتقييم والتنبؤ.

في هذا البرنامج التعليمي، سوف تستخدم المقدرين فقط. الحسابات أسرع وأسهل في التنفيذ. يشرح الجزء الأول من البرنامج التعليمي كيفية استخدام مُحسِّن النسب المتدرج لتدريب الانحدار الخطي في TensorFlow. في الجزء الثاني، ستستخدم مجموعة بيانات بوسطن للتنبؤ بسعر المنزل باستخدام مقدر TensorFlow.

تحميل مجموعة بيانات بوسطن

كيفية تدريب نموذج الانحدار الخطي

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

تخيل أن لديك متغيرين، x وy، ومهمتك هي التنبؤ بقيمة معرفة قيمة . إذا رسمت البيانات، يمكنك رؤية علاقة إيجابية بين المتغير المستقل، x والمتغير التابع y.

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

يمكنك ملاحظة أنه إذا كانت x=1،y تساوي تقريبًا 6 وإذا كانت x=2،y ستكون حوالي 8.5.

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

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

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

مع:

  • الانحدار الخطي مع TensorFlow هو التحيز. على سبيل المثال إذا س = 0، ص =تدريب نموذج الانحدار الخطي
  • تدريب نموذج الانحدار الخطي هو الوزن المرتبط بـ x
  • تدريب نموذج الانحدار الخطي هو المتبقي أو خطأ النموذج. ويتضمن ما لا يمكن للنموذج تعلمه من البيانات

تخيل أنك قمت بتركيب النموذج ووجدت الحل التالي لـ:

  • تدريب نموذج الانحدار الخطي = 3.8
  • تدريب نموذج الانحدار الخطي = 2.78

يمكنك استبدال تلك الأرقام في المعادلة وتصبح:

ص = 3.8 + 2.78x

لديك الآن طريقة أفضل للعثور على قيم y. أي أنه يمكنك استبدال x بأي قيمة تريد التنبؤ بها. في الصورة أدناه، قمنا باستبدال x في المعادلة بجميع القيم الموجودة في مجموعة البيانات ورسمنا النتيجة.

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

يمثل الخط الأحمر القيمة المجهزة، وهي قيم y لكل قيمة x. لا تحتاج إلى رؤية قيمة x للتنبؤ بـ y، فكل x يوجد أي شيء ينتمي إلى الخط الأحمر. يمكنك أيضًا التنبؤ بقيم x أعلى من 2!

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

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

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

إذا كنت تستخدم الانحدار الخطي، يمكنك كتابة هذه المعادلة:

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

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

كيف تعمل الخوارزمية

عمل الخوارزمية

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

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

عمل الخوارزمية

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

عمل الخوارزمية

أين:

  • عمل الخوارزمية هل الأوزان كذلك عمل الخوارزمية يشير إلى القيمة المتوقعة
  • y هي القيم الحقيقية
  • م هو عدد الملاحظات

نلاحظ أن عمل الخوارزمية يعني أنه يستخدم تبديل المصفوفات. ال عمل الخوارزمية هو التدوين الرياضي للمتوسط.

الهدف هو العثور على الأفضل عمل الخوارزمية التي تقلل من المشروعات الصغيرة والمتوسطة

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

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

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

عمل الخوارزمية

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

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

تتذكر المعادلة الأولى

عمل الخوارزمية

الأوزان النهائية هي 3.8 و 2.78. يوضح لك الفيديو أدناه كيفية تحسين نزول التدرج لوظيفة الخسارة للعثور على هذه الأوزان

كيفية تدريب الانحدار الخطي مع TensorFlow

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

ستستخدم مجموعة بيانات بوسطن، التي تتضمن المتغيرات التالية

الجريمة معدل الجريمة للفرد حسب المدينة
zn نسبة الأراضي السكنية المخصصة للقطع التي تزيد مساحتها عن 25,000 قدم مربع.
وال نسبة فدان الأعمال غير التجزئة لكل مدينة.
أكاسيد النيتروجين تركيز أكاسيد النيتريك
rm متوسط ​​عدد الغرف لكل مسكن
السن نسبة الوحدات التي يشغلها المالك والتي تم بناؤها قبل عام 1940
ديس المسافات الموزونة إلى خمسة مراكز توظيف في بوسطن
ضريبة معدل ضريبة الأملاك كاملة القيمة لكل دولار 10,000
com.ptratio نسبة التلاميذ إلى المعلمين حسب المدينة
medv القيمة المتوسطة للمنازل التي يشغلها مالكوها بآلاف الدولارات

ستقوم بإنشاء ثلاث مجموعات بيانات مختلفة:

بيانات موضوعي شكل
التدريب تدريب النموذج والحصول على الأوزان 400 , 10
التقييم تقييم أداء النموذج على البيانات غير المرئية 100 , 10
تنبؤ استخدم النموذج للتنبؤ بقيمة المنزل بناءً على البيانات الجديدة 6 , 10

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

خلال الجزء الثاني من البرنامج التعليمي، سوف تتعلم كيفية استخدام TensorFlow بثلاث طرق مختلفة لاستيراد البيانات:

  • مع الباندا
  • التكنولوجيا مع نمباي
  • فقط تي اف

لاحظ أن جميع الخيارات تقديم نفس النتائج.

سوف تتعلم كيفية استخدام واجهة برمجة التطبيقات عالية المستوى لإنشاء نموذج الانحدار الخطي TensorFlow وتدريبه وتقييمه. إذا كنت تستخدم واجهة برمجة التطبيقات (API) ذات المستوى المنخفض، فيجب عليك تحديد ما يلي يدويًا:

  • فقدان وظيفة
  • الأمثل: نزول التدرج
  • ضرب المصفوفات
  • الرسم البياني والموتر

هذا أمر ممل وأكثر تعقيدًا بالنسبة للمبتدئين.

الباندا

تحتاج إلى استيراد المكتبات اللازمة لتدريب النموذج.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
import itertools

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

يمكنك تحديد أسماء الأعمدة وتخزينها في COLUMNS. يمكنك استخدام pd.read_csv() لاستيراد البيانات.

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",
           "dis", "tax", "ptratio", "medv"]

Training_set = pd.read_csv("E:/boston_train.csv"، Skiinitialspace=True,skiprows=1,names=COLUMNS)

test_set = pd.read_csv("E:/boston_test.csv"، Skiinitialspace=True,skiprows=1,names=COLUMNS)

Predict_set = pd.read_csv("E:/boston_predict.csv"، Skiinitialspace=True,skiprows=1,names=COLUMNS)

يمكنك طباعة شكل البيانات.

print(training_set.shape, test_set.shape, prediction_set.shape)

الناتج

(400, 10) (100, 10) (6, 10)

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

يتم ذلك باستخدام الكود أدناه.

FEATURES = ["crim", "zn", "indus", "nox", "rm",				
                 "age", "dis", "tax", "ptratio"]
LABEL = "medv"

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

تحتاج إلى تحويل المتغيرات الرقمية بالتنسيق المناسب. يوفر Tensorflow طريقة لتحويل المتغير المستمر: tf.feature_column.numeric_column().

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

لاحظ أنك سوف تستخدم Python فهم القائمة باستخدام ميزات القائمة لإنشاء قائمة جديدة تسمى feature_cols. يساعدك على تجنب الكتابة تسع مرات tf.feature_column.numeric_column(). يعد فهم القائمة طريقة أسرع وأكثر نظافة لإنشاء قوائم جديدة

feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]

الخطوة 3) تحديد المقدر

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

  • تراجع
    • DNNRegressor
    • الانحدار الخطي
    • DNNLineaCombinedRegressor
  • صنف
    • مصنف DNN
    • المصنف الخطي
    • DNNLineaCombinedClassifier

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

تحتاج الدالة إلى وسيطتين:

  • feature_columns: يحتوي على المتغيرات المراد تضمينها في النموذج
  • model_dir: مسار لتخزين الرسم البياني وحفظ معلمات النموذج وما إلى ذلك

سيقوم Tensorflow تلقائيًا بإنشاء ملف باسم Train في دليل العمل الخاص بك. تحتاج إلى استخدام هذا المسار للوصول إلى Tensorboard كما هو موضح في مثال انحدار TensorFlow أدناه.

estimator = tf.estimator.LinearRegressor(    
        feature_columns=feature_cols,   
        model_dir="train")

الناتج

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

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

على سبيل المثال، إذا كانت بياناتك تحتوي على 100 ملاحظة وقمت بتحديد حجم دفعة قدره 10، فهذا يعني أن النموذج سوف يرى 10 ملاحظات لكل تكرار (10*10).

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

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

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

لإرشاد Tensorflow كيفية تغذية النموذج، يمكنك استخدام pandas_input_fn. يحتاج هذا الكائن إلى 5 معلمات:

  • x: بيانات الميزة
  • ذ: تسمية البيانات
  • حجم الدفعة: دفعة. افتراضيا 128
  • num_epoch: عدد العصور، بشكل افتراضي 1
  • خلط ورق اللعب: خلط البيانات أم لا. بشكل افتراضي، لا شيء

تحتاج إلى تغذية النموذج عدة مرات حتى تتمكن من تحديد وظيفة لتكرار هذه العملية. كل هذه الوظيفة get_input_fn.

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)

الطريقة المعتادة لتقييم أداء النموذج هي:

  • درب النموذج
  • تقييم النموذج في مجموعة بيانات مختلفة
  • يتوقع

يوفر مقدر Tensorflow ثلاث وظائف مختلفة لتنفيذ هذه الخطوات الثلاث بسهولة.

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

يمكنك استخدام قطار المقدر لتقييم النموذج. يحتاج مقدر القطار إلى input_fn وعدد من الخطوات. يمكنك استخدام الوظيفة التي قمت بإنشائها أعلاه لتغذية النموذج. ثم تقوم بإرشاد النموذج للتكرار 1000 مرة. لاحظ أنك لا تحدد عدد العصور، بل تترك النموذج يتكرر 1000 مرة. إذا قمت بتعيين عدد الحقبة على 1، فسيتم تكرار النموذج 4 مرات: يوجد 400 سجل في مجموعة التدريب، وحجم الدفعة هو 128

  1. صفوف 128
  2. صفوف 128
  3. صفوف 128
  4. صفوف 16

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

estimator.train(input_fn=get_input_fn(training_set,                                       
                                           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 train/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 238.616
INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec)
INFO:tensorflow:global_step/sec: 314.293
INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec)
INFO:tensorflow:global_step/sec: 303.863
INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec)
INFO:tensorflow:global_step/sec: 308.782
INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec)
INFO:tensorflow:global_step/sec: 244.969
INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec)
INFO:tensorflow:global_step/sec: 155.966
INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec)
INFO:tensorflow:global_step/sec: 263.256
INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec)
INFO:tensorflow:global_step/sec: 254.112
INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec)
INFO:tensorflow:global_step/sec: 292.405
INFO:tensorflow:loss = 10845.855, step = 901 (0.341 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.

يمكنك التحقق من Tensorboard باستخدام الأمر التالي:

activate hello-tf
# For MacOS
tensorboard --logdir=./train
# For Windows
tensorboard --logdir=train

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

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

ev = estimator.evaluate(    
          input_fn=get_input_fn(test_set,                          
          num_epochs=1,                          
          n_batch = 128,                          
          shuffle=False))

الناتج

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896

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

loss_score = ev["loss"]
print("Loss: {0:f}".format(loss_score))

الناتج

Loss: 3215.895996

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

training_set['medv'].describe()

الناتج

count    400.000000
mean      22.625500
std        9.572593
min        5.000000
25%       16.600000
50%       21.400000
75%       25.025000
max       50.000000
Name: medv, dtype: float64

ومن ملخص الإحصائية أعلاه تعلم أن متوسط ​​سعر المنزل هو 22 ألفاً، والحد الأدنى 9 آلاف والحد الأقصى 50 ألفاً. يرتكب النموذج خطأً نموذجيًا بقيمة 3 آلاف دولار.

الخطوة 6) قم بالتنبؤ

أخيرًا، يمكنك استخدام أداة تقدير TensorFlow لتقدير قيمة 6 منازل في بوسطن.

y = estimator.predict(    
         input_fn=get_input_fn(prediction_set,                          
         num_epochs=1,                          
         n_batch = 128,                          
         shuffle=False))

لطباعة القيم المقدرة لـ، يمكنك استخدام هذا الكود:

predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions)))

الناتج

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.96125], dtype=float32), array([27.270979], dtype=float32), array([29.299236], dtype=float32), array([16.436684], dtype=float32), array([21.460876], dtype=float32)]

ويتوقع النموذج القيم التالية:

منزل تنبؤ
1 32.29
2 18.96
3 27.27
4 29.29
5 16.43
7 21.46

لاحظ أننا لا نعرف القيمة الحقيقية لـ . في البرنامج التعليمي للتعلم العميق، ستحاول التغلب على النموذج الخطي

الحل Numpy

يشرح هذا القسم كيفية تدريب النموذج باستخدام مقدر numpy لتغذية البيانات. الطريقة هي نفسها باستثناء أنك ستستخدم مقدر numpy_input_fn.

Training_set_n = pd.read_csv("E:/boston_train.csv").القيم

test_set_n = pd.read_csv("E:/boston_test.csv").القيم

Predict_set_n = pd.read_csv("E:/boston_predict.csv").القيم

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

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

def prepare_data(df):     
        X_train = df[:, :-3]    
        y_train = df[:,-3]    
        return X_train, y_train

يمكنك استخدام الوظيفة لفصل التسمية عن ميزات مجموعة بيانات التدريب/التقييم

X_train, y_train = prepare_data(training_set_n)
X_test, y_test = prepare_data(test_set_n)

يتعين عليك استبعاد العمود الأخير من مجموعة بيانات التنبؤ لأنه يحتوي على NaN فقط

x_predict = prediction_set_n[:, :-2]

تأكيد شكل المصفوفة. علماً بأن الملصق يجب أن لا يكون له بعد، يعني (400،).

print(X_train.shape, y_train.shape, x_predict.shape)

الناتج

(400, 9) (400,) (6, 9)

يمكنك إنشاء أعمدة الميزات على النحو التالي:

feature_columns = [      tf.feature_column.numeric_column('x', shape=X_train.shape[1:])]

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

estimator = tf.estimator.LinearRegressor(    
         feature_columns=feature_columns,    
         model_dir="train1")

الناتج

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

يمكنك استخدام التقدير numpy لتغذية النموذج بالبيانات ثم تدريب النموذج. لاحظ أننا قمنا بتعريف الدالة input_fn من قبل لتسهيل القراءة.

# Train the estimatortrain_input = tf.estimator.inputs.numpy_input_fn(   
           x={"x": X_train},    
           y=y_train,    
           batch_size=128,    
           shuffle=False,    
           num_epochs=None)
           estimator.train(input_fn = train_input,steps=5000)

الناتج

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 train1/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 490.057
INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec)
INFO:tensorflow:global_step/sec: 788.986
INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec)
INFO:tensorflow:global_step/sec: 736.339
INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec)
INFO:tensorflow:global_step/sec: 383.305
INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec)
INFO:tensorflow:global_step/sec: 859.832
INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec)
INFO:tensorflow:global_step/sec: 804.394
INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec)
INFO:tensorflow:global_step/sec: 753.059
INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec)
INFO:tensorflow:global_step/sec: 402.165
INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec)
INFO:tensorflow:global_step/sec: 344.022
INFO:tensorflow:loss = 10845.854, step = 901 (0.288 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train1/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.985.
Out[23]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1b6ea860>

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

eval_input = tf.estimator.inputs.numpy_input_fn(    
       x={"x": X_test},    
       y=y_test, 
       shuffle=False,    
       batch_size=128,    
       num_epochs=1)
   estimator.evaluate(eval_input,steps=None)

الناتج

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945
Out[24]:
{'average_loss': 32.158947, 'global_step': 1000, 'loss': 3215.8945}

وأخيرا، يمكنك حساب التنبؤ. وينبغي أن تكون مماثلة للباندا.

test_input = tf.estimator.inputs.numpy_input_fn(    
        x={"x": x_predict},    
        batch_size=128,    
        num_epochs=1,   
        shuffle=False)
        y = estimator.predict(test_input) 			
predictions = list(p["predictions"] for p in itertools.islice(y, 6))
print("Predictions: {}".format(str(predictions)))

الناتج

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.961248], dtype=float32), array([27.270979], dtype=float32), array([29.299242], dtype=float32), array([16.43668], dtype=float32), array([21.460878], dtype=float32)]

حل تنسورفلو

القسم الأخير مخصص لحل TensorFlow. هذه الطريقة أكثر تعقيدًا قليلاً من الطريقة الأخرى.

لاحظ أنه إذا كنت تستخدم Jupyter مفكرة، تحتاج إلى إعادة تشغيل النواة وتنظيفها لتشغيل هذه الجلسة.

TensorFlow قام ببناء أداة رائعة لتمرير البيانات إلى خط الأنابيب. في هذا القسم، سوف تقوم ببناء الدالة input_fn بنفسك.

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

أولاً، عليك الإعلان عن متغيرين بمسار ملف CSV. لاحظ أن لديك ملفين، أحدهما لمجموعة التدريب والآخر لمجموعة الاختبار.

import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"

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

يتم تعريف متغير العوامات بواسطة [0.]

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",				
                "dis", "tax", "ptratio", "medv"]RECORDS_ALL = [[0.0], [0.0], [0.0], [0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]

الخطوة 2) تعريف الدالة input_fn

يمكن تقسيم الوظيفة إلى ثلاثة أجزاء:

  1. استيراد البيانات
  2. قم بإنشاء المكرر
  3. تستهلك البيانات

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

def input_fn(data_file, batch_size, num_epoch = None):				
       # Step 1				
          def parse_csv(value):        
          columns = tf.decode_csv(value, record_defaults= RECORDS_ALL)        
          features = dict(zip(COLUMNS, columns))				
          #labels = features.pop('median_house_value')        
          labels =  features.pop('medv')        
          return features, labels							
          
          # Extract lines from input files using the 
          Dataset API.    dataset = (tf.data.TextLineDataset(data_file) # Read text file       
          .skip(1) # Skip header row       
          .map(parse_csv))			   
          
          dataset = dataset.repeat(num_epoch)    
          dataset = dataset.batch(batch_size) 				
          # Step 3    
          iterator = dataset.make_one_shot_iterator()    
          features, labels = iterator.get_next()    
          return features, labels

** استيراد البيانات **

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

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

  • tf.data.TextLineمجموعة البيانات (ملف_البيانات): يقرأ هذا السطر ملف CSV
  • .تخطي (1): تخطي الرأس
  • .map(parse_csv)): تحليل السجلات إلى موترات تحتاج إلى تحديد وظيفة لتوجيه كائن الخريطة. يمكنك استدعاء هذه الوظيفة parse_csv.

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

  • tf.decode_csv(value, Record_defaults= RECORDS_ALL): تستخدم الطريقة decode_csv مخرجات TextLineمجموعة البيانات لقراءة ملف CSV. يقوم Record_defaults بإرشاد TensorFlow حول نوع الأعمدة.
  • dict(zip(_CSV_COLUMNS, columns)): قم بملء القاموس بجميع الأعمدة المستخرجة أثناء معالجة البيانات هذه
  • Features.pop('median_house_value'): استبعاد المتغير الهدف من متغير الميزة وإنشاء متغير تسمية

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

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

الخطوة 3) إنشاء المكرر

أنت الآن جاهز للخطوة الثانية: إنشاء مُكرِّر لإرجاع العناصر الموجودة في مجموعة البيانات.

الطريقة الأبسط لإنشاء عامل هي باستخدام طريقة make_one_shot_iterator.

بعد ذلك، يمكنك إنشاء الميزات والتسميات من المكرر.

الخطوة 4) استهلك البيانات

يمكنك التحقق مما يحدث باستخدام وظيفة input_fn. تحتاج إلى استدعاء الوظيفة في جلسة لاستهلاك البيانات. حاولت بحجم دفعة يساوي 1.

لاحظ أنه يطبع الميزات الموجودة في القاموس والتسمية كمصفوفة.

سيظهر السطر الأول من ملف CSV. يمكنك محاولة تشغيل هذا الرمز عدة مرات بحجم دفعة مختلف.

next_batch = input_fn(df_train, batch_size = 1, num_epoch = None)
with tf.Session() as sess:    
     first_batch  = sess.run(next_batch)    
     print(first_batch)

الناتج

({'crim': array([2.3004], dtype=float32), 'zn': array([0.], dtype=float32), 'indus': array([19.58], dtype=float32), 'nox': array([0.605], dtype=float32), 'rm': array([6.319], dtype=float32), 'age': array([96.1], dtype=float32), 'dis': array([2.1], dtype=float32), 'tax': array([403.], dtype=float32), 'ptratio': array([14.7], dtype=float32)}, array([23.8], dtype=float32))

الخطوة 4) تحديد عمود الميزة

تحتاج إلى تحديد الأعمدة الرقمية على النحو التالي:

X1= tf.feature_column.numeric_column('crim')
X2= tf.feature_column.numeric_column('zn')
X3= tf.feature_column.numeric_column('indus')
X4= tf.feature_column.numeric_column('nox')
X5= tf.feature_column.numeric_column('rm')
X6= tf.feature_column.numeric_column('age')
X7= tf.feature_column.numeric_column('dis')
X8= tf.feature_column.numeric_column('tax')
X9= tf.feature_column.numeric_column('ptratio')

لاحظ أنك تحتاج إلى دمج كافة المتغيرات في مجموعة

base_columns = [X1, X2, X3,X4, X5, X6,X7, X8, X9]

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

يمكنك تدريب النموذج باستخدام المقدر LinearRegressor.

model = tf.estimator.LinearRegressor(feature_columns=base_columns, model_dir='train3')

الناتج

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

تحتاج إلى استخدام دالة lambda للسماح بكتابة الوسيطة في الوظيفة inpu_fn. إذا كنت لا تستخدم أ وظيفة لامدا، لا يمكنك تدريب النموذج.

# Train the estimatormodel.train(steps =1000,    
          input_fn= lambda : input_fn(df_train,batch_size=128, num_epoch = None))

الناتج

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 train3/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 72.5646
INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec)
INFO:tensorflow:global_step/sec: 101.355
INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec)
INFO:tensorflow:global_step/sec: 109.293
INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec)
INFO:tensorflow:global_step/sec: 102.235
INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec)
INFO:tensorflow:global_step/sec: 104.656
INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec)
INFO:tensorflow:global_step/sec: 106.697
INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec)
INFO:tensorflow:global_step/sec: 118.454
INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec)
INFO:tensorflow:global_step/sec: 114.947
INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec)
INFO:tensorflow:global_step/sec: 111.484
INFO:tensorflow:loss = 10845.855, step = 901 (0.897 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train3/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.
Out[8]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x18225eb8d0>

يمكنك تقييم مدى ملاءمة النموذج الخاص بك في مجموعة الاختبار باستخدام الكود أدناه:

results = model.evaluate(steps =None,input_fn=lambda: input_fn(df_eval, batch_size =128, num_epoch = 1))
for key in results:   
print("   {}, was: {}".format(key, results[key]))

الناتج

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896
   average_loss, was: 32.158958435058594
   loss, was: 3215.89599609375
   global_step, was: 1000

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

في الكود أدناه، قمت بكتابة قيم كل الميزات الموجودة في ملف df_predict csv.

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

prediction_input = {				
          'crim': [0.03359,5.09017,0.12650,0.05515,8.15174,0.24522],				
          'zn': [75.0,0.0,25.0,33.0,0.0,0.0],				
          'indus': [2.95,18.10,5.13,2.18,18.10,9.90],				
          'nox': [0.428,0.713,0.453,0.472,0.700,0.544],				
          'rm': [7.024,6.297,6.762,7.236,5.390,5.782],				
          'age': [15.8,91.8,43.4,41.1,98.9,71.7],				
          'dis': [5.4011,2.3682,7.9809,4.0220,1.7281,4.0317],				
          'tax': [252,666,284,222,666,304],				
          'ptratio': [18.3,20.2,19.7,18.4,20.2,18.4]
     }
     def test_input_fn():    
     dataset = tf.data.Dataset.from_tensors(prediction_input)    
     return dataset
     
     # Predict all our prediction_inputpred_results = model.predict(input_fn=test_input_fn)

وأخيرا، يمكنك طباعة التوقعات.

for pred in enumerate(pred_results):    
print(pred)

الناتج

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
(0, {'predictions': array([32.297546], dtype=float32)})
(1, {'predictions': array([18.96125], dtype=float32)})
(2, {'predictions': array([27.270979], dtype=float32)})
(3, {'predictions': array([29.299236], dtype=float32)})
(4, {'predictions': array([16.436684], dtype=float32)})
(5, {'predictions': array([21.460876], dtype=float32)})

INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([35.60663], dtype=float32)}) (1, {'predictions': array([22.298521], dtype=float32)}) (2, {'predictions': array([25.74533], dtype=float32)}) (3, {'predictions': array([35.126694], dtype=float32)}) (4, {'predictions': array([17.94416], dtype=float32)}) (5, {'predictions': array([22.606628], dtype=float32)})

ملخص

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

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

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

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

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

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