我正在尝试使用神经网络进行回归,以从146个输入特征预测单一输出。
我对所有输入和输出都应用了标准化处理。
训练后我监测了平均绝对误差,结果在训练、验证和测试集上的误差都高得离谱(甚至没有过拟合)。
我怀疑这是因为输出变量非常不平衡(见直方图)。从直方图可以看出,大多数样本集中在0附近,但也有一小部分样本集中在-5附近。
这是模型创建代码:
input = Input(batch_shape=(None, X.shape[1]))layer1 = Dense(20, activation='relu')(input)layer1 = Dropout(0.3)( layer1)layer1 = BatchNormalization()(layer1)layer2 = Dense(5, activation='relu', kernel_regularizer='l2')(layer1)layer2 = Dropout(0.3)(layer2)layer2 = BatchNormalization()(layer2)out_layer = Dense(1, activation='linear')(layer2)model = Model(inputs=input, outputs=out_layer)model.compile(loss='mean_squared_error', optimizer=optimizers.adam() , metrics=['mae'])
这是模型摘要:
Layer (type) Output Shape Param # =================================================================input_1 (InputLayer) (None, 146) 0 _________________________________________________________________dense_1 (Dense) (None, 20) 2940 _________________________________________________________________dropout_1 (Dropout) (None, 20) 0 _________________________________________________________________batch_normalization_1 (Batch (None, 20) 80 _________________________________________________________________dense_2 (Dense) (None, 5) 105 _________________________________________________________________dropout_2 (Dropout) (None, 5) 0 _________________________________________________________________batch_normalization_2 (Batch (None, 5) 20 _________________________________________________________________dense_3 (Dense) (None, 1) 6 =================================================================Total params: 3,151Trainable params: 3,101Non-trainable params: 50_________________________________________________________________
观察实际的模型预测,较大的误差主要发生在真实输出值约为-5的样本上(即那一小部分样本)。
我尝试了许多超参数配置,但误差仍然很高。
我看到许多关于在不平衡数据上进行神经网络分类的建议,但对于回归问题可以做些什么呢?我觉得奇怪的是,回归神经网络似乎没有正确学习这些数据。我做错了什么?
回答:
从你的直方图来看,似乎非零输出的情况很少见。这类似于一个分类问题,我们试图预测一个罕见的类别,从损失函数的角度来看,一个强有力的策略就是简单地猜测最常见的类别——在这种情况下,就是你的众数值0。
你应该研究一下人们是如何预测罕见事件或在某些类别稀少时如何对输入进行分类的。例如,这个讨论可能会有帮助:https://www.reddit.com/r/MachineLearning/comments/412wpp/predicting_rare_events_how_to_prevent_machine/
你可以尝试的一些策略包括
- 删除大部分输出为零的训练样本,使你的训练数据更加平衡
- 创建或获取更多非零的训练样本
- 使用不同的机器学习算法(我在提供的链接中看到有人推荐使用提升方法。我想知道使用残差神经网络结构是否会得到好的结果,这在某些方面类似于提升)
- 重新结构化或重新缩放你的数据,以增加稀有值的权重