损失发现不够好

数据挖掘 机器学习 神经网络 特征选择 随机森林
2022-03-14 02:11:03

我正在尝试使用神经网络从包含 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))

结果如下:

在此处输入图像描述

这些是根据实际值预测的每个输出的直方图:

在此处输入图像描述

我还尝试在之前显示的架构之前实现一维卷积层,但它们的唯一效果是损失函数收敛得更快。

1个回答

您的网络对于这么多数据来说太大了。减少层中的单元数量,在层中使用简单的“relu”,除了最后一个应该使用 softmax 的层。考虑减少层数。

对于这个问题,我建议使用 XGBoost、CatBoost、LightGBM 等决策树库。你会得到最好的结果。