我使用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后开始上升,因此我认为过拟合了!然而,召回率仍在上升,精确度也在略有改善。
这是为什么呢?我的模型是否过拟合了?
回答:
验证损失指标在约300个epoch后开始上升 (…) 召回率仍在上升,精确度也在略有改善。 (…) 这是为什么呢?
精确度和召回率是衡量分类器在预测类别标签方面的表现的指标。另一方面,模型损失是交叉熵的度量,是分类概率中的错误:
其中
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个观察值,通过计算所有观察值损失的平均值。
我的模型是否过拟合了?
为了确定这一点,您需要比较训练损失和验证损失。仅靠验证损失是无法判断的。如果训练损失下降而验证损失上升,那么您的模型就是过拟合的。