Tensorflow多项式线性回归曲线拟合

时间:2019-02-25 18:23:02

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

我已经使用Tensorflow(Keras)创建了此线性回归模型。但是,我没有得到很好的结果,我的模型正在尝试拟合直线周围的点。我相信围绕度数'n'的多项式的拟合点可以提供更好的结果。我已经在Google上搜寻了如何使用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)情节火车损失和val损失 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

2 个答案:

答案 0 :(得分:1)

多项式回归是具有某些额外附加输入特征的线性回归,这些附加附加特征是原始输入特征的多项式函数。 即; 让原始输入特征为:(x 1 ,x 2 ,x 3 ,...) < / p>

通过添加原始特征的一些转换来生成多项式函数集,例如:(x 1 2 ,x 2 3 ,x 1 3 x 2 ,...)。 可以根据它们的约束条件(例如与目标值的相关性,计算资源和训练时间的直觉)来决定要包括所有功能。

将这些新特征附加到原始输入特征向量。现在变换后的输入特征向量的大小为 len(x 1 ,x 2 ,x 3 ,...)+ len(x 1 2 ,x 2 3 ,x 1 3 x 2 ,...)

此外,此更新的输入功能集(x 1 ,x 2 ,x 3 ,x 1 2 ,x 2 3 ,x 1 3 x < sub> 2 ,...)被输入到正常的线性回归模型中。可以再次调整ANN的体系结构以获得最佳训练模型。

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

答案 1 :(得分:0)

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