我正在为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中的回归量。
答案 0 :(得分:6)
看起来你的TF模型确实有效,并且会有足够的步骤。你需要把它顶起来 - 200K显示出显着的改善,几乎和sklearn默认一样好。
我认为有两个问题:
FtrlOptimizer
。该文件表明它是非常大的数据集的更好选择。input_fn
会立即为每一步注入整个训练集。这只是一种预感,但我怀疑如果它一次看到批次,FtrlOptimizer可能会做得更好。不仅可以将步数增加几个数量级,您还可以在优化器上提升学习率(默认值为0.2),并且仅从4k步骤获得同样好的结果:
linear_regressor = tf.contrib.learn.LinearRegressor(
feature_columns=features,
optimizer=tf.train.FtrlOptimizer(learning_rate=5.0))
答案 1 :(得分:0)
我遇到了类似的问题。解决方案是检查input_fn是否有足够的纪元。在多次迭代整个训练数据之前,训练可能不会收敛。