با Estimators یک مدل خطی بسازید

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

بررسی اجمالی

این tf.estimator به tf.estimator با استفاده از tf.estimator API یک مدل رگرسیون لجستیک را tf.estimator می دهد. این مدل اغلب به عنوان پایه ای برای الگوریتم های پیچیده تر ، مورد استفاده قرار می گیرد.

برپایی

pip install sklearn
import os
import sys

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

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

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

import tensorflow.compat.v2.feature_column as fc

import tensorflow as tf
# 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')

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

مجموعه داده شامل ویژگی های زیر است

dftrain.head()
dftrain.describe()

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

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

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

dftrain.age.hist(bins=20)
<AxesSubplot:>

png

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

dftrain.sex.value_counts().plot(kind='barh')
<AxesSubplot:>

png

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

dftrain['class'].value_counts().plot(kind='barh')
<AxesSubplot:>

png

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

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

png

مهندسی ویژگی برای مدل

برآوردگران از سیستمی به نام ستون ویژگی ها برای توصیف نحوه تفسیر مدل از هر یک از ویژگی های ورودی خام استفاده می کنند. برآوردگر انتظار دارد كه برداري از ورودي عددي داشته باشد و ستون هاي ويژگي نحوه تبديل مدل به هر مدل را توصيف مي كنند.

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

برآوردگر خطی از هر دو ویژگی عددی و طبقه ای استفاده می کند. ستون های ویژگی با تمام برآوردگرهای TensorFlow کار می کنند و هدف آنها تعریف ویژگی های مورد استفاده برای مدل سازی است. علاوه بر این ، آنها برخی از ویژگی های مهندسی ویژگی مانند رمزگذاری یکپارچه ، عادی سازی و شفاف سازی را فراهم می کنند.

ستون های ویژگی پایه

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

feature_columns = []
for feature_name in CATEGORICAL_COLUMNS:
  vocabulary = dftrain[feature_name].unique()
  feature_columns.append(tf.feature_column.categorical_column_with_vocabulary_list(feature_name, vocabulary))

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

input_function نحوه تبدیل داده ها بهtf.data.Dataset می کند که خط لوله ورودی را به صورتtf.data.Dataset تغذیه می کند.tf.data.Dataset می تواند چندین منبع مانند یک داده داده ، یک پرونده با قالب csv و موارد دیگر را در اختیار شما قرار دهد.

def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
  def input_function():
    ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
    if shuffle:
      ds = ds.shuffle(1000)
    ds = ds.batch(batch_size).repeat(num_epochs)
    return ds
  return input_function

train_input_fn = make_input_fn(dftrain, y_train)
eval_input_fn = make_input_fn(dfeval, y_eval, num_epochs=1, shuffle=False)

می توانید مجموعه داده ها را بررسی کنید:

ds = make_input_fn(dftrain, y_train, batch_size=10)()
for feature_batch, label_batch in ds.take(1):
  print('Some feature keys:', list(feature_batch.keys()))
  print()
  print('A batch of class:', feature_batch['class'].numpy())
  print()
  print('A batch of Labels:', label_batch.numpy())
Some feature keys: ['sex', 'age', 'n_siblings_spouses', 'parch', 'fare', 'class', 'deck', 'embark_town', 'alone']

A batch of class: [b'Third' b'Third' b'Second' b'Third' b'First' b'First' b'Third' b'Third'
 b'Third' b'Third']

A batch of Labels: [0 1 0 1 1 0 0 0 1 1]

همچنین می توانید با استفاده از لایه tf.keras.layers.DenseFeatures نتیجه ستون ویژگی خاص را tf.keras.layers.DenseFeatures :

age_column = feature_columns[7]
tf.keras.layers.DenseFeatures([age_column])(feature_batch).numpy()
array([[ 9.  ],
       [24.  ],
       [23.  ],
       [28.  ],
       [24.  ],
       [40.  ],
       [31.  ],
       [36.  ],
       [28.  ],
       [ 0.75]], dtype=float32)

DenseFeatures فقط DenseFeatures متراکم را می پذیرد ، برای بازرسی از یک ستون طبقه بندی ، ابتدا باید آن را به یک ستون نشانگر تبدیل کنید:

gender_column = feature_columns[0]
tf.keras.layers.DenseFeatures([tf.feature_column.indicator_column(gender_column)])(feature_batch).numpy()
array([[0., 1.],
       [0., 1.],
       [1., 0.],
       [0., 1.],
       [0., 1.],
       [1., 0.],
       [0., 1.],
       [1., 0.],
       [1., 0.],
       [0., 1.]], dtype=float32)

پس از افزودن تمام ویژگی های پایه به مدل ، بیایید مدل را آموزش دهیم. آموزش یک مدل فقط با استفاده از API tf.estimator تنها یک دستور است:

linear_est = tf.estimator.LinearClassifier(feature_columns=feature_columns)
linear_est.train(train_input_fn)
result = linear_est.evaluate(eval_input_fn)

clear_output()
print(result)
{'accuracy': 0.74242425, 'accuracy_baseline': 0.625, 'auc': 0.83409864, 'auc_precision_recall': 0.79196465, 'average_loss': 0.48227197, 'label/mean': 0.375, 'loss': 0.47621801, 'precision': 0.64761907, 'prediction/mean': 0.4210519, 'recall': 0.68686867, 'global_step': 200}

ستون های ویژگی مشتق شده

اکنون به صحت 75٪ رسیده اید. استفاده از هر ستون ویژگی پایه به طور جداگانه ممکن است برای توضیح داده ها کافی نباشد. به عنوان مثال ، ارتباط بین سن و برچسب ممکن است برای جنسیت متفاوت باشد. بنابراین ، اگر فقط یک مدل واحد را برای gender="Male" و gender="Female" بگیرید ، هر ترکیبی از سن و جنسیت را ثبت نمی کنید (به عنوان مثال تمایز بین gender="Male" و age="30" و gender="Male" و age="40" ).

برای یادگیری تفاوت بین ترکیبات مختلف ویژگی ها ، می توانید ستون های ویژگی متقاطع را به مدل اضافه کنید (همچنین می توانید ستون سن را قبل از ستون ضربدری کنید):

age_x_gender = tf.feature_column.crossed_column(['age', 'sex'], hash_bucket_size=100)

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

derived_feature_columns = [age_x_gender]
linear_est = tf.estimator.LinearClassifier(feature_columns=feature_columns+derived_feature_columns)
linear_est.train(train_input_fn)
result = linear_est.evaluate(eval_input_fn)

clear_output()
print(result)
{'accuracy': 0.7689394, 'accuracy_baseline': 0.625, 'auc': 0.8474442, 'auc_precision_recall': 0.7786934, 'average_loss': 0.4796637, 'label/mean': 0.375, 'loss': 0.47112098, 'precision': 0.73170733, 'prediction/mean': 0.3178967, 'recall': 0.6060606, 'global_step': 200}

اکنون به دقت 77.6٪ دست یافته است که کمی بهتر از ویژگی های پایه است. می توانید با استفاده از ویژگی ها و تحولات بیشتر ، ببینید آیا می توانید بهتر عمل کنید!

اکنون می توانید از مدل قطار برای پیش بینی یک مسافر از مجموعه ارزیابی استفاده کنید. مدل های TensorFlow برای پیش بینی یک باره یا دسته ای از نمونه ها به یکباره بهینه شده اند. پیش از این ، eval_input_fn با استفاده از کل مجموعه ارزیابی تعریف شده بود.

pred_dicts = list(linear_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')
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpoq0ukjec/model.ckpt-200
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
<AxesSubplot:title={'center':'predicted probabilities'}, ylabel='Frequency'>

png

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

from sklearn.metrics import roc_curve
from matplotlib import pyplot as plt

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,)
(0.0, 1.05)

png