如何根据损失精​​度和召回确定过度拟合模型

Shl*_*rtz 8 python machine-learning keras tensorflow

我用Keras写了一个LSTM网络(下面的代码):

    df = pd.read_csv("../data/training_data.csv")

    # Group by and pivot the data
    group_index = df.groupby('group').cumcount()
    data = (df.set_index(['group', group_index])
            .unstack(fill_value=0).stack())

    # getting np array of the data and labeling
    # on the label group we take the first label because it is the same for all
    target = np.array(data['label'].groupby(level=0).apply(lambda x: [x.values[0]]).tolist())
    data = data.loc[:, data.columns != 'label']
    data = np.array(data.groupby(level=0).apply(lambda x: x.values.tolist()).tolist())

    # shuffel the training set
    data, target = shuffle(data, target)

    # spilt data to train and test
    x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=4)

    # ADAM Optimizer with learning rate decay
    opt = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0001)

    # build the model
    model = Sequential()

    num_features = data.shape[2]
    num_samples = data.shape[1]

    model.add(LSTM(8, batch_input_shape=(None, num_samples, num_features), return_sequences=True, activation='sigmoid'))
    model.add(LeakyReLU(alpha=.001))
    model.add(Dropout(0.2))
    model.add(LSTM(4, return_sequences=True, activation='sigmoid'))
    model.add(LeakyReLU(alpha=.001))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))

    model.compile(loss='binary_crossentropy', optimizer=opt,
                  metrics=['accuracy', keras_metrics.precision(), keras_metrics.recall(),f1])

    model.summary()


    # Training, getting the results history for plotting
    history = model.fit(x_train, y_train, epochs=3000, validation_data=(x_test, y_test))
Run Code Online (Sandbox Code Playgroud)

监控的指标包括损失,准确性,精确度,召回率和f1分数.

我注意到验证损失度量开始在300个时期内攀升,所以我认为过度拟合!然而,召回仍在攀升,精确度略有提高.


在此输入图像描述 在此输入图像描述 在此输入图像描述


这是为什么?我的模特是否过度装修?

mir*_*ixx 5

验证损失指标开始攀升约 300 epochs (...) 召回率仍在攀升,精度略有提高。(...) 这是为什么?

准确率和召回率是衡量分类器在预测类别标签方面表现如何的指标。另一方面,模型损失是交叉熵的度量,即分类概率的误差:

![![![在此处输入图像描述

在哪里

y = predicted label
p = probability of predicted label
Run Code Online (Sandbox Code Playgroud)

例如,对于不同的时期,一个观察的模型的(softmax)输出可能看起来像这样,说

# epoch 300
y = [0.1, 0.9] => argmax(y) => 1 (class label 1)
loss = -(1 * log(0.9)) = 0.10

# epoch 500
y = [0.4, 0.6] => argmax(y) => 1 (class label 1)
loss = -(1 * log(0.6)) = 0.51
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,准确率和召回率指标将保持不变(仍然正确预测类标签),但是模型损失增加了。一般而言,该模型对其预测变得“不太确定”,但它仍然是正确的。

请注意,在您的模型中,损失是针对所有观察值计算的,而不仅仅是单个观察值。为了简单起见,我限制了讨论。通过取所有观测值的损失的平均值,损失公式被简单地扩展到 n > 1 个观测值。

我的模型是否过拟合?

为了确定这一点,您必须比较训练损失和验证损失。您不能仅通过验证损失来判断。如果训练损失减少而验证损失增加,则您的模型过度拟合。