TensorFlow Estimator API 入门教程:出租车费预测模型实践
概述
TensorFlow Estimator API 是 TensorFlow 高级 API 之一,它提供了一套简单易用的接口来构建、训练和评估机器学习模型。本教程将通过一个出租车费预测的实例,带你全面了解如何使用 Estimator API 构建机器学习模型。
TensorFlow 层次结构
TensorFlow 采用分层架构设计,从高到低分为多个层次:
- Estimators (预制/自定义) - 最高抽象级别
- Keras - 中级API
- 低阶API (tf.layers, tf.losses等) - 更灵活但代码量更大
- Python/TensorFlow运算 - 最底层,完全控制
Estimator API 位于最高层,适合快速构建和部署模型,同时保持足够的灵活性。
准备工作
首先导入必要的库并检查 TensorFlow 版本:
import tensorflow as tf
import pandas as pd
import shutil
print(tf.__version__)
数据加载与处理
我们从存储中获取预处理好的出租车费数据集,这些数据包含以下特征:
- 上车地点坐标
- 下车地点坐标
- 乘客人数
- 上车时间
- 车费金额(标签)
df_train = pd.read_csv("./taxi-train.csv")
df_valid = pd.read_csv("./taxi-valid.csv")
df_test = pd.read_csv("./taxi-test.csv")
CSV_COLUMN_NAMES = list(df_train)
FEATURE_NAMES = CSV_COLUMN_NAMES[1:] # 所有特征列
LABEL_NAME = CSV_COLUMN_NAMES[0] # 标签列
特征列定义
特征列(Feature Columns)是TensorFlow中定义模型输入的标准方式,它告诉模型如何解释输入数据。对于数值型特征,我们使用numeric_column:
feature_columns = [tf.feature_column.numeric_column(key=feature)
for feature in FEATURE_NAMES]
输入函数设计
输入函数负责将数据转换为Estimator所需的格式。我们使用tf.data.DatasetAPI构建高效的数据管道:
def train_input_fn(df, batch_size=128):
# 1. 转换为(features, label)格式
features = {key: df[key].values for key in FEATURE_NAMES}
dataset = tf.data.Dataset.from_tensor_slices((features, df[LABEL_NAME].values))
# 2. 数据增强处理
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
return dataset
def eval_input_fn(df, batch_size=128):
features = {key: df[key].values for key in FEATURE_NAMES}
dataset = tf.data.Dataset.from_tensor_slices((features, df[LABEL_NAME].values))
return dataset.batch(batch_size)
def predict_input_fn(df, batch_size=128):
features = {key: df[key].values for key in FEATURE_NAMES}
dataset = tf.data.Dataset.from_tensor_slices(features)
return dataset.batch(batch_size)
模型构建与训练
TensorFlow提供了多种预制Estimator,我们首先尝试线性回归模型:
OUTDIR = "taxi_trained"
model = tf.estimator.LinearRegressor(
feature_columns=feature_columns,
model_dir=OUTDIR,
config=tf.estimator.RunConfig(tf_random_seed=1)
)
# 训练模型
tf.logging.set_verbosity(tf.logging.INFO)
shutil.rmtree(path=OUTDIR, ignore_errors=True)
model.train(input_fn=lambda: train_input_fn(df=df_train), steps=500)
模型评估
定义评估函数计算RMSE:
def print_rmse(model, df):
metrics = model.evaluate(input_fn=lambda: eval_input_fn(df))
print("RMSE = {:.2f}".format(metrics["average_loss"]**0.5))
print_rmse(model, df_valid)
尝试DNN模型
我们可以轻松更换为深度神经网络模型:
model = tf.estimator.DNNRegressor(
hidden_units=[10, 10], # 两层网络,每层10个神经元
feature_columns=feature_columns,
model_dir=OUTDIR,
config=tf.estimator.RunConfig(tf_random_seed=1)
)
model.train(input_fn=lambda: train_input_fn(df=df_train), steps=500)
print_rmse(model, df_valid)
性能对比
| 模型类型 | 验证集RMSE |
|---|---|
| 基准模型 | 7.76 |
| 线性回归 | ~9.43 |
| DNN模型 | ~9.26 |
挑战练习
尝试构建一个神经网络,根据圆柱体的半径(r)和高度(h)预测其体积(V=πr²h)。数据范围:r和h都在0.5到2.0之间。
提示:
- 生成随机r和h值
- 计算对应的V值
- 构建包含r、h和V的数据集
- 使用DNNRegressor进行训练
总结
通过本教程,我们学习了:
- TensorFlow Estimator API的基本工作流程
- 如何定义特征列和输入函数
- 如何使用不同的预制Estimator
- 模型训练、评估和预测的完整流程
虽然当前模型性能不如基准,但这为后续的特征工程和模型优化奠定了基础。Estimator API的模块化设计使得我们可以轻松尝试不同的模型架构和特征组合。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



