You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NumPy和TensorFlow的MLP二分类模型准确率恒为1.0的问题排查

嘿,我来帮你排查下这个训练后准确率直接拉满到1.0的问题——这明显是模型没学到真正的泛化能力,要么是数据环节出了纰漏,要么是模型/训练设置太“偷懒”,咱们一步步捋:

可能的原因及排查步骤

1. 先检查数据划分的低级错误

看你贴的预处理代码,有个明显的变量名不一致问题:前面定义的输入是input,但计算训练集数量时用了inp.shape[0],这会直接报错吧?就算是笔误,也得先确认划分逻辑是否正确:

# 修正变量名错误
train_cnt = floor(input.shape[0] * train_size)
# 确认测试集标签是否正确截取
y_test = labels[train_cnt:]  # 你代码里这里没写完,别漏了!

另外,先检查训练集和测试集的标签分布,会不会出现某一类占比100%的情况?

print("训练集标签分布:", np.unique(y_train, return_counts=True))
print("测试集标签分布:", np.unique(y_test, return_counts=True))

如果所有标签都是同一类,那模型随便猜都能拿100%准确率,这数据本身就有问题。

2. 有没有做输入数据的标准化?

MLP对输入特征的尺度非常敏感,如果不同特征之间量级差异极大,模型很容易走捷径记住某些极端特征,直接拟合到100%。赶紧给输入做标准化处理:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# 只在训练集上拟合,避免数据泄露
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

3. 模型是不是太“强”导致过拟合?

如果模型层数太多、神经元数量超标,很容易把训练集的噪声都记住,直接过拟合到100%准确率。试试简化模型,再加个Dropout层抑制过拟合:

import tensorflow as tf

model = tf.keras.Sequential([
    tf.keras.layers.Dense(32, activation='relu', input_shape=(18,)),
    tf.keras.layers.Dropout(0.2),  # 随机丢弃20%的神经元,防止过拟合
    tf.keras.layers.Dense(1, activation='sigmoid')
])

同时训练时记得加验证集监控,看看是只有训练集准确率100%(过拟合),还是连测试集也100%(数据本身有问题):

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, y_train, 
                    epochs=20, 
                    batch_size=32,
                    validation_data=(x_test, y_test))  # 用测试集做验证

4. 排查是否存在标签泄露

最致命的问题:输入特征里是不是包含了和标签高度相关甚至直接对应的信息?比如某个特征的值和标签完全一致,模型一眼就能“作弊”拿到100%准确率。可以计算每个特征和标签的相关性:

corr_matrix = np.corrcoef(input.T, labels.T)
# 看最后一行(对应标签)和前面18个特征的相关系数绝对值
print("特征与标签的相关性:", corr_matrix[-1, :-1])

如果有某个特征的相关系数接近1或-1,那就是标签泄露了,必须把这个特征删掉。

内容的提问来源于stack exchange,提问作者properchels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:35:27