Tensorflow tf.contrib.learn.LinearRegressor为具有一个特征的数据构建意外错误的模型

Tensorflow tf.contrib.learn.LinearRegressor为具有一个特征的数据构建意外错误的模型,tensorflow,linear-regression,tflearn,Tensorflow,Linear Regression,Tflearn,我正在为数据建立一个简单的线性回归。数据包括一些人的体重和身高值。整个学习过程非常简单: 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) l

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

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)
然而,回归者建立的模型出人意料地糟糕。结果如下图所示:

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

以下是scikit学习中为线性回归类提供的相同数据:

lr_updated = linear_model.LinearRegression()
lr_updated.fit(weight_filtered_reshaped, height_filtered)
以及可视化:

增加步数没有效果。我会假设我用了一种错误的方法从张量流中得到了回归量


看起来您的TF模型确实有效,并且需要足够的步骤才能实现。您需要立即启动它,尽管-200K显示了显著的改进,几乎与sklearn默认值一样好

我认为有两个问题:

  • sklearn看起来像是用普通最小二乘法简单地解出了方程。TF的线性累加器使用。本文指出,对于超大数据集,它是一种较好的选择
  • 模型的
    输入\u fn
    一次为每个步骤注入整个训练集。这只是一种预感,但我怀疑FtrlOptimizer如果一次看到批,可能会做得更好
  • 您还可以在优化器上提升学习速率(默认值为0.2),而不仅仅是将步数提高几个数量级,并仅从4k步数中获得类似的良好结果:

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

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

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