神经网络回归预测所有测试样本的相同值

Posted

技术标签:

【中文标题】神经网络回归预测所有测试样本的相同值【英文标题】:Neural-net Regression predicts same value for all test samples 【发布时间】:2017-09-01 09:10:59 【问题描述】:

我的神经网络回归模型为所有测试样本预测一个值。使用 epochs、batch_size、层数、隐藏单元、学习率等超参数只会将预测值更改为新常数。

对于测试,如果我对训练数据本身进行测试,我会得到几乎准确的结果和 RMSE ~ 1。

注意:任务是根据机器运行到故障的时间序列数据预测机器的剩余寿命。我使用 tsfresh 库从原始时间序列数据中生成了 1045 个特征,只有 24 个特征。

应该是什么导致了这种行为?我应该如何可视化神经网络模型开发以确保事情朝着正确的方向发展?

print "Shape of training_features is", train_X.shape
print "Shape of train_labels is", train_Y.shape
print "Shape of test_features is", test_X.shape
print "shape of test_labels is", test_Y.shape

input_dim = train_X.shape[1]
# Function to create model, required for KerasRegressor
def create_model(h1=50, h2=50, act1='sigmoid', act2='sigmoid', init='he_normal', learn_rate=0.001, momentum=0.1, loss='mean_squared_error'):
    # create model
    model = Sequential()
    model.add(Dense(h1, input_dim=input_dim, init=init, activation=act1))
    model.add(Dense(h2, init=init, activation=act2))
    model.add(Dense(1, init=init))
    # Compile model
    optimizer = SGD(lr=learn_rate, momentum=momentum)
    model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])
    return model

''' THE REAL THING '''
# create model
model = KerasRegressor(build_fn=create_model, verbose=0)

# SCORING FUNCTION
grid_scorer = make_scorer(mean_squared_error, greater_is_better=False)
# Grid Search
batch_size = [8]
epochs = [500]
init_mode = ['glorot_uniform']
learn_rate = [0.0001]
momentum = [0.1]

hidden_layer_1 = [75]
activation_1 = ['sigmoid']
hidden_layer_2 = [15]
activation_2 = ['sigmoid']

param_grid = dict(batch_size=batch_size, nb_epoch=epochs, init=init_mode, h1=hidden_layer_1, h2=hidden_layer_2, act1 = activation_1, act2=activation_2, learn_rate=learn_rate, momentum=momentum)

print "\n...BEGIN SEARCH..."
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, scoring=grid_scorer, verbose=1)

print "\nLet's fit the training data..."
grid_result = grid.fit(train_X, train_Y)

# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param))

predicted = grid.predict(test_X)  
print "\nPrediction array is\n", predicted
rmse = numpy.sqrt(((predicted - test_Y) ** 2).mean(axis=0))
print "Test RMSE is", rmse

输出:

Shape of training_features is (249, 1045)
Shape of train_labels is (249,)
Shape of test_features is (248, 1045)
shape of test_labels is (248,)

...BEGIN SEARCH...

Let's fit the training data...
Fitting 5 folds for each of 1 candidates, totalling 5 fits
Best: -891.761863 using 'learn_rate': 0.0001, 'h2': 15, 'act1': 'sigmoid', 'act2': 'sigmoid', 'h1': 75, 'batch_size': 8, 'init': 'glorot_uniform', 'nb_epoch': 500, 'momentum': 0.1
-891.761863 (347.253351) with: 'learn_rate': 0.0001, 'h2': 15, 'act1': 'sigmoid', 'act2': 'sigmoid', 'h1': 75, 'batch_size': 8, 'init': 'glorot_uniform', 'nb_epoch': 500, 'momentum': 0.1

Prediction array is
[ 295.72067261  295.72067261  295.72067261  295.72067261  295.72067261
  295.72067261  295.72067261  ...
                              295.72067261  295.72067261  295.72067261
  295.72067261  295.72067261  295.72067261]
Test RMSE is 95.0019297411

【问题讨论】:

所以你使用 249 个样本和 1045 个特征来训练一个神经网络?这可能会导致严重的过拟合。我建议您获取更多数据或减少功能数量。 我认为我没有办法获取更多数据(研究项目)。但问题是“为什么过度拟合模型应该预测所有值相同”?它不应该为不同的测试特征向量提供错误/随机的值吗? 尝试将activations 更改为relu 或将initializer 更改为glorot_normalhe_normal 用于 relu。使用 sigmoid 被认为不是最好的主意 - 您可能会遭受梯度消失的困扰 - 特别是当您使用 he 初始化 sigmoid 并且您的 lrmomentum 非常小时。 我想我也尝试过这些组合。但是,在尝试更多您的建议后,我会再次报告。我正在做的主要是经验性的,打击和试验;我希望我能想象事情是如何在下面展开的。不过谢谢:) 【参考方案1】:

您应该尝试扩展您的数据。这通常发生在要素未缩放时。

【讨论】:

以上是关于神经网络回归预测所有测试样本的相同值的主要内容,如果未能解决你的问题,请参考以下文章

Keras model.predict() 为测试输入中的所有值返回相同的预测输出

预测 - 用于回归的神经网络预测相同的值

Python神经网络学习--机器学习--线性回归

Python神经网络学习--机器学习--线性回归

Python神经网络学习--机器学习--线性回归

Python神经网络学习--机器学习--线性回归