喀拉斯人总是沿直线预测

时间:2019-12-18 07:40:57

标签: python pandas keras

我从深度学习开始。我正在尝试学习具有多层模型的二次函数。 predicted_y似乎总是一行(learnX的构建),我在这里做什么错了?

我希望代码能清楚说明。这是我的Jupiterlab细胞代码:

import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation
from sklearn.preprocessing import MinMaxScaler

def my_build_model(X, y):
    model = Sequential([
        Dense(16, input_shape=(X.shape[1],)),
        Activation('relu'),
        Dense(8),
        Activation('relu'),
        Dense(4),
        Activation('relu'),
        Dense(1),
    ])

    model.compile(loss="mean_squared_error", optimizer='adam', metrics=['mse'])

    model.fit(X, y, epochs=100)

    _, accuracy = model.evaluate(X, y)
    print('Accuracy: %.2f' % (accuracy*100))

    return model

n_rows = 20
X=pd.DataFrame({
    'a': [1 + x for x in range(-n_rows, 5+n_rows)],
    'b': [2 + x for x in range(-n_rows, 5+n_rows)],
    'c': [3 + x for x in range(-n_rows, 5+n_rows)],
    'd': [4 + x for x in range(-n_rows, 5+n_rows)],
    'e': [5 + x for x in range(-n_rows, 5+n_rows)],
    'f': [6 + x for x in range(-n_rows, 5+n_rows)],
})
y=pd.Series([10 + random.random() + x * x for x in range(-n_rows, 5+n_rows)])

csX = MinMaxScaler()
XContinuous = csX.fit_transform(X)

model = my_build_model(X=XContinuous, y=y)

df = pd.DataFrame({'y': y, 'predict_y': [x for [x] in model.predict(XContinuous)]})

df['y'].plot(c='#ff0000aa', label='y', legend=True)
plt.show()

df['predict_y'].plot(c='#00bb00aa', label='predict_y', legend=True)
plt.show()

1 个答案:

答案 0 :(得分:0)

这可以归结为几件事。

  • 首先,我认为您应该重新考虑功能的“随机性”。如果我查看XContinuous,则每一行的所有功能都是相同的。

  • 您可能低估了近似功能所需的神经元数量。更多信息here

但是,通过一些调整,我还是能够取得不错的成绩:

  • 随机X
  • optimizer=Adam(lr=0.0001)
  • epochs=1000
  • 10000x100x10000x100x1密集relu的体系结构
Epoch 1000/1000
45/45 [==============================] - 0s 2ms/step - loss: 4.1500 - mean_squared_error: 4.1500

plot y plot y_predict

我确信有很多更好的方法可以做到这一点;当前的设置感觉像是一个过大的杀伤力。

您是否有理由尝试使用神经网络执行此操作?您是否考虑过sklearn's linear regressors