Large-scale Linear Models with TensorFlow(TensorFlow的大型线性模型)

具有张量流的大规模线性模型

tf.estimator API为TensorFlow中的线性模型提供了一套丰富的工具(除其他外)。本文档提供了这些工具的概述。它说明:

  • 线性模型是什么。

  • 为什么你想要使用线性模型。

  • tf.estimator如何在TensorFlow中轻松构建线性模型。

  • 如何使用tf.estimator将线性模型与深度学习相结合以获得两者的优点。

阅读本概述以确定tf.estimator线性模型工具是否对您有用。然后做线性模型教程试一试。本概述使用了本教程中的代码示例,但本教程更详细地介绍了代码。

为了理解这个概述,它将有助于熟悉基本的机器学习概念以及tf.estimator。

什么是线性模型?

线性模型使用的特征的单加权和以进行预测。举例来说,如果你有数据上的年龄,受教育年限,和每周工作小时数人口,可以让他们的加权和估计一个人的薪水学习为每个数字的权重。您还可以使用线性模型进行分类。

一些线性模型将加权和转换为更方便的形式。例如,逻辑回归将加权和插入逻辑函数中,将输出转换为介于0和1之间的值。但对于每个输入要素,您仍然只有一个权重。

你为什么要使用线性模型?

当最近的研究证明更复杂的神经网络具有多层功能时,为什么要使用如此简单的模型?

线性模型:

  • 与深度神经网络相比,快速训练。

  • 可以在非常大的功能集上运行良好。

  • 可以使用不需要大量学习损耗等操作的算法进行训练。

  • 可以比神经网络更容易地解释和调试。您可以检查分配给每个功能的权重,以确定对预测的影响最大的是什么。

  • 为学习机器学习提供了一个很好的起点。

  • 在工业中被广泛使用。

tf.estimator如何帮助您构建线性模型?

您可以在TensorFlow中从头开始构建线性模型,而无需特殊API的帮助。但是tf.estimator提供了一些工具,可以更容易地构建有效的大规模线性模型。

特征列和转换

设计线性模型的大部分工作包括将原始数据转换为合适的输入特征。Tensorflow使用FeatureColumn抽象地来启用这些转换。

FeatureColumn表示数据中的单个功能。FeatureColumn可以表示像“高度”这样的量,或者它可以表示像'eye_color'这样的类别,其中值是从一组离散的可能性(例如{'blue','brown','green'})中绘制的。

在像“高度”这样的连续特征和“eye_color”这样的分类特征的情况下,数据中的单个值在输入模型之前可能会转换为数字序列。FeatureColumn尽管有这个事实,抽象允许您将该特征作为单个语义单元进行操作。您可以指定转换并选择要包含的要素,而不用处理模型中张量中的特定索引。

稀疏列

线性模型中的分类特征通常被转换为稀疏向量,其中每个可能的值都具有相应的索引或识别符。例如,如果只有三种可能的眼睛颜色,则可以将“eye_color”表示为长度为3的矢量:“棕色”将变为1,0,0,“蓝色”变为0,1,0,“绿色”变为0,0,1.这些向量称为“稀疏”,因为它们可能非常长,当可能值集合非常大时(例如所有英文单词),它们会有很多零。

虽然不需要使用分类列来使用tf.estimator线性模型,但线性模型的优势之一在于它们处理大型稀疏向量的能力。稀疏特征是tf.estimator线性模型工具的主要用例。

Encoding sparse columns

FeatureColumn 处理将分类值自动转换为矢量的代码,如下所示:

eye_color = tf.feature_column.categorical_column_with_vocabulary_list( "eye_color", vocabulary_list=["blue", "brown", "green"])

其中eye_color是源数据中列的名称。

您也可以生成FeatureColumn为所有未知可能值的标注分类特征。对于这种情况,您可以使用categorical_column_with_hash_bucket(),它使用散列函数将索引分配给要素值。

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

特征交叉

由于线性模型为独立要素分配独立权重,因此无法了解特征值的特定组合的相对重要性。如果你有一个功能'favorite_sport'和一个功能'home_city',并且你试图预测一个人是否喜欢穿红色,那么你的线性模型将无法从圣路易斯那些棒球迷特别喜欢穿红的样本中学习。

你可以通过创建一个新功能'favorite_sport_x_home_city'来解决这个限制。这个特征对于给定的人的价值仅仅是两个源特征值的连接:例如,'baseball_x_stlouis'。这种组合特征称为特征交叉

crossed_column()方法可以轻松设置特征十字:

sport_x_city = tf.feature_column.crossed_column( ["sport", "city"], hash_bucket_size=int(1e4))

连续的列

您可以像这样指定一个连续的功能:

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

虽然作为单个实数,连续的特征通常可以直接输入到模型中,但Tensorflow也为这种列提供了有用的转换。

分行化

分行化将连续列转变为分类列。此转换可让您在特征交叉中使用连续特征,或了解特定值范围具有特殊重要性的情况。

分行化将可能值的范围划分为称为分行化的子范围:

age_buckets = tf.feature_column.bucketized_column( age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

值所在的存储分行将成为该值的分类标签。

输入功能

FeatureColumn为您的模型提供了输入数据的规范,指示如何表示和转换数据。但他们不提供数据本身。您通过输入功能提供数据。

输入函数必须返回张量字典。每个键对应于一个名称FeatureColumn。每个键的值都是一个包含所有数据实例的该特征值的张量。请参阅建立与tf.estimator输入功能在输入功能更全面地了解input_fn,并在线性模型教程代码示例实现输入功能的。

输入函数传递到train()evaluate()调用启动培训和测试,将在下一节描述。

线性估计器

Tensorflow估计器类为回归和分类模型提供了统一的训练和评估工具。他们负责培训和评估循环的细节,并允许用户专注于模型输入和架构。

要构建线性估计器,可以分别使用tf.estimator.LinearClassifier估计器或tf.estimator.LinearRegressor估计器进行分类和回归。

与所有张量流量估计器一样,要运行估算器,您只需:

  • 实例化估计器类。对于两个线性估计器类,您将FeatureColumn 的列表传递给构造函数。

  • 调用估算器的train()方法来训练它。

2. 调用估算器的evaluate()方法来看看它是如何工作的。

例如:

e = tf.estimator.LinearClassifier( feature_columns=[ native_country, education, occupation, workclass, marital_status, race, age_buckets, education_x_occupation, age_buckets_x_race_x_occupation], model_dir=YOUR_MODEL_DIRECTORY) e.train(input_fn=input_fn_train, steps=200) # Evaluate for one step (one pass through the test data). results = e.evaluate(input_fn=input_fn_test) # Print the stats for the evaluation. for key in sorted(results): print("%s: %s" % (key, results[key]))

广泛而深入的学习

tf.estimator API还提供了一个估算器类,可让您结合训练线性模型和深度神经网络。这种新颖的方法结合了线性模型“记忆”关键特征和神经网络泛化能力的能力。使用tf.estimator.DNNLinearCombinedClassifier创造这种 “广泛而深入”的模式:

e = tf.estimator.DNNLinearCombinedClassifier( model_dir=YOUR_MODEL_DIR, linear_feature_columns=wide_columns, dnn_feature_columns=deep_columns, dnn_hidden_units=[100, 50])

有关更多信息,请参阅Wide and Deep Learning教程。