我正在做一个处理传感器数据的项目。我从3个地方收集了传感器数据,并将数据存储为csv文件。大约有4000个样本。数据有X、Y、Z,我使用它们作为特征,class是我的目标变量。目标是在数据集上构建分类模型。目标变量/标签是1,2,3。因为它是时间序列数据,所以我选择使用双向LSTM。
数据分布:
model = keras.Sequential()
model.add(
keras.layers.Bidirectional(
keras.layers.LSTM(
units = 128,
input_shape = [X_train.shape[1], X_train.shape[2]]
)
)
)
model.add(keras.layers.Dropout(rate = 0.2))
model.add(keras.layers.Dense(units = 128, activation = 'relu'))
model.add(keras.layers.Dense(y_train.shape[1], activation = 'softmax'))
model.compile(
loss = 'categorical_crossentropy',
optimizer = 'adam',
metrics = ['acc']
)
在我训练了我的模型之后
history3 = model.fit(
X_train, y_train,
epochs=35,
batch_size=100,
validation_split = 0.1,
shuffle=False
)
这是我上一个时期给出的准确性和验证准确性:
Epoch 35/35
4002/4002 [==============================] - 3s 858us/step - loss: 0.0216 - acc: 0.9948 - val_loss: 0.3026 - val_acc: 0.9056
当我使用model.evaluate(X_test, y_test)
时,它返回一个包含两个值的列表:[5.144028138408701, 0.43551796674728394]
所以问题是这两个值是什么?我的猜测是第一个值是MSE,第二个值是精度。如果我是对的,那么为什么我使用.evaluate
时准确率如此之低?我应该做些什么来改进模型?
附注:更多信息
print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)
(4447, 24, 3) (4447, 3) (473, 24, 3) (473, 3)
数据是有序数据,所以我在拆分时使用shuffle = True
。
df_train, df_test = train_test_split(df, test_size = 0.1, shuffle = True)
发布于 2020-08-16 19:17:44
你对model.evaluate返回结果的猜测是正确的,第一个是损失,第二个是准确性。你的模型似乎过拟合了,尽管val_accuracy展示了一些其他的东西。我建议您检查数据集中有多少个这两个类别的标签。我的意思是,也许你有一个班级的90%,而另一个班级只有10%。如果是这样的话,有一件简单的事情你可以用.That来做(我猜你用的是来自sklearn.model_selection的train_test_split ),你应该把参数stratify=y添加到train_test_split函数中。这可以帮助处理不平衡的数据集。另外,你有没有尝试过其他的优化算法?你把learning_rate调低了吗?
发布于 2020-08-17 01:30:05
我怀疑你有一个高度不平衡的数据集。例如,如果您有一个数据集,其中0类有10,000个样本,1类有1000个样本。假设您将其分为一个训练集和一个验证集。这两个集合仍然会有这种不平衡。现在,如果你训练你的网络,它会倾向于选择类0,并且验证数据的结果看起来会很好。如果网络总是预测0级,它将有90%的准确率。现在,如果您有一个平衡的测试集,例如,当您在测试集上运行模型评估时,0类的500个样本和1类的500个样本,您将具有很高的错误率。我没有用过它,但我知道model.fit有一个名为class_weight.This的参数,它是一个字典,允许您根据类别调整对损失函数的影响。在上面的示例中,您希望1类样本的权重是0类样本的10倍。然后创建一个class_weight字典,如下所示
class_weight={0:.55, 1:5.5}
然后在model.fit中使用它。您可以做的其他事情是使用可调整的学习率,以最低的验证损失保存模型,并将其用于评估。使用Keras回调很容易做到这一点。可以设置回调ModelCheckpoint来监控验证损失,并以最低的损失保存模型。Documentation is here.可以设置ReduceLROnPlateau回调来监控验证损失,如果损失在N个连续时期后仍未减少,则将学习减少一个因素。文档是here.
https://stackoverflow.com/questions/63440492
复制