我正在尝试使用神经网络从包含 24 个不同特征的输入中预测两个不同的值。到目前为止我得到的结果还不够好,所以任何建议都会受到赞赏,因为我已经被困了一段时间。这是我到目前为止所做的:
输入数据:
我有一个包含 24 个不同特征的输入(总数据集大约有 150,000 个实例)。所以我尝试标准化我的输入,对其进行规范化,对它进行日志转换,并使用 PCA 来降低问题的维度。其中,PCA 已被证明是最佳解决方案(使用前 5 个主成分)。
为了确保输入很重要,我使用随机森林回归器和额外的 Tress 回归器进行了快速拟合,以计算每个特征的重要性(在执行 PCA 之后)。与随机特征相比,所有正在使用的特征似乎对模型来说都足够重要。
神经网络
对于神经网络,我尝试了很多方法,最终得出以下架构:
initializer_sm = tf.keras.initializers.GlorotNormal()
model_nn = keras.Sequential([
keras.layers.Dense(128,input_dim = xnn_train.shape[1], activation='selu', kernel_initializer=initializer),
keras.layers.Dense(256, activation='selu', kernel_initializer=initializer),
keras.layers.Dense(256, activation='selu', kernel_initializer=initializer),
keras.layers.Dense(2, activation = 'softplus', kernel_initializer=initializer_sm)
])
def custom_loss(y_true,y_pred):
return (K.abs(y_true - y_pred)/y_true)*100
epochs = 100
opt = keras.optimizers.Nadam()
model_nn.compile(optimizer = opt, loss = custom_loss)
history_nn = model_nn.fit(xnn_train, ynn_train, epochs = epochs, batch_size = 1024, validation_data = (xnn_val,ynn_val))
结果如下:
这些是根据实际值预测的每个输出的直方图:
我还尝试在之前显示的架构之前实现一维卷积层,但它们的唯一效果是损失函数收敛得更快。

