الانحدار الخطي TensorFlow مع مصطلح الوجه والتفاعل

⚡ ملخص ذكي

يتحسن الانحدار الخطي على بيانات الإسكان في بوسطن عندما يتم العثور على حدود التفاعل الصحيحة أولاً. Google تكشف Facets عن تلك العلاقات بصريًا، وقامت ميزتان متقاطعتان بتقليل خسارة اختبار TensorFlow من 1650 إلى 1515.

  • 🔘 البيانات أولاً: إن فهم التوزيعات والقيم الشاذة يسبق أي نموذج، لأن النموذج لا يقوم إلا بتعميم نمط قمت بتحديده بالفعل.
  • ☑️ نظرة عامة على الجوانب: تكشف الإحصائيات الخاصة بكل ميزة عن القيم المفقودة، والأعمدة التي تحتوي على أصفار كثيرة، وانحراف توزيع التدريب مقابل الاختبار في جدول واحد.
  • ✅ دراسة معمقة لجوانب مختلفة: يؤدي تقسيم العلاقات الثلاثية حسب X و Y إلى تحويلها إلى رسم بياني ثنائي الأبعاد قابل للقراءة وملون حسب ربع السعر.
  • 🧪 قراءة الارتباط: تشير الخريطة الحرارية وشبكة الأزواج إلى أن INDUS مع NOX، وDIS مع كليهما، مرشحان للتفاعل.
  • 🛠️ التقييس: تقوم عملية preprocessing.scale بتوسيط الأعمدة الاثني عشر المتصلة قبل أن يراها المُقدِّر، تاركةً CHAS و PRICE دون تغيير.
  • 📈 الربح المقاس: يؤدي إضافة INDUS_NOS و INDUS_NOS_DIS إلى تغيير متوسط ​​الخسارة من 86.89361 إلى 79.78876 في تقسيم الاختبار.

الانحدار الخطي باستخدام TensorFlow مع تحديد الجوانب والتفاعل

الانحدار الخطي باستخدام 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 دفتر.

هناك قسمان للأوجه:

  • نظرة عامة على الأوجه
  • جوانب الغوص العميق

نظرة عامة على الأوجه

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

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

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

جوانب الغوص العميق

أداة 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 وتنزيل المستودعات.

صفحة مستودع جوانب PAIR-code على GitHub

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

يمكنك التحقق من مكان تخزين Facets باستخدام سطر الأوامر هذا:

echo `pwd`/`ls facets`

الآن بعد أن قمت بتحديد موقع Facets، تحتاج إلى تثبيته Jupyter دفتر. تحتاج إلى تعيين دليل العمل على المسار الذي توجد به الجوانب.

يجب أن يكون دليل العمل الحالي وموقع Facets Zip متماثلين.

نافذة طرفية تعرض مجلد "facets" في دليل العمل الحالي

يؤكد سجل الأوامر أعلاه أن برنامج 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. انسخ المسار

مسار ملف مجلد facets_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>

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

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

  • 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)

الناتج

شبكة أزواج Seaborn لـ PRICE و INDUS و NOX و RM و LSTAT

لنبدأ بالجزء العلوي:

  • يرتبط السعر سلبيًا بـ 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")

مخطط انتشار يوضح العلاقة بين مؤشر DIS ومؤشر INDUS، مُلوّن حسب ربع السعر.

استخدام برنامج 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)

الناتج

إطار بيانات التدريب مع إضافة عمودَي INDUS_NOS و INDUS_NOS_DIS

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

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 بالمائة تقريبًا في متوسط ​​الخسارة يعزى إلى عمودَي التفاعل فقط.

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

تم إيقاف استخدامها في مكتبة scikit-learn الإصدار 1.0 وإزالتها في الإصدار 1.2. تحتوي مجموعة البيانات على خاصية مبنية على افتراض حول الفصل العنصري الذاتي وأسعار المنازل، ولم تتحقق الدراسة الأصلية من صحة فرضيتها المتعلقة بجودة الهواء. وتُعدّ بيانات الإسكان في كاليفورنيا أو أميس بدائل شائعة.

يُربّع أو يُكعّب حدّ كثير الحدود أحد المتغيرات لتعديل منحنى الدالة. أما التفاعل فيضرب متغيرين مختلفين، لذا يعتمد ميل أحدهما على مستوى الآخر. يشرح هذا الدرس النوع الثاني، وهو حاصل ضرب INDUS في NOX.

ابحث عن أزواج مترابطة مع بعضها البعض ومع الهدف. تُظهر خريطة بيرسون الحرارية وشبكة الأزواج هذا الترابط بصريًا؛ هنا تتجمع INDUS وNOX معًا، وكلاهما tracسعر k، وهو الإشارة التي تبرر عبورها.

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

يُجيد Copilot التعامل مع عمليات الرسم البياني المتكررة - مثل جداول الأزواج، وخرائط الحرارة المُقنّعة، وقوالب HTML للواجهات. راجع الوسائط التي يقترحها، لأن مكتبة seaborn أعادت تسمية العديد منها، وسيقوم Copilot بدمج التوقيعات القديمة والحديثة بسلاسة.

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

يستخدم القناع np.bool، وهو اسم مستعار تم إيقاف استخدامه في NumPy 1.20 وإزالته في 1.24. تُسبب عمليات التثبيت الحديثة خطأ AttributeError. استبدال القيمة المنطقية المضمنة bool لا يُغير السلوك؛ كما أن np.bool_ يعمل أيضًا إذا كنت بحاجة إلى نوع NumPy القياسي.

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

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