【问题标题】:How can I reduce outliers in the output of a regression model?如何减少回归模型输出中的异常值?
【发布时间】:2022-12-10 21:34:35
【问题描述】:

我正在使用 Keras 模型进行回归,输入是传感器测量值,输出是传感器的姿态。该模型由 CuDNNLSTM 和 CNN 组成。我需要减少输出中异常值的数量或范围。

平均误差合理且低,但输出中有太多异常值。平均误差约为 1,但正如您在箱线图中看到的那样,有时我会得到 180 个错误(最大可能误差)。

训练数据没有异常值,之前已经过预处理。

如何减少输出中的异常值? 是否有任何特定的网络拓扑或层可以处理这个问题?

我尝试对输入进行归一化或添加高斯噪声,但它们都对输出中的异常值数量没有任何影响。另外,我尝试了所有可能的损失函数(超过 38 个),这是最好的结果。

该模型是:

Acc = Input((window_size, 3), name='acc')
Gyro = Input((window_size, 3), name='gyro')
AGconcat = concatenate([Acc, Gyro], axis=2, name='AGconcat')

fs = Input((1,), name='fs')
ACNN = Conv1D(filters=133,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'ACNN')(Acc)
ACNN = Conv1D(filters=109,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'ACNN1')(ACNN)
ACNN = MaxPooling1D(pool_size=3,
                    name = 'MaxPooling1D')(ACNN)
ACNN = Flatten(name='ACNNF')(ACNN)

GCNN = Conv1D(filters=142,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'GCNN')(Gyro)
GCNN = Conv1D(filters=116,
                kernel_size = 11,
                padding = 'same',
                activation = tfa.activations.mish,
                name= 'GCNN1')(GCNN)
GCNN = MaxPooling1D(pool_size=3,
                    name = 'GyroMaxPool1D')(GCNN)
GCNN = Flatten(name='GCNNF')(GCNN)

AGconLSTM =Bidirectional(CuDNNGRU(128, return_sequences=True, 
                                    #return_state=True,
                                    go_backwards=True,
                                    name='BiLSTM1'))(AGconcat)
                                    
FlattenAG = Flatten(name='FlattenAG')(AGconLSTM)
AG = concatenate([ACNN, GCNN,FlattenAG])
AG = Dense(units=256,
                activation= tfa.activations.mish)(AG)
Fdense = Dense(units=256,
                activation= tfa.activations.mish,
                name= 'Fdense')(fs)
AG = Flatten(name='AGF')(AG)
x = concatenate([AG, Fdense])
x = Dense(units=256,
                    activation= tfa.activations.mish)(x)
x = Flatten(name='output')(x)
output = Dense(4, activation='linear', name='quat')(x)

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    您可以尝试权重衰减和正则化。对于最后一行,您可以添加以下内容:

    quat = Lambda(lambda x: k.l2_normalize(x, axis=1), name='QuatNorm')(quat) 
    

    【讨论】:

    • 谢谢!我试过这个,但影响不大。另外,我尝试为每一层添加正则化,但性能明显下降。
    猜你喜欢
    • 2020-06-14
    • 2020-07-16
    • 2015-07-09
    • 2019-11-02
    • 1970-01-01
    • 2022-01-06
    • 2021-12-26
    • 2020-02-08
    • 2019-04-08
    相关资源
    最近更新 更多