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

二分类任务中categorical与binary交叉熵准确率差异问题

问题原因

你遇到的准确率暴跌问题来自3个核心的逻辑不匹配错误:

  • 标签被意外反转:你原本的Target hit列定义为1=命中、0=未命中,直接计算Y = 1 - Ot相当于把正负样本的标签完全颠倒,模型学习的目标和实际任务完全相反,自然会出现准确率大幅下降。
  • 输出层结构和任务不匹配:你切换为二分类单标签方案后,没有修改模型输出层的结构:原本用于one-hot二分类的2神经元输出,和单值0/1标签的二分类任务不兼容,binary_crossentropy损失函数的计算逻辑和输出维度完全错位。
  • 原有方案本身存在不规范问题:原本使用to_categorical转换为one-hot标签时,输出层的激活函数应该用softmax而不是sigmoid,你之前的方案属于刚好能跑的不规范实现,也埋下了精度不稳定的隐患。

另外你现有代码中model.fit(Xt, yt, epochs=150, batch_size=32)里的yt变量未定义,属于明显的笔误,运行时会直接报错;同时你当前的归一化逻辑scaleArray = np.array([np.zeros([6,]), np.ones([6,])])相当于没有做实际的数值缩放,也会影响模型收敛效率。

正确二分类单标签方案修改示例

from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import numpy as np

df = pd.read_csv("dataset1.csv")

Lt = np.array(df['Arm length (m)'][:])
Wt = np.array(df['Ball weight (kg)'][:])
Rt = np.array(df['Ball radius (mm)'][:])
Tt = np.array(df['Air temperature (deg C)'][:])
Et = np.array(df['Spring constant (N per m)'][:])
Dt = np.array(df['Device weight (kg)'][:])
XtUnscaled = np.column_stack([Lt, Wt, Rt, Tt, Et, Dt])
# 建议替换为StandardScaler/MinMaxScaler做实际归一化,提升收敛效果
scaleArray = np.array([XtUnscaled.min(axis=0), XtUnscaled.max(axis=0)])
Xt = (XtUnscaled-scaleArray[0,:])/(scaleArray[1,:] - scaleArray[0,:])
# 标签直接用原始值,无需反转
Y = np.array(df['Target hit'][:])

model = Sequential()
model.add(Dense(12, input_dim=6, activation='relu'))
model.add(Dense(8, activation='relu'))
# 二分类单标签输出层改为1个神经元,用sigmoid激活
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(Xt, Y, epochs=150, batch_size=32)
_, accuracy = model.evaluate(Xt, Y)
print('Accuracy: %.2f' % (accuracy*100))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:54:03