使用KerasRegressor进行非常糟糕的预测

时间:2018-01-26 09:28:26

标签: machine-learning neural-network keras

我在一个虚拟数据集上使用了KerasRegressor,并试图预测训练值本身。它给我一个远远不能令人满意的输出。训练数据根本不是随机的。谁能帮助我?

from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor

import numpy as ny

X = ny.array([[1,2], [3,4], [5,6], [7,8], [9,10]])
Y = ny.array([3, 4, 5, 6, 7])
N = 5

def brain():
    #Create the brain
    br_model=Sequential()
    br_model.add(Dense(3, input_dim=2, kernel_initializer='normal',activation='relu'))
    br_model.add(Dense(2, kernel_initializer='normal',activation='relu'))
    br_model.add(Dense(1,kernel_initializer='normal'))

    #Compile the brain
    br_model.compile(loss='mean_squared_error',optimizer='adam')
    return br_model


estimator = KerasRegressor(build_fn=brain, nb_epoch=1000000, batch_size=5,verbose=1)
print "Done"


estimator.fit(X,Y)
prediction = estimator.predict(X)

print Y
print prediction

输出

[3 4 5 6 7]
[0.001 0.001 0.001 0.001 0.001]

基本上,预测是0.001而实际值不是。 我尝试过其他网络配置,但我遇到了同样的问题。 我必须做什么/(不做)才能获得准确的输出?

1 个答案:

答案 0 :(得分:1)

这是由于新的从业者犯了一个经典的错误,即在将数据输入神经网络之前对其数据进行规范化(请参阅this answer中的第三点,了解同一问题使用卷积神经网络进行分类设置时的类似问题。)

(我承认,在我看过的大多数教程中,这个关键点通常不够强调;而且可能更糟,例如在Tensorflow MNIST For ML Beginners教程中,事实证明返回的数据通过Tensorflow提供的实用程序功能已经在[0,1]中标准化,对用户透明并且没有提供任何提示,因此从读取器中隐藏了一个关键步骤,当使用自己的数据时肯定需要在以后完成)。

因此,您需要将您的功能标准化为您的输出;保持展示的XY数据:

# Feature Scaling (ignore possible warnings due to conversion of integers to floats)
from sklearn.preprocessing import StandardScaler

sc_X = StandardScaler()
X_train = sc_X.fit_transform(X)

sc_Y = StandardScaler()
Y_train = sc_Y.fit_transform(Y)

然后,将您的纪元改为1000(这些数据肯定不需要100万个纪元!),并且适合缩放数据:

estimator = KerasRegressor(build_fn=brain, epochs=1000, batch_size=5,verbose=1)
estimator.fit(X_train,Y_train)

你会得到:

prediction = estimator.predict(X_train)

print(Y_train)
print(prediction)
# [-1.41421356 -0.70710678  0.          0.70710678  1.41421356]
# [-1.01221371 -1.01221371 -0.08764046  0.69051325  1.42577887]

或者,使用inverse_transform将输出缩放回原始范围:

print(Y)
print(sc_Y.inverse_transform(prediction))
# [3 4 5 6 7]
# [ 3.56851363  3.56851363  4.87605762  5.97653294  7.01635551]