admin管理员组

文章数量:1650783


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]

为什么要将数字(一个完全有效的模型输入&

本文标签: 文档官方estimatortensorflowfeature