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

Keras二分类任务输出浮点型预测值的原因求解

Keras二分类模型输出异常原因说明

以下是导致输出不符合预期的几个核心错误:

  • 输出层激活函数配置错误:二分类任务要求输出0-1区间的概率值,你当前输出层使用ReLU作为激活函数,ReLU的计算逻辑是输入大于0时直接返回原值,没有做数值范围限制。当原始输入特征数值量级较大时,经过多层网络运算后输出值就会出现数千上万的情况。正确做法是将最后一层的激活函数替换为sigmoid,它会把输出值压缩到0到1之间,对应样本为正类的概率。
  • 损失函数选择错误:你当前使用的categorical_crossentropy是多分类任务的损失函数,仅适用于标签做了one-hot编码的场景。你的任务是二分类、标签为0/1的单值格式,应该使用binary_crossentropy(二元交叉熵)作为损失函数。
  • 输入特征未做标准化处理:从输出值的量级可以判断你的原始输入特征数值很大,没有缩放到合理区间,会导致神经网络权重更新幅度过大,进一步放大输出值的量级,也会拖慢模型收敛速度。
  • 数据集拆分逻辑错误:你调用train_test_split时第一个参数传入的是完整的df而非处理好的features,相当于把标签列也放进了训练特征里,属于数据泄露,完全不符合模型训练的正确逻辑。

你可以参考以下代码片段修正问题:

# 修正数据集拆分逻辑
train_features, test_features, train_labels, test_labels = train_test_split(features, output, test_size = 0.2, random_state = 42)

# 新增特征标准化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
train_features = scaler.fit_transform(train_features)
test_features = scaler.transform(test_features)

# 修正网络结构,输出层改用sigmoid
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(31, activation = act, input_shape=(31,)))  
model.add(tf.keras.layers.Dense(count, activation = act)) 
model.add(tf.keras.layers.Dense(1, activation = 'sigmoid')) 

# 修正损失函数为二元交叉熵
model.compile(loss = 'binary_crossentropy',
         optimizer = opt,
         metrics = ['accuracy'])

修正后模型预测结果会输出0-1之间的概率值,你可以自行设定阈值(比如大于0.5判定为正类1,否则判定为负类0)得到最终的二分类结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:45:03