tf.contrib.learn.LinearRegressor为具有一个功能的数据构建意外的坏模型

时间:2016-11-22 05:28:40

标签: tensorflow linear-regression tflearn

我正在为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)

然而,由回归量构建的模型出乎意料地是坏的。结果可以用下一张图片说明: enter image description here

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

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)

可视化: enter image description here

增加步骤量无效。我会假设我以错误的方式使用TensorFlow中的回归量。

iPython notebook with the code.

2 个答案:

答案 0 :(得分:6)

看起来你的TF模型确实有效,并且会有足够的步骤。你需要把它顶起来 - 200K显示出显着的改善,几乎和sklearn默认一样好。

我认为有两个问题:

  1. sklearn看起来就像使用普通的最小二乘法简单地求解方程式一样。 TF的LinearRegressor使用FtrlOptimizer。该文件表明它是非常大的数据集的更好选择。
  2. 模型的input_fn会立即为每一步注入整个训练集。这只是一种预感,但我怀疑如果它一次看到批次,FtrlOptimizer可能会做得更好。
  3. 不仅可以将步数增加几个数量级,您还可以在优化器上提升学习率(默认值为0.2),并且仅从4k步骤获得同样好的结果:

    linear_regressor = tf.contrib.learn.LinearRegressor(
        feature_columns=features, 
        optimizer=tf.train.FtrlOptimizer(learning_rate=5.0))
    

答案 1 :(得分:0)

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