【问题标题】:Tensorflow Polynomial Linear Regression curve fitTensorflow 多项式线性回归曲线拟合
【发布时间】:2019-02-25 18:23:02
【问题描述】:

我使用 Tensorflow (Keras) 创建了这个线性回归模型。但是,我没有得到好的结果,我的模型试图将点拟合在一条直线周围。我相信围绕“n”多项式的拟合点可以给出更好的结果。我已经用谷歌搜索了如何使用 Tensorflow Keras 将我的模型更改为多项式线性回归,但找不到好的资源。关于如何改进预测的任何建议?

我有一个大型数据集。首先将其洗牌,然后对 80% 的训练和 20% 的测试表示不满。数据集也被标准化。

1) 建筑模型:

def build_model():

  model = keras.Sequential()
  model.add(keras.layers.Dense(units=300, input_dim=32))

  model.add(keras.layers.Activation('sigmoid'))
  model.add(keras.layers.Dense(units=250))

  model.add(keras.layers.Activation('tanh'))
  model.add(keras.layers.Dense(units=200))

  model.add(keras.layers.Activation('tanh'))
  model.add(keras.layers.Dense(units=150))

  model.add(keras.layers.Activation('tanh'))
  model.add(keras.layers.Dense(units=100))

  model.add(keras.layers.Activation('tanh'))
  model.add(keras.layers.Dense(units=50))

  model.add(keras.layers.Activation('linear'))
  model.add(keras.layers.Dense(units=1))  

  #sigmoid tanh softmax relu

  optimizer = tf.train.RMSPropOptimizer(0.001,  
                                        decay=0.9,
                                        momentum=0.0,
                                        epsilon=1e-10,
                                        use_locking=False,
                                        centered=False,
                                        name='RMSProp')

  #optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)

  model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae'])
  return model

model = build_model()
model.summary()

2) 训练模型:

class PrintDot(keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs):
    if epoch % 100 == 0: print('')
    print('.', end='')

EPOCHS = 500

# Store training stats
history = model.fit(train_data, train_labels, epochs=EPOCHS, 
                    validation_split=0.2, verbose=1,
                    callbacks=[PrintDot()])

3) 绘制 Train loss 和 val loss enter image description here

4) 当结果没有得到改善时停止 enter image description here

5) 评估结果

[loss, mae] = model.evaluate(test_data, test_labels, verbose=0)
#Testing set Mean Abs Error: 1.9020842795676374

6) 预测:

test_predictions = model.predict(test_data).flatten()

enter image description here

7) 预测误差: enter image description here

【问题讨论】:

  • This Q&A(与 cmets)可以给你一些见解。

标签: tensorflow machine-learning keras linear-regression prediction


【解决方案1】:

多项式回归是一种线性回归,具有一些额外的输入特征,这些特征是原始输入特征的多项式函数。 IE。; 让原始输入特征为:(x1,x2,x3,...)

通过对原始特征进行一些变换,生成一组多项式函数,例如:(x12, x2 sub>3, x13x2,...)。 人们可以根据它们的约束条件来决定要包含哪些所有函数,例如对目标值相关性的直觉、计算资源和训练时间。

将这些新特征附加到原始输入特征向量中。现在变换后的输入特征向量的大小为 len(x1,x2,x3,...) + len(x12, x23, x1 3x2,...)

此外,这组更新的输入特征 (x1,x2,x3,x1 2, x23, x13x2,...) 被输入到正常的线性回归模型中。 ANN 的架构可能会再次调整以获得最佳训练模型。

PS:我看到你的网络很大,而输入的数量只有 32 - 这不是常见的架构规模。即使在这个特定的线性模型中,将隐藏层减少到一个或两个隐藏层可能有助于训练更好的模型(这是一个建议,假设这个特定数据集与其他常见的回归数据集相似)

【讨论】:

    【解决方案2】:

    我实际上已经为 Tensorflow 2.0 创建了多项式层,尽管这些可能不是您正在寻找的。如果是,您可以直接使用这些层或按照那里使用的过程创建更通用的层https://github.com/jloveric/piecewise-polynomial-layers

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2019-09-05
      • 2017-11-15
      相关资源
      最近更新 更多