我最近开始在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)
其中&#34; x_test&#34;由500行组成,也有46个数字列。我用上面的代码行得到的预测输出是一个等于&#34; x_test&#34;中的行数的向量,但是所有的值都是1(我知道它可以是真的,因为这个不会产生甚至接近85%的准确度。
关于我做错什么的任何想法?
谢谢!
答案 0 :(得分:1)
我下注,正如cdeterman暗示评论,你的数据集高度不平衡,即你的训练集中的1比0更多。
在这种情况下,作为指标的准确性毫无意义,你应该使用精确,召回和混淆矩阵 - 谷歌“类不平衡”更多。
正如一个极端的例子,如果85%的训练标签是1,你可以通过将所有样本分类为1来简单地(并且天真地)获得85%(训练)准确度“分类器”(可以说,这不是你究竟想要做什么)。