يوم مجتمع ML هو 9 نوفمبر! الانضمام إلينا للحصول على التحديثات من TensorFlow، JAX، وأكثر معرفة المزيد

تعزيز الأشجار باستخدام مقدِّرات

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

هذا البرنامج التعليمي هو تجول نهاية إلى نهاية تدريب نموذجا تعزيز جهود متدرجة باستخدام أشجار القرار مع tf.estimator API. تعد نماذج الأشجار المعززة من بين أكثر مناهج التعلم الآلي شيوعًا وفعالية لكل من الانحدار والتصنيف. إنها تقنية تجميعية تجمع بين التنبؤات من عدة نماذج شجرية (فكر في العشرات أو المئات أو حتى الآلاف).

تحظى نماذج Boosted Trees بشعبية لدى العديد من ممارسي التعلم الآلي حيث يمكنهم تحقيق أداء مذهل مع الحد الأدنى من ضبط المعلمات الفائقة.

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

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

import numpy as np
import pandas as pd
from IPython.display import clear_output
from matplotlib import pyplot as plt

# Load dataset.
dftrain = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/train.csv')
dfeval = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/eval.csv')
y_train = dftrain.pop('survived')
y_eval = dfeval.pop('survived')
import tensorflow as tf
tf.random.set_seed(123)

تتكون مجموعة البيانات من مجموعة تدريب ومجموعة تقييم:

  • dftrain و y_train هي تدريب مجموعة -The البيانات الاستخدامات نموذج للتعلم.
  • يتم اختبار هذا النموذج على مجموعة حدة التقييم، dfeval ، و y_eval .

للتدريب ، ستستخدم الميزات التالية:

اسم الميزة وصف
الجنس جنس الراكب
سن عمر الراكب
n_ الأشقاء_الأزواج الأشقاء والشركاء على متنها
جافة من الآباء والأطفال على متن السفينة
أجرة أجرة المسافر المدفوعة.
صف دراسي فئة الركاب على متن السفينة
ظهر السفينة أي راكب على سطح السفينة كان على ظهر السفينة
embark_town من أي مسافر انطلق منه
وحده إذا كان الراكب وحده

استكشف البيانات

دعنا أولاً نعاين بعض البيانات وننشئ إحصائيات موجزة عن مجموعة التدريب.

dftrain.head()
dftrain.describe()

يوجد 627 و 264 مثالًا في مجموعات التدريب والتقييم ، على التوالي.

dftrain.shape[0], dfeval.shape[0]
(627, 264)

غالبية الركاب في العشرينات والثلاثينات من العمر.

dftrain.age.hist(bins=20)
plt.show()

بي إن جي

هناك ما يقرب من ضعف عدد الركاب الذكور مقارنة بالركاب الإناث على متن الطائرة.

dftrain.sex.value_counts().plot(kind='barh')
plt.show()

بي إن جي

وكان غالبية الركاب في الدرجة "الثالثة".

dftrain['class'].value_counts().plot(kind='barh')
plt.show()

بي إن جي

صعد معظم الركاب من ساوثهامبتون.

dftrain['embark_town'].value_counts().plot(kind='barh')
plt.show()

بي إن جي

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

pd.concat([dftrain, y_train], axis=1).groupby('sex').survived.mean().plot(kind='barh').set_xlabel('% survive')
plt.show()

بي إن جي

إنشاء أعمدة ميزة ووظائف الإدخال

يمكن لمقدر تعزيز التدرج استخدام كل من الميزات الرقمية والفئوية. تعمل أعمدة المعالم مع جميع مقدرات TensorFlow والغرض منها هو تحديد الميزات المستخدمة في النمذجة. بالإضافة إلى ذلك ، فإنها توفر بعض القدرات الهندسية المميزة مثل الترميز الساخن ، والتطبيع ، والجرافة. في هذا البرنامج التعليمي، الحقول في CATEGORICAL_COLUMNS يتم تحويلها من أعمدة القاطع الى واحد المشفرة الساخنة الأعمدة ( عمود مؤشر ):

CATEGORICAL_COLUMNS = ['sex', 'n_siblings_spouses', 'parch', 'class', 'deck',
                       'embark_town', 'alone']
NUMERIC_COLUMNS = ['age', 'fare']

def one_hot_cat_column(feature_name, vocab):
  return tf.feature_column.indicator_column(
      tf.feature_column.categorical_column_with_vocabulary_list(feature_name,
                                                 vocab))
feature_columns = []
for feature_name in CATEGORICAL_COLUMNS:
  # Need to one-hot encode categorical features.
  vocabulary = dftrain[feature_name].unique()
  feature_columns.append(one_hot_cat_column(feature_name, vocabulary))

for feature_name in NUMERIC_COLUMNS:
  feature_columns.append(tf.feature_column.numeric_column(feature_name,
                                           dtype=tf.float32))

يمكنك عرض التحويل الذي ينتجه عمود المعلم. على سبيل المثال، هنا هو الإخراج عند استخدام indicator_column على سبيل المثال واحد:

example = dict(dftrain.head(1))
class_fc = tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list('class', ('First', 'Second', 'Third')))
print('Feature value: "{}"'.format(example['class'].iloc[0]))
print('One-hot encoded: ', tf.keras.layers.DenseFeatures([class_fc])(example).numpy())
Feature value: "Third"
One-hot encoded:  [[0. 0. 1.]]

بالإضافة إلى ذلك ، يمكنك عرض جميع تحويلات أعمدة المعلم معًا:

tf.keras.layers.DenseFeatures(feature_columns)(example).numpy()
array([[22.  ,  1.  ,  0.  ,  1.  ,  0.  ,  0.  ,  1.  ,  0.  ,  0.  ,

         0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.  ,  0.  ,  0.  ,  0.  ,
         7.25,  1.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.  ,
         0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.  ,  0.  ]], dtype=float32)

بعد ذلك ، تحتاج إلى إنشاء وظائف الإدخال. ستحدد هذه كيفية قراءة البيانات في نموذجنا لكل من التدريب والاستدلال. سيتم استخدام from_tensor_slices الأسلوب في tf.data API لقراءة في البيانات مباشرة من الباندا. هذا مناسب لمجموعات البيانات الصغيرة الموجودة في الذاكرة. لمجموعات البيانات الكبيرة، وAPI tf.data يدعم مجموعة متنوعة من تنسيقات الملفات (بما في ذلك CSV ) بحيث يمكن معالجة قواعد البيانات التي لا تناسب في الذاكرة.

# Use entire batch since this is such a small dataset.
NUM_EXAMPLES = len(y_train)

def make_input_fn(X, y, n_epochs=None, shuffle=True):
  def input_fn():
    dataset = tf.data.Dataset.from_tensor_slices((dict(X), y))
    if shuffle:
      dataset = dataset.shuffle(NUM_EXAMPLES)
    # For training, cycle thru dataset as many times as need (n_epochs=None).
    dataset = dataset.repeat(n_epochs)
    # In memory training doesn't use batching.
    dataset = dataset.batch(NUM_EXAMPLES)
    return dataset
  return input_fn

# Training and evaluation input functions.
train_input_fn = make_input_fn(dftrain, y_train)
eval_input_fn = make_input_fn(dfeval, y_eval, shuffle=False, n_epochs=1)

تدريب وتقييم النموذج

أدناه ستقوم بالخطوات التالية:

  1. قم بتهيئة النموذج ، مع تحديد الميزات والمعلمات الفائقة.
  2. تغذية بيانات التدريب للنموذج باستخدام train_input_fn وتدريب نموذج باستخدام train وظيفة.
  3. سوف تقيم أداء نموذجي باستخدام مجموعة في تقييم هذا المثال، dfeval DataFrame. سوف تحقق من أن التنبؤات تطابق التسميات من y_eval مجموعة.

قبل تدريب نموذج Boosted Trees ، دعنا أولاً ندرب المصنف الخطي (نموذج الانحدار اللوجستي). من أفضل الممارسات أن تبدأ بنموذج أبسط لإنشاء معيار.

linear_est = tf.estimator.LinearClassifier(feature_columns)

# Train model.
linear_est.train(train_input_fn, max_steps=100)

# Evaluation.
result = linear_est.evaluate(eval_input_fn)
clear_output()
print(pd.Series(result))
accuracy                  0.765152
accuracy_baseline         0.625000
auc                       0.832844
auc_precision_recall      0.789631
average_loss              0.478908
label/mean                0.375000
loss                      0.478908
precision                 0.703297
prediction/mean           0.350790
recall                    0.646465
global_step             100.000000
dtype: float64

بعد ذلك ، دعنا ندرب نموذج الأشجار المعززة. لأشجار عزز، الانحدار ( BoostedTreesRegressor ) وتصنيف ( BoostedTreesClassifier معتمدة). لأن الهدف هو التنبؤ فئة - البقاء على قيد الحياة أم لا البقاء على قيد الحياة، سوف تستخدم BoostedTreesClassifier .

# Since data fits into memory, use entire dataset per layer. It will be faster.
# Above one batch is defined as the entire dataset.
n_batches = 1
est = tf.estimator.BoostedTreesClassifier(feature_columns,
                                          n_batches_per_layer=n_batches)

# The model will stop training once the specified number of trees is built, not
# based on the number of steps.
est.train(train_input_fn, max_steps=100)

# Eval.
result = est.evaluate(eval_input_fn)
clear_output()
print(pd.Series(result))
accuracy                  0.837121
accuracy_baseline         0.625000
auc                       0.871993
auc_precision_recall      0.858760
average_loss              0.406563
label/mean                0.375000
loss                      0.406563
precision                 0.797872
prediction/mean           0.384452
recall                    0.757576
global_step             100.000000
dtype: float64

يمكنك الآن استخدام نموذج القطار لعمل تنبؤات بشأن أحد الركاب من مجموعة التقييم. تم تحسين نماذج TensorFlow لعمل تنبؤات حول مجموعة أو مجموعة من الأمثلة في وقت واحد. في وقت سابق، و eval_input_fn يعرف باستخدام مجموعة تقييم كامل.

pred_dicts = list(est.predict(eval_input_fn))
probs = pd.Series([pred['probabilities'][1] for pred in pred_dicts])

probs.plot(kind='hist', bins=20, title='predicted probabilities')
plt.show()
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmp98s7_n3y/model.ckpt-100
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Exception ignored in: <function CapturableResource.__del__ at 0x7ff2fb5bd950>
Traceback (most recent call last):
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py", line 269, in __del__
    with self._destruction_context():
AttributeError: 'TreeEnsemble' object has no attribute '_destruction_context'

بي إن جي

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

from sklearn.metrics import roc_curve

fpr, tpr, _ = roc_curve(y_eval, probs)
plt.plot(fpr, tpr)
plt.title('ROC curve')
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.xlim(0,)
plt.ylim(0,)
plt.show()

بي إن جي