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

