首页 > 解决方案 > 1.0 的准确度,而训练损失和验证损失仍在下降

问题描述

我创建了一个 LSTM RNN,以便根据 gps 坐标预测是否有人在开车。这是数据示例(注意:x,y,z 是从 lat,lon 转换的 3d 坐标):

                        x           y           z       trip_id,mode_cat,weekday,period_of_day
datetime            id                          
2011-08-27 06:13:01 20  0.650429    0.043524    0.758319    1   1   1   0
2011-08-27 06:13:02 20  0.650418    0.043487    0.758330    1   1   1   0
2011-08-27 06:13:03 20  0.650421    0.043490    0.758328    1   1   1   0
2011-08-27 06:13:04 20  0.650427    0.043506    0.758322    1   1   1   0
2011-08-27 06:13:05 20  0.650438    0.043516    0.758312    1   1   1   0

当我训练我的网络时,我的 training_loss 和 validation_loss 都减少了,但在第一个 epoch 准确度达到了 1.0。我确保我的训练和测试数据不一样。以下是我拆分训练和测试数据的方法:

t_num_test = df["trip_id"].iloc[-1]*4//5
train_test_df = df.loc[df["trip_id"]<=t_num_test].copy(deep=True)
test_test_df = df.loc[df["trip_id"]>t_num_test].copy(deep=True)

features_train = train_test_df[["x","y","z","datetime","id","trip_id","mode_cat","weekday","period_of_day"]]
features_train.set_index(["datetime","id"],inplace=True)
dataset_train_x = features_train[["x","y","z","trip_id","weekday","period_of_day"]].values
dataset_train_y = features_train[["mode_cat"]].values

features_test = test_test_df[["x","y","z","datetime","id","trip_id","mode_cat","weekday","period_of_day"]]
features_test.set_index(["datetime","id"],inplace=True)
dataset_test_x = features_test[["x","y","z","trip_id","weekday","period_of_day"]].values
dataset_test_y = features_test[["mode_cat"]].values

这是我建立网络的方式:

single_step_model = tf.keras.models.Sequential()
single_step_model.add(tf.keras.layers.LSTM(1,
                                           input_shape=x_train_single.shape[-2:]))
single_step_model.add(tf.keras.layers.Dropout(0.2))
single_step_model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

single_step_model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001), loss='binary_crossentropy',
                          metrics=['accuracy'])
.
.
.
single_step_history = single_step_model.fit(train_data_single, epochs=epochs,
                                            steps_per_epoch=evaluation_interval,
                                            validation_data=test_data_single,
                                            validation_steps=60)

这是显示training_loss、validation_loss和accuracy的图表

什么可能导致这种结果?如果重要的话,我将使用大约 500,000 个数据点和大约 8000 个唯一的 trip_id。

请指教

编辑: 驾驶/不驾驶的数量(Mode_cat:1/0)

标签: pythontensorflowkerasdeep-learninglstm

解决方案


希望这可以帮助!

我能想到的几个案例

  1. 您的数据集有偏见。大部分输入数据可能会出现偏差?检查其中的 mode_cat 值的百分比。(全部都是 1,还是大多数都是 1?)

  2. 您的 X 值可能有一个特征/列,它是一个函数 y 是 x 值的函数(例如 y_val = m * x_col2 + x_col3 ?)

  3. 准确度很好学,但尝试使用 f1 score/confusion_matrix 之类的东西。

关联:

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html#sklearn.metrics.f1_score

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html#sklearn.metrics.confusion_matrix


推荐阅读