Estimators:使用Tensorflow的简便方法
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开始。