الانحدار الخطي TensorFlow مع مصطلح الوجه والتفاعل
⚡ ملخص ذكي
يتحسن الانحدار الخطي على بيانات الإسكان في بوسطن عندما يتم العثور على حدود التفاعل الصحيحة أولاً. Google تكشف Facets عن تلك العلاقات بصريًا، وقامت ميزتان متقاطعتان بتقليل خسارة اختبار TensorFlow من 1650 إلى 1515.
الانحدار الخطي باستخدام TensorFlow
ستتعلم في هذا البرنامج التعليمي كيفية التحقق من البيانات وإعدادها لإنشاء مهمة انحدار خطي بسيطة.
ينقسم هذا البرنامج التعليمي إلى قسمين:
- ابحث عن التفاعل
- اختبر النموذج
في خانة رمز الخصم، أدخل TABBYDAY. البرنامج التعليمي السابقلقد استخدمت مجموعة بيانات بوسطن لتقدير متوسط سعر المنزل. تتميز مجموعة بيانات بوسطن بحجم صغير، حيث تحتوي على 506 ملاحظة فقط. تعتبر مجموعة البيانات هذه بمثابة معيار لمحاولة استخدام خوارزميات الانحدار الخطي الجديدة.
تتكون مجموعة البيانات من:
| متغير | الوصف |
|---|---|
| zn | نسبة الأراضي السكنية المخصصة للقطع التي تزيد مساحتها عن 25,000 قدم مربع. |
| وال | نسبة فدان الأعمال غير المخصصة للبيع بالتجزئة لكل مدينة. |
| أكاسيد النيتروجين | تركيز أكاسيد النيتريك |
| rm | متوسط عدد الغرف لكل مسكن |
| السن | نسبة الوحدات التي يشغلها المالك والتي تم بناؤها قبل عام 1940 |
| ديس | المسافات الموزونة إلى خمسة مراكز توظيف في بوسطن |
| ضريبة | معدل ضريبة الأملاك كاملة القيمة لكل دولار 10,000 |
| com.ptratio | نسبة التلاميذ إلى المعلمين حسب المدينة |
| medv | القيمة المتوسطة للمنازل التي يشغلها مالكوها بآلاف الدولارات |
| الجريمة | معدل الجريمة للفرد حسب المدينة |
| شاس | متغير وهمي لنهر تشارلز (1 إذا كان يحد النهر؛ 0 بخلاف ذلك) |
| B | نسبة السود حسب المدينة |
في هذا البرنامج التعليمي، سوف نقوم بتقدير السعر المتوسط باستخدام الانحدار الخطي، ولكن التركيز سيكون على عملية واحدة معينة آلة التعلم:"إعداد البيانات".
يقوم النموذج بتعميم النمط في البيانات. لالتقاط مثل هذا النمط، عليك العثور عليه أولاً. من الممارسات الجيدة إجراء تحليل البيانات قبل تشغيل أي خوارزمية للتعلم الآلي.
إن اختيار الميزات الصحيحة يُحدث فرقًا كبيرًا في نجاح النموذج الخاص بك. تخيل أنك تحاول تقدير أجر شخص ما، وإذا لم تقم بتضمين الجنس كمتغير مشترك، فسينتهي بك الأمر بتقدير ضعيف.
هناك طريقة أخرى لتحسين النموذج وهي النظر إلى العلاقة بين المتغير المستقل. بالعودة إلى المثال، يمكنك التفكير في التعليم باعتباره مرشحًا ممتازًا للتنبؤ بالأجور وأيضًا بالمهنة. ومن العدل أن نقول إن المهنة تعتمد على مستوى التعليم، أي أن التعليم العالي غالبا ما يؤدي إلى مهنة أفضل. إذا قمنا بتعميم هذه الفكرة، يمكننا القول أن الارتباط بين المتغير التابع والمتغير التوضيحي يمكن تضخيمه بمتغير توضيحي آخر.
لفهم التأثير المحدود للتعليم على المهنة، يمكننا استخدام مصطلح التفاعل.
وإذا نظرت إلى معادلة الأجور تجدها:
If إذا كان إيجابيا، فإنه يعني ضمنا أن المستوى الإضافي من التعليم يؤدي إلى زيادة أعلى في القيمة المتوسطة للمنزل لمستوى وظيفي مرتفع. وبعبارة أخرى، هناك تأثير تفاعلي بين التعليم والمهنة.
تستخدم نفس عائلة المُقدِّرات أيضًا مصنف خطي عندما يكون التصنيف فئةً وليس سعرًا. في هذا الدرس، سنحاول تحديد المتغيرات التي يمكن اعتبارها مناسبةً لشروط التفاعل. وسنختبر ما إذا كانت إضافة هذا النوع من المعلومات تؤدي إلى تحسين توقعات الأسعار.
احصائيات ملخصة
هناك بعض الخطوات التي يمكنك اتباعها قبل الانتقال إلى النموذج. كما ذكرنا سابقًا، يُعدّ النموذج تعميمًا للبيانات. وأفضل الممارسات هي فهم البيانات أولًا ثم وضع التنبؤ. إذا لم تكن على دراية ببياناتك، فستكون فرصك ضئيلة في تحسين نموذجك.
كخطوة أولى، قم بتحميل البيانات كإطار بيانات الباندا وإنشاء مجموعة تدريب ومجموعة اختبار.
نصائح: لإتمام هذا الدرس، ستحتاج إلى تثبيت مكتبتي matplotlib و seaborn. Pythonيمكنك تثبيت Python حزمة على الطاير مع Jupyter. أنت لا يجب افعل هذا
!conda install -- yes matplotlib
لكن
import sys !{sys.executable} -m pip install matplotlib # Already installed !{sys.executable} -m pip install seaborn
لاحظ أن هذه الخطوة ليست ضرورية إذا كان لديك matplotlib وseaborn مثبتين.
Matplotlib هي المكتبة لإنشاء رسم بياني فيها PythonSeaborn هي مكتبة لتصور البيانات الإحصائية مبنية على Matplotlib. وهي توفر...tracقصص مثيرة وجميلة.
يستورد الكود أدناه المكتبات الضرورية.
import pandas as pd from sklearn import datasets import tensorflow as tf from sklearn.datasets import load_boston import numpy as np
تتضمن مكتبة sklearn مجموعة بيانات بوسطن. يمكنك الاتصال بواجهة برمجة التطبيقات (API) الخاصة به لاستيراد البيانات.
ملاحظة حول الإصدار: load_boston تم إيقاف استخدامها في مكتبة scikit-learn 1.0 و تمت إزالته في مكتبة scikit-learn 1.2 لأن مجموعة البيانات تتضمن سمة ذات دلالة عنصرية. في التثبيت الحالي، استخدم fetch_california_housing بدلاً من ذلك، أو قم بتحميل الملف الخام بنفسك. لم يتغير سير العمل الموضح أدناه؛ الاختلاف الوحيد هو في أداة التحميل.
boston = load_boston() df = pd.DataFrame(boston.data)
يتم تخزين أسماء المعالم في الكائن feature_names كمصفوفة.
boston.feature_names
الناتج
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
يمكنك إعادة تسمية الأعمدة.
df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)
يمكنك تحويل المتغير CHAS كمتغير سلسلة وتسميته بنعم إذا كان CHAS = 1 ولا إذا كان CHAS = 0
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'}) df['CHAS'].head(5) 0 no 1 no 2 no 3 no 4 no Name: CHAS, dtype: object
مع الباندا، من السهل تقسيم مجموعة البيانات. تقوم بتقسيم مجموعة البيانات عشوائيًا إلى 80 بالمائة من مجموعة التدريب و20 بالمائة من مجموعة الاختبار. الباندا يحتوي على وظيفة أخذ عينات مدمجة لتقسيم إطار البيانات.
المعلمة الأولى frac هي قيمة من 0 إلى 1. يمكنك تعيينها على 0.8 لتحديد 80 بالمائة من إطار البيانات بشكل عشوائي.
تقوم خاصية random_state بإصلاح عملية الخلط، بحيث يتم إرجاع نفس الصفوف للجميع.
### Create train/test set
df_train=df.sample(frac=0.8,random_state=200)
df_test=df.drop(df_train.index)
يمكنك الحصول على شكل البيانات. ينبغي أن يكون:
- مجموعة القطار: 506*0.8 = 405
- مجموعة الاختبار: 506*0.2 = 101
print(df_train.shape, df_test.shape)
الناتج
(405, 14) (101, 14)
df_test.head(5)
الناتج
| جريمة | ZN | اندوس | تشاس | أكاسيد النيتروجين | RM | العمر | DIS | RAD | TAX | خطة | B | LSTAT | السعر | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0.00632 | 18.0 | 2.31 | لا | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 |
| 1 | 0.02731 | 0.0 | 7.07 | لا | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 |
| 3 | 0.03237 | 0.0 | 2.18 | لا | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 |
| 6 | 0.08829 | 12.5 | 7.87 | لا | 0.524 | 6.012 | 66.6 | 5.5605 | 5.0 | 311.0 | 15.2 | 395.60 | 12.43 | 22.9 |
| 7 | 0.14455 | 12.5 | 7.87 | لا | 0.524 | 6.172 | 96.1 | 5.9505 | 5.0 | 311.0 | 15.2 | 396.90 | 19.15 | 27.1 |
البيانات فوضوية؛ غالبًا ما تكون غير متوازنة ومليئة بالقيم المتطرفة التي تؤدي إلى التخلص من التحليل والتدريب على التعلم الآلي.
الخطوة الأولى لتنظيف مجموعة البيانات هي فهم المكان الذي تحتاج فيه إلى التنظيف. قد يكون تنظيف مجموعة البيانات أمرًا صعبًا، خاصة بأي طريقة قابلة للتعميم
استخدم Google قام فريق البحث بتطوير أداة لهذه المهمة تسمى جوانب يساعدك ذلك على تصور البيانات وتقسيمها بطرق متنوعة. هذه نقطة انطلاق جيدة لفهم كيفية تنظيم مجموعة البيانات.
تتيح لك ميزة "الجوانب" العثور على الأماكن التي لا تبدو فيها البيانات تمامًا كما تتوقع.
باستثناء تطبيقهم على الويب، Google يسهل ذلك دمج مجموعة الأدوات في Jupyter دفتر.
هناك قسمان للأوجه:
- نظرة عامة على الأوجه
- جوانب الغوص العميق
نظرة عامة على الأوجه
توفر نظرة عامة على الوجوه نظرة عامة على مجموعة البيانات. تقسم نظرة عامة على الوجوه أعمدة البيانات إلى صفوف من المعلومات البارزة التي توضح
- نسبة فقدان الملاحظة
- الحد الأدنى والحد الأقصى للقيم
- الإحصائيات مثل المتوسط والوسيط والانحراف المعياري.
- كما أنه يضيف عمودًا يوضح النسبة المئوية للقيم التي هي أصفار، وهو أمر مفيد عندما تكون معظم القيم أصفار.
- من الممكن رؤية هذه التوزيعات في مجموعة بيانات الاختبار وكذلك مجموعة التدريب لكل ميزة. وهذا يعني أنه يمكنك التحقق مرة أخرى من أن الاختبار له توزيع مماثل لبيانات التدريب.
هذا هو على الأقل الحد الأدنى الذي يجب القيام به قبل أي مهمة للتعلم الآلي. باستخدام هذه الأداة، لن تفوتك هذه الخطوة الحاسمة، وهي تسلط الضوء على بعض العيوب.
جوانب الغوص العميق
أداة Facets Deep Dive رائعة. فهي تتيح لك فهم بياناتك بشكل أوضح، مع إمكانية التكبير لرؤية كل جزء منها على حدة. وهذا يعني أنه يمكنك تقسيم البيانات حسب الصف والعمود، وذلك عبر أي من خصائص مجموعة البيانات.
سوف نستخدم هاتين الأداتين مع مجموعة بيانات بوسطن.
ملاحظات: لا يمكنك استخدام Facets Overview وFacets Deep Dive في نفس الوقت. تحتاج إلى مسح دفتر الملاحظات أولاً لتغيير الأداة.
قبل استخدام أي من الأداتين، يجب تثبيت Facets في بيئة دفتر الملاحظات.
تثبيت الوجه
يمكنك استخدام تطبيق الويب Facet لإجراء معظم التحليلات. في هذا البرنامج التعليمي، سوف ترى كيفية استخدامه داخل Jupyter دفتر الملاحظات.
أولاً، تحتاج إلى تثبيت nbextensions. يتم ذلك باستخدام هذا الكود. قم بنسخ ولصق الكود التالي في محطة الطرفية الخاصة بجهازك.
pip install jupyter_contrib_nbextensions
وبعد ذلك مباشرة، ستحتاج إلى استنساخ المستودعات الموجودة في جهاز الكمبيوتر الخاص بك. لديك خياران:
الخيار 1) انسخ هذا الرمز والصقه في المحطة (موصى به)
إذا لم يكن لديك برنامج Git مثبتًا على جهازك، فيُرجى الانتقال إلى هذا الرابط. URL جيت من أجل Windows تحميل الصفحة واتبع التعليمات. بمجرد الانتهاء، يمكنك استخدام الأمر git في الوحدة الطرفية لمستخدم Mac أو مطالبة Anaconda Windows المستخدم
git clone https://github.com/PAIR-code/facets
الخيار 2) انتقل إلى البرنامج المساعد في التأليف مستودع PAIR-code/facets وتنزيل المستودعات.
تحتوي صفحة المستودع أعلاه على زر التنزيل المستخدم في الخيار الثاني. إذا اخترت الخيار الأول، فسيتم حفظ الملف في مجلد التنزيلات. يمكنك إما ترك الملف قيد التنزيل أو سحبه إلى مسار آخر.
يمكنك التحقق من مكان تخزين Facets باستخدام سطر الأوامر هذا:
echo `pwd`/`ls facets`
الآن بعد أن قمت بتحديد موقع Facets، تحتاج إلى تثبيته Jupyter دفتر. تحتاج إلى تعيين دليل العمل على المسار الذي توجد به الجوانب.
يجب أن يكون دليل العمل الحالي وموقع Facets Zip متماثلين.
يؤكد سجل الأوامر أعلاه أن برنامج Facet موجود في مجلد العمل الحالي. عليك توجيه مجلد العمل إلى Facet.
cd facets
لتثبيت Facets في Jupyter، لديك خياران. إذا قمت بتثبيت Jupyter مع Conda لجميع المستخدمين، انسخ هذا الرمز:
jupyter nbextension install facets-dist/
وإلا، استخدم:
jupyter nbextension install facets-dist/ --user
حسنًا، أنت جاهز تمامًا. دعونا نفتح نظرة عامة على الوجه.
نظرة عامة على الجوانب التشغيلية في Jupyter
نظرة عامة تستخدم أ Python البرنامج النصي لحساب الإحصائيات. تحتاج إلى استيراد البرنامج النصي المسمى generic_feature_statistics_generator Jupyter. لا تقلق؛ يقع البرنامج النصي في ملفات الجوانب.
تحتاج إلى تحديد مساره. يتم ذلك بسهولة. يمكنك فتح الجوانب، وفتح الملف faces_overview، ثم python. انسخ المسار
بعد ذلك ، ارجع إلى Jupyter، واكتب الكود التالي. قم بتغيير المسار '/Users/Thomas/facets/facets_overview/python' إلى المسار الخاص بك.
# Add the facets overview python code to the python path# Add t import sys sys.path.append('/Users/Thomas/facets/facets_overview/python')
يمكنك استيراد البرنامج النصي بالكود أدناه.
from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator
في الويندوز، يصبح نفس الكود
import sys sys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python") from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator
لحساب إحصائيات الميزات، تحتاج إلى استخدام الدالة GenericFeatureStatisticsGenerator()، ويمكنك استخدام الكائن ProtoFromDataFrames. يمكنك تمرير إطار البيانات في القاموس. على سبيل المثال، إذا أردنا إنشاء إحصائية ملخصة لمجموعة القطارات، فيمكننا تخزين المعلومات في قاموس واستخدامها في الكائن `ProtoFromDataFrames'.
'name': 'train', 'table': df_train
الاسم هو اسم الجدول الذي يتم عرضه، ويمكنك استخدام اسم الجدول الذي تريد حساب الملخص فيه. في المثال الخاص بك، الجدول الذي يحتوي على البيانات هو df_train
# Calculate the feature statistics proto from the datasets and stringify it for use in facets overview import base64 gfsg = GenericFeatureStatisticsGenerator() proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}, {'name': 'test', 'table': df_test}]) #proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}]) protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")
وأخيرًا، ما عليك سوى نسخ ولصق الكود أدناه. يأتي الكود مباشرة من GitHub. يجب أن تكون قادرًا على رؤية هذا:
# Display the facets overview visualization for this data# Displ from IPython.core.display import display, HTML HTML_TEMPLATE = """<link rel="import" href="/nbextensions/facets-dist/facets-jupyter.html" > <facets-overview id="elem"></facets-overview> <script> document.querySelector("#elem").protoInput = "{protostr}"; </script>""" html = HTML_TEMPLATE.format(protostr=protostr) display(HTML(html))
رسم بياني للارتباط وشبكة أزواج
بعد التحقق من البيانات وتوزيعها، يمكنك رسم مصفوفة الارتباط. تحسب مصفوفة الارتباط معامل بيرسون، الذي تتراوح قيمته بين -1 و1، حيث تشير القيمة الموجبة إلى ارتباط إيجابي، والقيمة السالبة إلى ارتباط سلبي.
أنت مهتم بمعرفة المتغيرات التي يمكن أن تكون مرشحًا جيدًا لمصطلحات التفاعل.
ملاحظة حول الإصدار: القناع أدناه يدعو np.bool، وهو اسم مستعار تم إيقاف استخدامه في NumPy 1.20 و تمت إزالته في NumPy 1.24في إصدار حديث من NumPy، يظهر نفس الخطأ. AttributeError: module 'numpy' has no attribute 'bool'؛ المدمج bool هو البديل المباشر.
## Choose important feature and further check with Dive %matplotlib inline import matplotlib.pyplot as plt import seaborn as sns sns.set(style="ticks") # Compute the correlation matrix corr = df.corr('pearson') # Generate a mask for the upper triangle mask = np.zeros_like(corr, dtype=np.bool) mask[np.triu_indices_from(mask)] = True # Set up the matplotlib figure f, ax = plt.subplots(figsize=(11, 9)) # Generate a custom diverging colormap cmap = sns.diverging_palette(220, 10, as_cmap=True) # Draw the heatmap with the mask and correct aspect ratio sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True, square=True, linewidths=.5, cbar_kws={"shrink": .5})
الناتج
<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>
في الخريطة الحرارية أعلاه، تشير المربعات الداكنة إلى ارتباطات أقوى. من المصفوفة، يمكنك أن ترى:
- LSTAT
- RM
ترتبط هذه المؤشرات ارتباطًا وثيقًا بالسعر. ومن السمات المميزة الأخرى وجود ارتباط إيجابي قوي بين أكاسيد النيتروجين والصناعات، مما يعني أن هذين المتغيرين يتحركان في نفس الاتجاه. ويرتبط كلاهما أيضًا بالسعر. كما يرتبط مؤشر DIS ارتباطًا وثيقًا بالصناعات وأكاسيد النيتروجين.
لديك تلميح أولي بأن INDUS و NOX يمكن أن يكونا مرشحين جيدين لمصطلح التفاعل، وقد يكون DIS مثيرًا للاهتمام أيضًا للتركيز عليه.
يمكنك التعمق قليلاً من خلال رسم شبكة زوجية. وسوف يوضح بمزيد من التفصيل خريطة الارتباط التي رسمتها من قبل.
تتكون شبكة الأزواج على النحو التالي:
- الجزء العلوي: قطعة أرض متناثرة مع خط مثبت
- قطري: مخطط كثافة النواة
- الجزء السفلي: مخطط كثافة النواة متعدد المتغيرات
تركز على أربعة متغيرات مستقلة. يتوافق الاختيار مع المتغيرات ذات الارتباط القوي بالسعر.
- اندوس
- أكاسيد النيتروجين
- RM
- LSTAT
علاوة على ذلك، السعر.
ملاحظات أن الخطأ القياسي يضاف بشكل افتراضي إلى المخطط المبعثر.
attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"] g = sns.PairGrid(df[attributes]) g = g.map_upper(sns.regplot, color="g") g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False) g = g.map_diag(sns.kdeplot)
الناتج
لنبدأ بالجزء العلوي:
- يرتبط السعر سلبيًا بـ INDUS وNOX وLSTAT؛ يرتبط بشكل إيجابي مع RM.
- توجد علاقة غير خطية طفيفة بين LSTAT و PRICE
- يوجد مثل خط مستقيم عندما يساوي السعر 50. من وصف مجموعة البيانات، تم اقتطاع PRICE بقيمة 50
قطري: يبدو أن NOX لديه مجموعتان، واحدة حول 0.5 والأخرى حول 0.85.
للتحقق من ذلك بشكل أكبر، يمكنك إلقاء نظرة على الجزء السفلي. تعد كثافة النواة متعددة المتغيرات مثيرة للاهتمام بمعنى أنها تلون حيث توجد معظم النقاط. يرسم الاختلاف مع الرسم البياني التشتتي كثافة احتمالية، حتى لو لم تكن هناك نقطة في مجموعة البيانات لإحداثيات معينة. عندما يكون اللون أقوى، فإنه يشير إلى تركيز عالٍ للنقاط حول هذه المنطقة.
إذا قمت بفحص الكثافة المتعددة المتغيرات لـ INDUS وNOX، يمكنك رؤية الارتباط الإيجابي والمجموعتين. عندما تكون حصة الصناعة أعلى من 18، يكون تركيز أكاسيد النيتريك أعلى من 0.6.
يمكنك التفكير في إضافة تفاعل بين INDUS وNOX في العلاقة الخطية.
وأخيرًا، يمكنك استخدام الأداة الثانية التي أنشأها Googleتحليل معمق للبيانات. تنقسم واجهة المستخدم إلى أربعة أقسام رئيسية. يعرض القسم المركزي البيانات بشكل قابل للتكبير. في أعلى اللوحة، توجد قائمة منسدلة تتيح لك تغيير ترتيب البيانات والتحكم في تقسيمها وموضعها ولونها. على اليمين، يوجد عرض تفصيلي لصف بيانات محدد. هذا يعني أنه يمكنك النقر على أي نقطة بيانات في العرض المركزي للاطلاع على تفاصيل تلك النقطة.
أثناء خطوة تصور البيانات، أنت مهتم بالبحث عن الارتباط الثنائي بين المتغير المستقل وسعر المنزل. ومع ذلك، فإن هذا يشمل ثلاثة متغيرات على الأقل، كما أن التعامل مع المخططات ثلاثية الأبعاد أمر معقد.
إحدى طرق معالجة هذه المشكلة هي إنشاء متغير تصنيفي. أي، يمكننا إنشاء رسم بياني ثنائي الأبعاد وتلوين النقاط. يمكنك تقسيم المتغير PRICE إلى أربع فئات، كل فئة منها تمثل ربعًا (أي 0.25، 0.5، 0.75). نسمي هذا المتغير الجديد Q_PRICE.
## Check non linearity with important features df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"]) ## Show non linearity between RM and LSTAT ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")
استخدام برنامج Facets للغوص العميق
لفتح Deep Dive، تحتاج إلى تحويل البيانات إلى تنسيق JSON. توفر Pandas دالة لذلك: استدعِ to_json على DataFrame.
يحدد السطر الأول من التعليمات البرمجية حجم الصورة النقطية وفقًا لعدد الصفوف التي تحتويها مجموعة البيانات.
df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"]) sprite_size = 32 if len(df.index)>50000 else 64 jsonstr = df.to_json(orient='records')
الكود أدناه مأخوذ من Google GitHub. بعد تشغيل الكود، يجب أن تتمكن من رؤية ما يلي:
# Display thde Dive visualization for this data from IPython.core.display import display, HTML # Create Facets template HTML_TEMPLATE = """<link rel="import" href="/nbextensions/facets-dist/facets-jupyter.html"> <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive> <script> document.querySelector("#elem").data = {jsonstr}; </script>""" # Load the json dataset and the sprite_size into the template html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size) # Display the template display(HTML(html))
أنت مهتم بمعرفة ما إذا كان هناك ارتباط بين معدل الصناعة وتركيز الأكسيد والمسافة إلى مركز العمل وسعر المنزل.
للقيام بذلك، عليك أولاً تقسيم البيانات حسب نطاق الصناعة واللون مع ربع السعر:
- حدد الوجه X واختر INDUS.
- حدد العرض واختر DIS. وسوف تلوين النقاط مع ربع سعر المنزل
هنا، تعني الألوان الداكنة أن المسافة إلى أول مركز عمل أكبر.
حتى الآن، يظهر مرة أخرى ما تعرفه، انخفاض معدل الصناعة، وارتفاع الأسعار. الآن يمكنك إلقاء نظرة على التقسيم حسب INDUX، بواسطة NOX.
حدد مواجهة Y واختر NOX.
الآن يمكنك أن ترى أن المنزل البعيد عن مركز العمل الأول يتمتع بأقل حصة صناعية وبالتالي أقل تركيز للأكسيد. إذا اخترت عرض النوع باستخدام Q_PRICE وقمت بتكبير الزاوية اليسرى السفلية، فيمكنك معرفة نوع السعر.
لديك تلميح آخر بأن التفاعل بين IND وNOX وDIS يمكن أن يكون مرشحًا جيدًا لتحسين النموذج.
أسفرت عملية الاستكشاف عن تفاعلين محتملين، لذا فإن الخطوة التالية هي اختبارهما في نموذج فعلي.
الانحدار الخطي مع TensorFlow
في هذا القسم، ستقوم بتقدير نموذج الانحدار الخطي باستخدام TensorFlow واجهة برمجة تطبيقات التقدير. ستتابع على النحو التالي:
- تحضير البيانات
- تقدير نموذج مرجعي: لا يوجد تفاعل
- تقدير نموذج مع التفاعل
ملاحظة حول الإصدار: القادم tf-estimator تم إصدار النسخة النهائية من الحزمة مع TensorFlow 2.15، وهي غير موجودة في TensorFlow 2.16 وما بعده، لذا tf.estimator.LinearRegressor يعمل فقط على TensorFlow 1.x إلا إذا قمت بترحيله إلى نموذج خطي Keras.
تذكر أن هدف التعلم الآلي هو تقليل الخطأ. في هذه الحالة، سيفوز النموذج ذو أقل متوسط مربع خطأ. يقوم مُقدِّر TensorFlow بحساب هذا المقياس تلقائيًا.
بيانات التحضير
في معظم الحالات، ستحتاج إلى تحويل بياناتك. لهذا السبب تُعدّ نظرة عامة على الجوانب مثيرة للاهتمام. من خلال الإحصائية الموجزة، لاحظت وجود قيم متطرفة. تؤثر هذه القيم على التقديرات لأنها لا تُشبه المجتمع الذي تُحلله. عادةً ما تُؤدي القيم المتطرفة إلى تحريف النتائج. على سبيل المثال، تميل القيمة المتطرفة الموجبة إلى المبالغة في تقدير المعامل.
يُعدّ توحيد المتغير حلاً جيداً لمعالجة هذه المشكلة. ويعني التوحيد أن يكون الانحراف المعياري مساوياً لواحد والمتوسط مساوياً لصفر. تتضمن عملية التوحيد خطوتين. أولاً، يتم تقسيم المتغير إلى مجموعتين.tracيمثل هذا المتوسط الحسابي للمتغير. ثانياً، يقسم على الانحراف المعياري بحيث يكون للتوزيع انحراف معياري يساوي واحد.
المكتبة تعلم الحروف يُعدّ توحيد المتغيرات مفيدًا. يمكنك استخدام وحدة المعالجة المسبقة مع مقياس الكائن لهذا الغرض.
يمكنك استخدام الوظيفة أدناه لقياس مجموعة البيانات. لاحظ أنك لا تقوم بقياس عمود التسمية والمتغيرات الفئوية.
from sklearn import preprocessing def standardize_data(df): X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']]) X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']) df_scale = pd.concat([X_scaled_df, df['CHAS'], df['PRICE']],axis=1, join='inner') return df_scale
يمكنك استخدام الوظيفة لإنشاء مجموعة التدريب/الاختبار المتدرجة.
df_train_scale = standardize_data(df_train) df_test_scale = standardize_data(df_test)
الانحدار الأساسي: المعيار
أولاً، تقوم بتدريب النموذج واختباره دون تفاعل. والغرض من ذلك هو رؤية مقياس أداء النموذج.
طريقة تدريب النموذج هي نفسها تمامًا كما هو موضح في البرنامج التعليمي على API عالية المستوى. سوف تستخدم مقدر TensorFlow LinearRegressor.
للتذكير، عليك أن تختار:
- الميزات التي يجب وضعها في النموذج
- تحويل الميزات
- بناء الانحدار الخطي
- إنشاء الدالة input_fn
- تدريب النموذج
- اختبار النموذج
تستخدم جميع المتغيرات في مجموعة البيانات لتدريب النموذج. إجمالاً، هناك اثنا عشر متغيرًا مستمرًا ومتغير فئوي واحد.
## Add features to the bucket: ### Define continuous list CONTI_FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'] CATE_FEATURES = ['CHAS']
يمكنك تحويل المعالم إلى عمود رقمي أو عمود فئوي
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES] #categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000) categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]
يمكنك إنشاء النموذج باستخدام خطي Regressor. قمت بتخزين النموذج في المجلد Train_Boston
model = tf.estimator.LinearRegressor(
model_dir="train_Boston",
feature_columns=categorical_features + continuous_features)
الناتج
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_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 0x1a19e76ac8>, '_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}
يتم تحويل كل عمود في بيانات التدريب أو الاختبار إلى موتر باستخدام الدالة get_input_fn
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS'] LABEL= 'PRICE' 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)
يمكنك تقدير النموذج على بيانات القطار.
model.train(input_fn=get_input_fn(df_train_scale,
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_Boston/model.ckpt. INFO:tensorflow:loss = 56417.703, step = 1 INFO:tensorflow:global_step/sec: 144.457 INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec) INFO:tensorflow:global_step/sec: 258.392 INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec) INFO:tensorflow:global_step/sec: 227.998 INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec) INFO:tensorflow:global_step/sec: 210.739 INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec) INFO:tensorflow:global_step/sec: 234.237 INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec) INFO:tensorflow:global_step/sec: 238.1 INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec) INFO:tensorflow:global_step/sec: 237.934 INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec) INFO:tensorflow:global_step/sec: 220.687 INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec) INFO:tensorflow:global_step/sec: 232.702 INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec) INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt. INFO:tensorflow:Loss for final step: 23228.568. <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>
وأخيرًا، يمكنك تقدير أداء النموذج في مجموعة الاختبار
model.evaluate(input_fn=get_input_fn(df_test_scale,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)
الناتج
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43 INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785 {'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}
خسارة النموذج هي 1650.9785. هذا هو المقياس الذي يجب التغلب عليه في القسم التالي
تحسين النموذج: مصطلح التفاعل
خلال الجزء الأول من الدرس، لاحظتَ علاقةً مثيرةً للاهتمام بين المتغيرات. كشفت تقنيات التصور المختلفة أن INDUS وNOX مرتبطان ببعضهما البعض، ويُضخِّم كلٌّ منهما تأثير الآخر على السعر. ولا يقتصر تأثير التفاعل بين INDUS وNOX على السعر فحسب، بل يزداد هذا التأثير قوةً عند تفاعله مع DIS.
حان الوقت لتعميم هذه الفكرة ومعرفة ما إذا كان بإمكانك تحسين تنبؤ النموذج.
يجب إضافة عمودين جديدين إلى كل مجموعة بيانات: التدريب والاختبار. وللقيام بذلك، أنشئ دالة لحساب حد التفاعل، وأخرى لحساب حد التفاعل الثلاثي. تُنتج كل دالة عمودًا واحدًا. بعد إنشاء المتغيرات الجديدة، يمكنك دمجها مع مجموعتي بيانات التدريب والاختبار.
أولاً، تحتاج إلى إنشاء متغير جديد للتفاعل بين INDUS وNOX.
تقوم الدالة أدناه بإرجاع إطاري بيانات، التدريب والاختبار، مع التفاعل بين var_1 وvar_2، في حالتك INDUS وNOX.
def interaction_term(var_1, var_2, name): t_train = df_train_scale[var_1]*df_train_scale[var_2] train = t_train.rename(name) t_test = df_test_scale[var_1]*df_test_scale[var_2] test = t_test.rename(name) return train, test
يمكنك تخزين العمودين الجديدين
interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS') interation_ind_ns_train.shape (325,)
ثانيًا، تقوم بإنشاء دالة ثانية لحساب حد التفاعل الثلاثي.
def triple_interaction_term(var_1, var_2,var_3, name): t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3] train = t_train.rename(name) t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3] test = t_test.rename(name) return train, test interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')
الآن بعد أن أصبحت لديك جميع الأعمدة المطلوبة، يمكنك إضافتها لتدريب مجموعة البيانات واختبارها. يمكنك تسمية هذين إطاري البيانات الجديدين:
- df_train_new
- df_test_new
df_train_new = pd.concat([df_train_scale,
interation_ind_ns_train,
interation_ind_ns_dis_train],
axis=1, join='inner')
df_test_new = pd.concat([df_test_scale,
interation_ind_ns_test,
interation_ind_ns_dis_test],
axis=1, join='inner')
df_train_new.head(5)
الناتج
هذا كل شيء: يمكنك تقدير النموذج الجديد باستخدام حدود التفاعل ومعرفة كيف هو مقياس الأداء.
CONTI_FEATURES_NEW = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'INDUS_NOS', 'INDUS_NOS_DIS'] ### Define categorical list continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW] model = tf.estimator.LinearRegressor( model_dir="train_Boston_1", feature_columns= categorical_features + continuous_features_new)
الناتج
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_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 0x1a1a5d5860>, '_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}
Code
FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS'] LABEL= 'PRICE' 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)
model.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 train_Boston_1/model.ckpt. INFO:tensorflow:loss = 56417.703, step = 1 INFO:tensorflow:global_step/sec: 124.844 INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec) INFO:tensorflow:global_step/sec: 182.704 INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec) INFO:tensorflow:global_step/sec: 208.189 INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec) INFO:tensorflow:global_step/sec: 213.855 INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec) INFO:tensorflow:global_step/sec: 209.758 INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec) INFO:tensorflow:global_step/sec: 196.618 INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec) INFO:tensorflow:global_step/sec: 196.472 INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec) INFO:tensorflow:global_step/sec: 172.82 INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec) INFO:tensorflow:global_step/sec: 168.916 INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec) INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt. INFO:tensorflow:Loss for final step: 19598.387. <tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
model.evaluate(input_fn=get_input_fn(df_test_new,
num_epochs=1,
n_batch = 128,
shuffle=False),
steps=1000)
الناتج
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14 INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863 {'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}
الخسارة الجديدة هي 1515.9863. بمجرد إضافة متغيرين جديدين، تمكنت من تقليل الخسارة. هذا يعني أنه يمكنك إجراء تنبؤ أفضل من النموذج القياسي.
| الموديل | مجموعة الميزات | دليل النموذج | متوسط الخسارة | خسارة |
|---|---|---|---|---|
| مؤشر | 12 عمودًا موحدًا متصلًا بالإضافة إلى CHAS | قطار بوسطن | 86.89361 | 1650.9785 |
| مع التفاعل | Benchmark بالإضافة إلى INDUS_NOS و INDUS_NOS_DIS | قطار_بوسطن_1 | 79.78876 | 1515.9863 |
كلا الرقمين يأتيان من نفس تقسيم الاختبار المكون من 101 صف، لذا فإن الانخفاض بنسبة 8 بالمائة تقريبًا في متوسط الخسارة يعزى إلى عمودَي التفاعل فقط.











