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のデフォルトとほぼ同じです.

次の 2 つの問題があると思います。

  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 に答える