R语言中的Keras:高精度模型预测相同输出类别

我最近开始在R语言中尝试使用Keras,并构建了一个简单的预测模型。我得到了大约85%的合理准确率,但模型对测试数据中的每个条目都预测出完全相同的结果。

输入数据由1000行和46列数值指标组成(缩放到0到1之间)。结果(即y变量)由两列组成,即“WIN”和“LOSE”,其值为1或0。如果“WIN”等于1,则“LOSE”必须等于0。

模型结构如下:

`model <- keras_model_sequential() model %>%   layer_dense(units = 5, activation = "relu", input_shape = c(46)) %>%   layer_dropout(rate = 0.1) %>%   layer_dense(units = 25, activation = "relu") %>%  layer_dropout(rate = 0.05) %>%  layer_dense(units = 10, activation = "relu") %>%  layer_dropout(rate = 0.05) %>%  layer_dense(units = 6, activation = "relu") %>%  layer_dropout(rate = 0.05) %>%  layer_dense(units = 2, activation = "softmax")`

然后我用以下代码运行模型:

model %>% compile(loss = "categorical_crossentropy",optimizer =optimizer_rmsprop(),metrics = c("accuracy"))    history <- model %>% fit(x_train, y_train, epochs = 30, batch_size = 128, validation_split = 0.2)

接着我用以下代码分析模型的准确率,得到了85%的结果:

model %>% evaluate(x_test, y_test,verbose = 0)

最后我进行了一些预测:

model %>% predict_classes(x_test)

其中“x_test”由500行组成,同样有46列数值列。使用上述代码得到的预测输出是一个与“x_test”行数相同的向量,但所有值都等于1(我知道这不可能,因为这不会产生接近85%的准确率)。

有什么想法可以告诉我哪里做错了?

谢谢!


回答:

敢打赌,正如cdeterman在评论中暗示的那样,你的数据集非常不平衡,即你的训练集中1的数量远多于0的数量。

在这种情况下,准确率作为一个指标是没有意义的,你应该使用精确度、召回率和混淆矩阵来代替 – 谷歌“类别不平衡”了解更多信息。

举个极端的例子,如果你的训练标签中有85%是1,你可以通过简单(且天真地)将所有样本分类为1来获得85%的(训练)准确率“分类器”(这显然不是你想要的)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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