如何用TF NN获得更好的预测(更低的平均绝对误差)?

时间:2018-02-06 07:32:15

标签: python tensorflow neural-network linear-regression tflearn

这是更严格的个人问题,但我希望有人会在这里帮助我。

我正在使用这个TF模型,它必须尽可能准确地预测一些连续的数字。我试图将结果与MAE精度低于6400,但我最接近的MAE预测为79000。

我有90个输入功能。 130000排训练数据。 10000行验证数据。

我的模特:

# Parameters
learning_rate = 0.001
training_epochs = 100
batch_size = 500
display_step = 1
# Network Parameters
n_input = X_train.shape[1]
n_hidden_1 = 180  # 1st layer number of features
n_hidden_2 = 180  # 2nd layer number of features
n_hidden_3 = 180  # 3rd layer number of features
n_hidden_4 = 180  # 4th layer number of features
n_hidden_5 = 180  # 6th layer number of features
n_hidden_6 = 180  # 7th layer number of features
n_hidden_7 = 180  # 8th layer number of features
n_out = 1


init = tf.truncated_normal_initializer(mean=0, stddev=0.1, seed=None)
weights = {
    'h1': tf.nn.l2_normalize(tf.get_variable(name='h1', shape=[n_input, n_hidden_1], initializer=init), axis=[0]),
    'h2': tf.nn.l2_normalize(tf.get_variable(name='h2', shape=[n_hidden_1, n_hidden_2], initializer=init), axis=[0]),
    'h3': tf.nn.l2_normalize(tf.get_variable(name='h3', shape=[n_hidden_2, n_hidden_3], initializer=init), axis=[0]),
    'h4': tf.nn.l2_normalize(tf.get_variable(name='h4', shape=[n_hidden_3, n_hidden_4], initializer=init), axis=[0]),
    'h5': tf.nn.l2_normalize(tf.get_variable(name='h5', shape=[n_hidden_4, n_hidden_5], initializer=init), axis=[0]),
    'h6': tf.nn.l2_normalize(tf.get_variable(name='h6', shape=[n_hidden_5, n_hidden_6], initializer=init), axis=[0]),
    'h7': tf.nn.l2_normalize(tf.get_variable(name='h7', shape=[n_hidden_6, n_hidden_7], initializer=init), axis=[0]),
    'wout': tf.nn.l2_normalize(tf.get_variable(name='wout', shape=[n_hidden_7, n_out], initializer=init), axis=[0])
}

biases = {
    'b1': tf.Variable(tf.random_normal([n_hidden_1], 0, 0.1, name='b1')),
    'b2': tf.Variable(tf.random_normal([n_hidden_2], 0, 0.1, name='b2')),
    'b3': tf.Variable(tf.random_normal([n_hidden_3], 0, 0.1, name='b3')),
    'b4': tf.Variable(tf.random_normal([n_hidden_4], 0, 0.1, name='b4')),
    'b5': tf.Variable(tf.random_normal([n_hidden_5], 0, 0.1, name='b5')),
    'b6': tf.Variable(tf.random_normal([n_hidden_6], 0, 0.1, name='b6')),
    'b7': tf.Variable(tf.random_normal([n_hidden_7], 0, 0.1, name='b7')),
    'bout': tf.Variable(tf.random_normal([n_out], 0, 0.1, name='bout'))
}
# Construct model
pred = multilayer_perceptron(x, weights, biases)

我的费用函数:

cost = tf.reduce_mean(tf.abs(tf.transpose(pred) - y) / y)

我的优化器:

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

我也正在预处理我的测试和验证数据:

X_test_scale = preprocessing.scale(X_test)

我尝试了很多变化,更多层次的神经元,不同的优化,规范化,成本,学习率,时期,批量大小功能,但我不能得到更多:

MAE: 79900.500000
MRE: 0.129946

您对如何做得更好有任何建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

很难指出解决方案,但你没有提到的一件事是正规化。辍学或l2正规化可能有所帮助。另外,查看您的学习曲线并检查模型是否过度拟合。 例如,使用l2,您可以执行以下操作:

regularizer = tf.nn.l2_loss(weights)
cost = tf.reduce_mean(tf.abs(tf.transpose(pred) - y) / y + regularizer)

最重要的是,您似乎没有使用任何激活功能,因为您正在调用multilayer_perceptron。我认为改进的最佳机会是在层之间包含非线性函数,例如ReLU。