اتصال به زنان برای اولین بار در ML سمپوزیوم این سه، 19 اکتبر در 09:00 PST الان ثبت نام کنید

تقویت درختان با استفاده از برآوردگرها

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

این آموزش، خرید پایان به پایان آموزش یک مدل افزایش گرادیان با استفاده از درخت های تصمیم گیری با است tf.estimator API. مدلهای درختان تقویت شده از جمله محبوب ترین و م effectiveثرترین روشهای یادگیری ماشین برای رگرسیون و طبقه بندی هستند. این یک تکنیک ترکیبی است که پیش بینی های چندین مدل درخت (فکر می کنم 10 ، 100 یا حتی 1000) را ترکیب می کند.

مدلهای درختان تقویت شده در بین بسیاری از تمرین کنندگان یادگیری ماشین محبوب هستند زیرا می توانند با حداقل تنظیم هایپر پارامتر به عملکرد چشمگیری دست یابند.

مجموعه داده titanic را بارگذاری کنید

شما از مجموعه داده تیتانیک استفاده خواهید کرد ، جایی که هدف (و نه بیمار) پیش بینی بقای مسافران است ، با توجه به ویژگی هایی مانند جنسیت ، سن ، کلاس و غیره.

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 هستند مجموعه آموزش بانک داده ها با استفاده مدل برای یادگیری است.
  • این مدل در برابر مجموعه ای از تابع eval، مورد آزمایش قرار dfeval و y_eval .

برای آموزش از ویژگی های زیر استفاده می کنید:

نام ویژگی شرح
رابطه ی جنسی جنسیت مسافر
سن سن مسافر
n_ خواهران و برادران خواهر و برادر و شرکای داخل هواپیما
پارچ والدین و فرزندان سرنشین
کرایه مسافر کرایه پرداخت می شود.
کلاس کلاس مسافر در کشتی
عرشه مسافر کدام عرشه بود
embark_town مسافر کدام شهر سوار شد
تنها اگر مسافر تنها بود

داده ها را کاوش کنید

بیایید ابتدا برخی از داده ها را پیش نمایش کرده و آمار خلاصه ای از مجموعه آموزش ایجاد کنیم.

dftrain.head()
dftrain.describe()

در مجموعه آموزش و ارزیابی به ترتیب 627 و 264 نمونه وجود دارد.

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

اکثر مسافران در سنین 20 و 30 سالگی هستند.

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

png

مسافران مرد تقریباً دو برابر مسافران زن در کشتی هستند.

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

png

اکثر مسافران در کلاس "سوم" بودند.

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

png

بیشتر مسافران از ساوتهمپتون سوار شدند.

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

png

زنان در مقایسه با مردان شانس بسیار بیشتری برای زنده ماندن دارند. این به وضوح یک ویژگی پیش بینی کننده برای مدل خواهد بود.

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

png

ستون های ویژگی و توابع ورودی ایجاد کنید

برآوردگر افزایش گرادیان می تواند از ویژگی های عددی و دسته ای استفاده کند. ستون های ویژگی با همه برآوردگران 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 آرایه.

قبل از آموزش مدل درختان تقویت شده ، ابتدا یک طبقه بندی کننده خطی (مدل رگرسیون لجستیک) را آموزش دهیم. بهتر است برای ایجاد معیار ، با یک مدل ساده تر شروع کنید.

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'

png

در نهایت شما همچنین می توانید ویژگی عملکرد گیرنده (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()

png