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

Via*_*kyi 4 linear-regression tensorflow 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)
Run Code Online (Sandbox Code Playgroud)

然而,由回归量构建的模型出乎意料地是坏的.结果可以用下一张图片说明: 在此输入图像描述

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

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

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

lr_updated = linear_model.LinearRegression()
lr_updated.fit(weight_filtered_reshaped, height_filtered)
Run Code Online (Sandbox Code Playgroud)

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

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

带代码的iPython笔记本.

Mar*_*ald 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))
Run Code Online (Sandbox Code Playgroud)