4

我正在为来自csv的数据构建一个简单的线性回归器。数据包括一些人的体重和身高值。整体学习过程非常简单:

MAX_STEPS = 2000
# ...
features = [tf.contrib.layers.real_valued_column(feature_name) for feature_name in FEATURES_COL]
# ...
linear_regressor = tf.contrib.learn.LinearRegressor(feature_columns=features)
linear_regressor.fit(input_fn=prepare_input, max_steps=MAX_STEPS)

然而,出乎意料的是,回归器构建的模型很糟糕。结果可以用下一张图来说明: 在此处输入图像描述

可视化代码(以防万一):

plt.plot(height_and_weight_df_filtered[WEIGHT_COL], 
         linear_regressor.predict(input_fn=prepare_full_input), 
         color='blue',
         linewidth=3)

以下是 scikit-learn 为 LinearRegression 类提供的相同数据:

lr_updated = linear_model.LinearRegression()
lr_updated.fit(weight_filtered_reshaped, height_filtered)

和可视化: 在此处输入图像描述

增加步数没有效果。我会假设我以错误的方式使用来自 TensorFlow 的回归器。

带有代码的 iPython 笔记本。

4

2 回答 2

6

看起来您的 TF 模型确实有效,并且会通过足够的步骤到达那里。不过,您需要立即将其顶起 - 200K 显示出显着的改进,几乎与 sklearn 默认值一样好。

我认为有两个问题:

  1. sklearn 看起来像使用普通最小二乘法简单地求解方程。TF 的 LinearRegressor 使用FtrlOptimizer. 该论文表明它是非常大的数据集的更好选择。
  2. input_fn模型是为每一步一次注入整个训练集。这只是一种预感,但我怀疑 FtrlOptimizer 如果一次查看批次可能会做得更好。

除了将步数提高几个数量级之外,您还可以在优化器上提高学习率(默认值为 0.2),并仅从 4k 步获得类似的良好结果:

linear_regressor = tf.contrib.learn.LinearRegressor(
    feature_columns=features, 
    optimizer=tf.train.FtrlOptimizer(learning_rate=5.0))
于 2016-12-22T05:54:07.423 回答
0

我遇到了类似的问题。解决方案是检查您的 input_fn 是否有足够的 epoch。在对整个训练数据进行多次迭代之前,训练可能不会收敛。

于 2017-09-10T23:02:37.160 回答