DNNLinear组合分类器的使用 & Feature column

文章目录

  • DNNLinearCombinedClassifier
    • __init__
  • train
  • evaluate
  • predict
  • Feature column
    • 1.numeric_columns(数值列)
    • 2.bucketized_column(分桶列)
    • 3.categorical_column_with_identity(类别标识列)
    • 4.Categorical vocabulary column(类别词汇表)
      • 4.1tf.feature_column.categorical_column_with_vocabulary_list
      • 4.2tf.feature_column.categorical_column_with_vocabulary_file
    • 5.Hashed Column(哈希列)
    • 6.crossed_columns(组合列)
    • 将特征列传递给 Estimator(非常重要)

tf.estimator.DNNLinearCombinedClassifier,其中DNNLinearCombinedClassifier 类继承自Estimator。

DNNLinearCombinedClassifier

init

DNNLinearCombinedClassifier的初始化

_init__(
    model_dir=None,
    linear_feature_columns=None,
    linear_optimizer='Ftrl',
    dnn_feature_columns=None,
    dnn_optimizer='Adagrad',
    dnn_hidden_units=None,
    dnn_activation_fn=tf.nn.relu,
    dnn_dropout=None,
    n_classes=2,
    weight_column=None,
    label_vocabulary=None,
    input_layer_partitioner=None,
    config=None
)

参数解释:

  • model_dir:保存模型参数的地址。
  • linear_feature_columns:包含模型线性部分使用的所有的特征列。
  • linear_optimizer:tf.Optimizer ,线性优化器,默认为 FTRL 优化器。
  • dnn_feature_columns:包含模型深层部分所使用的所有的特征列。
  • dnn_optimizer:tf.Optimizer,默认为 Adagrad 优化器。
  • dnn_hidden_units:隐藏层的参数设置,所有层都完全连接。
  • dnn_activation_fn:激活函数应用于每个层。如果无,将使用 tf.nn.relu。
  • dnn_dropout:dropou参数。
  • n_classes:标签类的数量,默认为 2。。
  • weight_column:通过 tf.feature_column.numeric_column 创建的一个字符串或者 _NumericColumn 用来定义表示权重的特征列。
    label_vocabulary:字符串列表,表示标签。
    input_layer_partitioner:输入层分区
    注:如果 linear_feature_columns 和 dnn_features_columns 都同时为空会报ValueError错误。

train

训练一个给定训练数据 input_fn 的模型。

train(
    input_fn,
    hooks=None,
    steps=None,
    max_steps=None
)

evaluate

模型评估函数。

evaluate(
    input_fn,
    steps=None,
    hooks=None,
    checkpoint_path=None,
    name=None
)

参数:

  • input_fn:它返回一组用于验证的数据的函数,是一个元组:features - Dictionary 的字符串特征名到 Tensor 或 SparseTensor.labels - Tensor或带标签的张量字典(dict).
  • steps:评估模型的步骤数,评估结束条件。如果为 None,直到 input_fn 引发 end-of-input 异常时,评估结束。
  • name:如果用户需要在不同数据集上运行多个评估,则设置评估的名称。不同评估的度量值保存在单独的文件夹中。

predict

预测函数。

predict(
    input_fn,
    predict_keys=None,
    hooks=None,
    checkpoint_path=None
)

得到:
计算预测张量的值.

注意:
ValueError:在 model_dir 中找不到训练有素的模型.
ValueError:如果批量长度的预测不一致.
ValueError:如果 predict_keys 和 predictions 之间存在冲突.例如,如果 predict_keys 不是 None,但 EstimatorSpec.predictions 不是 dict.

Feature column

特征列(feature columns),原始数据和 Estimator 之间的媒介,在输入数据(由input_fn返回)与模型之间架起了桥梁。
DNNLinear组合分类器的使用 & Feature column_第1张图片
要创建特征列,需要调用 tf.feature_column 模块的函数。这里介绍了该模块中的 9 个函数。如下图所示,除了 bucketized_column 外的函数要么返回一个 Categorical Column 对象,要么返回一个 Dense Column 对象。
DNNLinear组合分类器的使用 & Feature column_第2张图片
下面详细介绍这些函数。

1.numeric_columns(数值列)

tf.feature_column.numeric_column 有许多可选参数,如果不指定可选参数,将默认指定该特征列的数值类型为 tf.float32。

age = tf.feature_column.numeric_column("age")

可以使用dtype参数来指定数值类型。

age = tf.feature_column.numeric_column(key="age",dtype=tf.float64)                                              

2.bucketized_column(分桶列)

有时候,我们并不直接将一个数值直接传给模型,而是根据数值范围将其值分为不同的 categories。上述功能可以通过 tf.feature_column.bucketized_column 来实现。以人的年龄为例,我们并非以标量数值列表示年龄,而是将年龄分成不同的四个分桶:幼年、青年、中年、老年,每个桶代表一个年龄段,也就是一类人映射到一个桶里
模型将按以下方式表示这些 bucket:

年龄范围 表示
<16 [1, 0, 0, 0]
>=16岁 但<35岁 [0, 1, 0, 0]
>=35岁 但<60岁 [0, 0, 1, 0]
>=60岁 [0, 0, 0, 1]

为什么要将数字(一个完全有效的模型输入)拆分为分类值?
首先,该分类将单个输入数字分成了一个四元素矢量,因此模型现在可以学习四个单独的权重而不是一个。四个权重能够创建一个更强大的模型。
:一段时间映射到一个桶

# 首先,将原始输入转换为一个numeric column
age = tf.feature_column.numeric_column("age")
# 然后,按照边界将numeric column进行bucket,这里分成了11个桶。
age_buckets = tf.feature_column.bucketized_column(
    age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

请注意,指定一个n元素边界矢量可创建一个n+1元素 bucket 矢量。

3.categorical_column_with_identity(类别标识列)

4.Categorical vocabulary column(类别词汇表)

因为不能直接向模型中输入字符串,我们必须首先将字符串映射为数值或类别值。Categorical vocabulary column 可以将字符串表示为one_hot格式的向量。

字符串 表示
Female [1, 0]
Male [0, 1]

TensorFlow提供了两种不同的函数去创建categorical vocabulary columns:

4.1tf.feature_column.categorical_column_with_vocabulary_list

gender = tf.feature_column.categorical_column_with_vocabulary_list(
    key="gender", vocabulary_list=["Female", "Male"])

上面的函数非常简单,但它有一个明显的缺点。那就是,当词汇表很长时,比如中国有哪些省、市等,需要输入的内容太多了。在这种情况下,可以调用 tf.feature_column.categorical_column_with_vocabulary_file,以便将词汇表放在单独的文件中。

4.2tf.feature_column.categorical_column_with_vocabulary_file

vocabulary_feature_column =
    tf.feature_column.categorical_column_with_vocabulary_file(
        key='city',
        vocabulary_file="china_city.txt",
        vocabulary_size=3)

china_city.txt 应该让每个词汇各占一行。在我们的示例中:

beijing
shanghai
guanghzou
shenzhen
hanghzou

5.Hashed Column(哈希列)

到目前为止,我们处理的示例都包含很少的类别。但当类别的数量特别大时,我们不可能为每个词汇或整数设置单独的类别,因为这将会消耗非常大的内存。对于此类情况,我们可以反问自己:“我愿意为我的输入设置多少类别?”实际上,tf.feature_column.categorical_column_with_hash_bucket 函数使您能够指定类别的数量。对于这种 feature column,模型会计算输入值的 hash 值,然后使用模运算符将其置于其中一个 hash_bucket_size 类别中。

city= tf.feature_column.categorical_column_with_hash_bucket(
    "city", hash_bucket_size=1000)

需要注意的是,我们是将不同的输入值强制划分成更少数量的类别。这意味着,两个可能不相关的输入会被映射到同一个类别,这样一来,神经网络也会面临同样的结果。与机器学习中的很多反直觉现象一样,事实证明哈希技术经常非常有用。这是因为哈希类别为模型提供了一些分隔方式。模型可以使用其他特征进一步将厨具与运动用品分隔开来。

6.crossed_columns(组合列)

通过将多个特征组合为一个特征(称为特征组合),模型可学习每个特征组合的单独权重。
例如:假设我们希望模型计算佐治亚州亚特兰大的房地产价格,这个城市的房地产价格在不同位置差异很大。在确定对房地产位置的依赖性方面,将纬度和经度表示为单独的特征用处不大;但是,将纬度和经度组合为一个特征则可精确定位位置。
在实践中特征组合能够有效地提升模型的效果。

将特征列传递给 Estimator(非常重要)

如下所示,并非所有 Estimator 都支持所有类型的 feature_columns 参数:

  • LinearClassifier 和 LinearRegressor:接受所有类型的特征列。
  • DNNClassifier 和 DNNRegressor:只接受密集列。其他类型的列必须封装 在 indicator_column 或 embedding_column 中。
  • DNNLinearCombinedClassifier 和 DNNLinearCombinedRegressor:
    • linear_feature_columns 参数接受任何类型的特征列。
    • dnn_feature_columns 参数只接受密集列。

参数:
DNNLinear:
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-4gn82dty.html
https://blog.csdn.net/weixin_42499236/article/details/84256558
Feature column:
https://blog.csdn.net/u014061630/article/details/82937333
https://blog.csdn.net/u014021893/article/details/80423112

你可能感兴趣的:(深度学习)