البرنامج التعليمي للانحدار الخطي باستخدام TensorFlow [أمثلة]
ما هو الانحدار الخطي؟
الانحدار الخطي هو نهج في الإحصاء لنمذجة العلاقات بين متغيرين. يتم إجراء هذه النمذجة بين الاستجابة العددية ومتغير توضيحي واحد أو أكثر. وتسمى العلاقة مع متغير تفسيري واحد بالانحدار الخطي البسيط، وبالنسبة لأكثر من متغير تفسيري يسمى الانحدار الخطي المتعدد.
يوفر TensorFlow أدوات للتحكم الكامل في العمليات الحسابية. يتم ذلك باستخدام واجهة برمجة التطبيقات (API) ذات المستوى المنخفض. علاوة على ذلك، تم تجهيز TensorFlow بمجموعة واسعة من واجهات برمجة التطبيقات (APIs) لأداء العديد منها آلة التعلم الخوارزميات. هذه هي واجهة برمجة التطبيقات عالية المستوى. يطلق عليها TensorFlow اسم المقدرين
- واجهة برمجة التطبيقات ذات المستوى المنخفض:قم ببناء البنية التحتية وتحسين النموذج من الصفر. إنه أمر معقد بالنسبة للمبتدئين
- API عالي المستوى:قم بتحديد الخوارزمية. إنها أسهل طريقة. يوفر TensorFlow مجموعة أدوات تسمى مقدر لبناء وتدريب وتقييم والتنبؤ.
في هذا البرنامج التعليمي، سوف تستخدم المقدرين فقط. الحسابات أسرع وأسهل في التنفيذ. يشرح الجزء الأول من البرنامج التعليمي كيفية استخدام مُحسِّن النسب المتدرج لتدريب الانحدار الخطي في TensorFlow. في الجزء الثاني، ستستخدم مجموعة بيانات بوسطن للتنبؤ بسعر المنزل باستخدام مقدر TensorFlow.
كيفية تدريب نموذج الانحدار الخطي
قبل أن نبدأ في تدريب النموذج، دعونا نلقي نظرة على ما هو الانحدار الخطي.
تخيل أن لديك متغيرين، x وy، ومهمتك هي التنبؤ بقيمة معرفة قيمة . إذا رسمت البيانات، يمكنك رؤية علاقة إيجابية بين المتغير المستقل، x والمتغير التابع y.
يمكنك ملاحظة أنه إذا كانت x=1،y تساوي تقريبًا 6 وإذا كانت x=2،y ستكون حوالي 8.5.
هذه ليست طريقة دقيقة للغاية وعرضة للخطأ، خاصة مع مجموعة بيانات تحتوي على مئات الآلاف من النقاط.
يتم تقييم الانحدار الخطي بمعادلة. يتم تفسير المتغير y بمتغير واحد أو أكثر. في المثال الخاص بك، هناك متغير تابع واحد فقط. إذا كان عليك كتابة هذه المعادلة فستكون:
مع:
هو التحيز. على سبيل المثال إذا س = 0، ص =
هو الوزن المرتبط بـ x
هو المتبقي أو خطأ النموذج. ويتضمن ما لا يمكن للنموذج تعلمه من البيانات
تخيل أنك قمت بتركيب النموذج ووجدت الحل التالي لـ:
= 3.8
= 2.78
يمكنك استبدال تلك الأرقام في المعادلة وتصبح:
ص = 3.8 + 2.78x
لديك الآن طريقة أفضل للعثور على قيم y. أي أنه يمكنك استبدال x بأي قيمة تريد التنبؤ بها. في الصورة أدناه، قمنا باستبدال x في المعادلة بجميع القيم الموجودة في مجموعة البيانات ورسمنا النتيجة.
يمثل الخط الأحمر القيمة المجهزة، وهي قيم y لكل قيمة x. لا تحتاج إلى رؤية قيمة x للتنبؤ بـ y، فكل x يوجد أي شيء ينتمي إلى الخط الأحمر. يمكنك أيضًا التنبؤ بقيم x أعلى من 2!
إذا كنت ترغب في توسيع الانحدار الخطي ليشمل المزيد من المتغيرات المشتركة، فيمكنك ذلك عن طريق إضافة المزيد من المتغيرات إلى النموذج. الفرق بين التحليل التقليدي والانحدار الخطي هو أن الانحدار الخطي ينظر إلى كيفية تفاعل y مع كل متغير x يتم أخذه بشكل مستقل.
لنلق نظرة على مثال. تخيل أنك تريد التنبؤ بمبيعات متجر لبيع الآيس كريم. تحتوي مجموعة البيانات على معلومات مختلفة مثل الطقس (أي ممطر، مشمس، غائم)، ومعلومات العملاء (أي الراتب، والجنس، والحالة الاجتماعية).
سيحاول التحليل التقليدي التنبؤ بالبيع من خلال حساب المتوسط لكل متغير ومحاولة تقدير البيع لسيناريوهات مختلفة. سيؤدي ذلك إلى تنبؤات سيئة وتقييد التحليل بالسيناريو المختار.
إذا كنت تستخدم الانحدار الخطي، يمكنك كتابة هذه المعادلة:
سوف تجد الخوارزمية الحل الأفضل للأوزان؛ فهذا يعني أنها ستحاول تقليل التكلفة (الفرق بين الخط المجهز ونقاط البيانات).
كيف تعمل الخوارزمية
ستختار الخوارزمية رقمًا عشوائيًا لكل منها و
واستبدل قيمة 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
- صفوف 128
- صفوف 128
- صفوف 128
- صفوف 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
يمكن تقسيم الوظيفة إلى ثلاثة أجزاء:
- استيراد البيانات
- قم بإنشاء المكرر
- تستهلك البيانات
يوجد أدناه الرمز العام لتعريف الوظيفة. سيتم شرح الكود بعد ذلك
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. تحتاج إلى تحديد:
- أعمدة مميزة. إذا كان مستمرًا: tf.feature_column.numeric_column(). يمكنك ملء قائمة بفهم قائمة بايثون
- المقدر: tf.estimator.LinearRegressor(feature_columns, model_dir)
- وظيفة لاستيراد البيانات وحجم الدفعة والعصر: input_fn()
بعد ذلك، أنت جاهز للتدريب والتقييم والتنبؤ باستخدام القطار () والتقييم () والتنبؤ ()





