如何根据损失、精确度和召回率判断模型是否过拟合

我使用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))

监控的指标包括损失、准确率、精确度、召回率和F1分数。

我注意到验证损失指标在约300个epoch后开始上升,因此我认为过拟合了!然而,召回率仍在上升,精确度也在略有改善。


enter image description hereenter image description hereenter image description here


这是为什么呢?我的模型是否过拟合了?


回答:

验证损失指标在约300个epoch后开始上升 (…) 召回率仍在上升,精确度也在略有改善。 (…) 这是为什么呢?

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

![![![enter image description here

其中

y = 预测的标签p = 预测标签的概率

例如,模型对一个观察值的输出(softmax)在不同epoch下可能如下所示,假设

# 第300个epochy = [0.1, 0.9] => argmax(y) => 1 (类别标签1)loss = -(1 * log(0.9)) = 0.10# 第500个epochy = [0.4, 0.6] => argmax(y) => 1 (类别标签1)loss = -(1 * log(0.6)) = 0.51

在这两种情况下,精确度和召回率指标保持不变(类别标签仍然被正确预测),然而模型损失增加了。总的来说,模型对其预测变得“不太确定”,但仍然是正确的。

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

我的模型是否过拟合了?

为了确定这一点,您需要比较训练损失和验证损失。仅靠验证损失是无法判断的。如果训练损失下降而验证损失上升,那么您的模型就是过拟合的。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注