Feature column
本文档详细介绍了特征列(feature columns)。您可以将特征列视为原始数据和 Estimator 之间的媒介。特征列非常丰富,使您可以将各种原始数据转换为 Estimators 可用的格式,从而可以轻松进行实验。
在内置 Estimators 部分的教程中,我们训练了一个 tf.estimator.DNNClassifier
去完成 Iris 花的分类任务。在该例子中,我们只使用了numerical feature columns(tf.feature_column.numeric_column
)类型。尽管numeric column可以有效地表示花瓣、花蕊的长度和宽度,但在实际的数据集中包含了各种特征,其中很多不是数值。
1. 深度神经网络的输入
深度神经网络只能处理数值类型的数据,但我们收集的特征并不全是数值类型的。以一个可包含下列三个非数值的 product_class 特征为例:
- kitchenware
- electronics
- sports
机器学习模型一般将分类值表示为简单的矢量,其中 1 表示存在某个值,0 表示不存在某个值。例如,如果将product_class
设置为sports
时,机器学习模型通常将product_class
表示为[0, 0, 1]
,即:
- 0:kitchenware is absent。
- 0:electronics is absent。
- 1:sports is present。
因此,虽然原始数据可以是数值或分类值,但机器学习模型会将所有特征表示为数值。
2. Feature Columns
如下图所示,你可以通过 Estimator 的 feature_columns
参数来指定模型的输入。特征列在输入数据(由input_fn
返回)与模型之间架起了桥梁。
要创建特征列,请调用 tf.feature_column
模块的函数。本文档介绍了该模块中的 9 个函数。如下图所示,除了 bucketized_column
外的函数要么返回一个 Categorical Column 对象,要么返回一个 Dense Column 对象。
下面我们详细介绍下这些函数。
2.1 Numeric column(数值列)
Iris 分类器对所有输入特征调用 tf.feature_column.numeric_column
函数:
- SepalLength
- SepalWidth
- PetalLength
- PetalWidth
tf.feature_column
有许多可选参数。如果不指定可选参数,将默认指定该特征列的数值类型为 tf.float32
。
# Defaults to a tf.float32 scalar.
numeric_feature_column = tf.feature_column.numeric_column(key="SepalLength")
可以使用dtype
参数来指定数值类型。
# Represent a tf.float64 scalar.
numeric_feature_column = tf.feature_column.numeric_column(key="SepalLength",
dtype=tf.float64)
默认情况下,numeric column 只表示单个值(标量)。可以使用 shape
参数来指定形状。
# Represent a 10-element vector in which each cell contains a tf.float32.
vector_feature_column = tf.feature_column.numeric_column(key="Bowling",
shape=10)
# Represent a 10x5 matrix in which each cell contains a tf.float32.
matrix_feature_column = tf.feature_column.numeric_column(key="MyMatrix",
shape=[10,5])
2.2 Bucketized column(分桶列)
通常,我们不直接将一个数值直接传给模型,而是根据数值范围将其值分为不同的 categories。上述功能可以通过 tf.feature_column.bucketized_column
实现。以表示房屋建造年份的原始数据为例。我们并非以标量数值列表示年份,而是将年份分成下列四个分桶:
模型将按以下方式表示这些 bucket:
日期范围 | 表示为… |
---|---|
< 1960 年 | [1, 0, 0, 0] |
>= 1960 年但 < 1980 年 | [0, 1, 0, 0] |
>= 1980 年但 < 2000 年 | [0, 0, 1, 0] |
>= 2000 年 | [0, 0, 0, 1] |
为什么要将数字(一个完全有效的模型输入&