使用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
相关产品推荐
相关产品推荐

