1 学习目标:
- 学习基本的 TensorFlow 概念
- 在 TensorFlow 中使用
LinearRegressor
类并基于单个输入特征预测各城市街区的房屋价值中位数 - 使用均方根误差 (RMSE) 评估模型预测的准确率
- 通过调整模型的超参数提高模型准确率
备注:数据基于加利福尼亚州 1990 年的人口普查数据。
2 设置
首先需要加载必要的库。
from __future__ import print_function import math from IPython import display from matplotlib import cm from matplotlib import gridspec from matplotlib import pyplot as plt import numpy as np import pandas as pd from sklearn import metrics import tensorflow as tf from tensorflow.python.data import Dataset tf.logging.set_verbosity(tf.logging.ERROR) pd.options.display.max_rows = 10 pd.options.display.float_format = '{:.1f}'.format
接下来加载数据集
california_housing_dataframe = pd.read_csv("https://download.mlcc.google.cn/mledu-datasets/california_housing_train.csv", sep=",")
对数据进行随机化处理,以确保不会出现任何病态排序结果(可能会损害随机梯度下降法的效果)。此外,我们会将median_house_value调整为以千为单位,这样,模型就能够以常用范围内的学习速率较为轻松地学习这些数据。
california_housing_dataframe = california_housing_dataframe.reindex( np.random.permutation(california_housing_dataframe.index)) california_housing_dataframe["median_house_value"] /= 1000.0 california_housing_dataframe
运行
3 检查数据
以下输出各系列的一些实用统计信息快速摘要:样本数、均值、标准偏差、最大值、最小值和各种分位数。
california_housing_dataframe.describe()
运行
4 构建第一个模型
在本练习中,我们将尝试预测 median_house_value
,它将是我们的标签(有时也称为目标)。我们将使用 total_rooms
作为输入特征。
注意:我们使用的是城市街区级别的数据,因此该特征表示相应街区的房间总数。
为了训练模型,我们将使用 TensorFlow Estimator API 提供的 LinearRegressor 接口。此 API 负责处理大量低级别模型搭建工作,并会提供执行模型训练、评估和推理的便利方法。
4.1 第 1 步:定义特征并配置特征列
为了将我们的训练数据导入 TensorFlow,我们需要指定每个特征包含的数据类型。在本练习及今后的练习中,我们主要会使用以下两类数据:
分类数据:一种文字数据。在本练习中,我们的住房数据集不包含任何分类特征,但您可能会看到的示例包括家居风格以及房地产广告词。
数值数据:一种数字(整数或浮点数)数据以及您希望视为数字的数据。有时您可能会希望将数值数据(例如邮政编码)视为分类数据(我们将在稍后的部分对此进行详细说明)。
在 TensorFlow 中,我们使用一种称为“特征列”的结构来表示特征的数据类型。特征列仅存储对特征数据的描述;不包含特征数据本身。
一开始,我们只使用一个数值输入特征 total_rooms
。以下代码会从 california_housing_dataframe
中提取 total_rooms
数据,并使用 numeric_column
定义特征列,这样会将其数据指定为数值:
# Define the input feature: total_rooms. my_feature = california_housing_dataframe[["total_rooms"]] # Configure a numeric feature column for total_rooms. feature_columns = [tf.feature_column.numeric_column("total_rooms")]
注意:total_rooms
数据的形状是一维数组(每个街区的房间总数列表)。这是 numeric_column
的默认形状,因此我们不必将其作为参数传递。