Tensorflow附带了这个名为Estimators的高级API,它受到scikit-learn和简化机器学习编程的启发。它不只是为图和会话添加抽象,而且还包含训练,评估,预测和导出等操作,以便使用Google CloudML处理扩展,并在开箱即用的不同硬件上运行。此外,Tensorflow官方文档强烈建议在生产级开发中使用Estimator API。

使用Estimators的另一个好处是它已经有预制的估算器,可以处理各种不同的机器学习(ML)问题。但是,并非所有机器学习(ML)问题都可以通过预构建的Estimator来解决,因此Tensorflow有一个简单的API来实现自定义Estimator。甚至可以很容易地创建keras模型,并使用estimator功能将它们包装起来,从而获得评估器的所有功能。

使用预先制作的估算器构建模型

在这篇文章中,仅为了展示如何使用Estimators构建模型,我们将使用来自NYC OpenData门户的2016 Green Taxi旅行数据(https://data.cityofnewyork.us/Transportation/2016-Green-Taxi-Trip-Data/hvrh-b6nb)。在这篇文章中,我们不会担心模型的准确性或真正的问题,这只是为了展示如何使用estimator API以及如何运行这样的管道。

import pandas as pd

from sodapy import Socrata

client = Socrata("data.cityofnewyork.us", None)

results = client.get("pqfs-mqru", limit=10000)

results_df = pd.DataFrame.from_records(results)

在这里,我们从NYC OpenData门户网站读取数据到Pandas数据帧。由于数据集非常大,我们只会将行数限制为10,000(它有130万行,但就本文而言,我们不需要整个数据集)。请记住,在执行上述代码之前,您可能需要pip install sodapy。

让我们准备我们的数据。

我们将根据乘客的经度和纬度来预测乘坐出租车的票价。很简单!

首先我们需要识别出我们的特征列和标签,然后把数据集随机分配给两部分,一是用来训练的,另一种是用来验证的。Python代码如下:

import numpy as np

CSV_COLUMNS = ['dropoff_latitude', 'dropoff_longitude','pickup_latitude','pickup_longitude','passenger_count', 'fare_amount']

FEATURES = CSV_COLUMNS[0:len(CSV_COLUMNS) - 1]

LABEL = CSV_COLUMNS[-1]

# Split into train and eval as 80% and 20% respectively.

np.random.seed(seed=1) # makes split reproducible

msk = np.random.rand(len(results_df)) < 0.8

df_train = results_df[msk]

df_valid = results_df[~msk]

然后我们需要输入函数来读取pandas数据帧,Python实现如下:

def make_input_fn(df, num_epochs):

return tf.estimator.inputs.pandas_input_fn(

x = df[FEATURES].astype(float),

y = df[LABEL].astype(float),

batch_size = 128,

num_epochs = num_epochs,

shuffle = True,

queue_capacity = 1000,

num_threads = 1

)

我们的预测输入函数是相同的,除了我们不提供标签,epochs是1。

def make_prediction_input_fn(df):

return tf.estimator.inputs.pandas_input_fn(

x = df[FEATURES].astype(float),

y = None,

batch_size = 128,

num_epochs = 1,

shuffle = True,

queue_capacity = 1000,

num_threads = 1

)

现在我们已经为训练和验证数据准备了数据并创建了输入函数。对于无法容纳在系统内存中的大型数据集,您可以使用数据集API。

接下来我们创建要素列。在这个特殊的问题中,我们有经度,纬度和乘客数量都是数字的。

def make_feature_cols():

input_columns = [tf.feature_column.numeric_column(k) for k in FEATURES]

return input_columns

让我们使用一个非常简单的DNNRegressor,这是一个预制的Estimator,它具有我们在上述函数中创建的输入和特征列,Python示例代码如下:

import shutil

import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)

OUTDIR = 'taxi_trained'

shutil.rmtree(OUTDIR, ignore_errors = True) # start fresh each time

model = tf.estimator.DNNRegressor(hidden_units = [32, 8, 2],

feature_columns = make_feature_cols(), model_dir = OUTDIR)

model.train(input_fn = make_input_fn(df_train, num_epochs = 100))

训练模型后,让我们评估验证数据

def print_rmse(model, name, df):

metrics = model.evaluate(input_fn = make_input_fn(df, 1))

print('RMSE on {} dataset = {}'.format(name, np.sqrt(metrics['average_loss'])))

print_rmse(model, 'validation', df_valid)

如你所见,结果不是很好。它需要更多的微调,可能需要一些特征工程。但是,这只是为了说明如何为估算器编写tensorflow代码。希望这将有助于从Tensorflow Estimators开始。

查看原文 >>
相关文章