为啥在 Keras 中使用前馈神经网络进行单独的训练、验证和测试数据集可以获得 100% 的准确率?
Posted
技术标签:
【中文标题】为啥在 Keras 中使用前馈神经网络进行单独的训练、验证和测试数据集可以获得 100% 的准确率?【英文标题】:Why am I getting 100% accuracy using feed-forward neural networks for separate training, validation, and testing datasets in Keras?为什么在 Keras 中使用前馈神经网络进行单独的训练、验证和测试数据集可以获得 100% 的准确率? 【发布时间】:2020-11-07 16:32:22 【问题描述】:今天我正在研究一个分类器,以根据蘑菇的特征来检测蘑菇是否有毒。数据位于 .csv 文件中(读取到 pandas DataFrame),数据链接可在末尾找到。
我使用 sci-kit learn 的 train_test_split 函数将数据拆分为训练集和测试集。
然后,我删除了用于训练和测试标签的指定蘑菇是否有毒的列,并将其分配给 yTrain 和 yTest 变量。
然后我对数据应用了单热编码(使用 pd.get_dummies()),因为参数是分类的。
在此之后,我对训练和测试输入数据进行了标准化。
本质上,训练和测试输入数据是一个不同的单热编码参数列表,输出数据是一个代表输出的 1 和 0 列表(1 表示有毒,0 表示可食用)。
我在这个项目中使用了 Keras 和一个简单的前馈网络。该网络由三层组成;一个简单的 Dense(PyTorch 用户的线性层)层有 300 个神经元,一个 Dense 层有 100 个神经元,一个 Dense 层有两个神经元,每个表示蘑菇的给定参数是否表示它有毒的概率,或者食用。 Adam 是我使用的优化器,Sparse-Categorical-Crossentropy 是我的损失函数。
我训练了我的网络 60 个 epoch。大约 5 个 epoch 之后,损失基本为零,我的准确率是 1。训练后,我担心我的网络过度拟合,所以我在不同的测试数据上进行了尝试。结果与训练和验证数据相同;准确率是 100%,我的损失可以忽略不计。
我在 50 个 epoch 结束时的验证损失是 2.258996e-07,我的训练损失是 1.998715e-07。我的测试损失是 4.732502e-09。我真的很困惑这种状态,损失应该这么低吗?我不认为我过拟合,而且我的验证损失只比我的训练损失高一点,所以我也不认为我是欠拟合的。
你们中有人知道这个问题的答案吗?如果我以某种愚蠢的方式搞砸了,我很抱歉。
数据集链接:https://www.kaggle.com/uciml/mushroom-classification
【问题讨论】:
【参考方案1】:Kaggle 数据集似乎是可解的,从某种意义上说,您可以创建一个 100% 的时间给出正确答案的模型 (if these results are to be believed)。如果您查看这些结果,您会发现作者实际上能够找到使用多种方法(包括决策树)提供 100% 准确度的模型。
【讨论】:
非常感谢!到现在我还挺担心的!以上是关于为啥在 Keras 中使用前馈神经网络进行单独的训练、验证和测试数据集可以获得 100% 的准确率?的主要内容,如果未能解决你的问题,请参考以下文章
keras构建前馈神经网络(feedforward neural network)进行分类模型构建并加入L2正则化
keras构建前馈神经网络(feedforward neural network)进行回归模型构建和学习
keras构建前馈神经网络(feedforward neural network)进行分类模型构建基于早停法(Early stopping)