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

Keras回归模型误差均值计算差异及相关技术问题咨询

Keras回归模型误差均值计算差异及相关技术问题咨询

问题背景

我是Python新手,在构建Keras Sequential回归模型时,发现用不同方式计算均值得到的结果不一样。以下是相关代码和输出,以及我的疑问:

def regression_model():
    model = Sequential() # build an instance of a model
    model.add(Dense(10, activation = 'relu', input_shape=(n_cols,))) 
    model.add(Dense(1)) # Output layer with 1 node
    model.compile(optimizer='adam', loss = 'mean_squared_error', metrics=['accuracy'])        
    return model  

X_train, X_test, y_train, y_test = train_test_split(predictors, target, test_size=0.3) 
model = regression_model() # call the function to create a model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs = 50)

scores = model.evaluate(X_test, y_test, verbose=0)
_y_test = model.predict(X_test)

from sklearn.metrics import mean_squared_error
mean_square_error = mean_squared_error(y_test.values, _y_test)

print("Mean Squared error by formula: ", mean_square_error)

mean1 = np.mean(mean_square_error)
print("Mean of mean Squared Error by scikit: ", mean1)

mean2=np.mean((y_test.values - _y_test) ** 2)
print("Mean of mean Squared Error by formula: ", mean2)

standard_deviation = np.std(mean_square_error)

关键变量输出:

  • mean: 882.13
  • mean_square_error: 119.21
  • mean1: 119.21
  • mean2: 516.47
  • standard_deviation: 0

我的疑问:

  1. 为什么mean1和mean2不一样?
  2. 为什么“mean”和mean1或mean2都不一样?
  3. 为什么标准差是0?
  4. 模型拟合数据时,准确率始终显示为0.0000e+00?损失值的迭代看起来是正常的。

我原本预期mean1和mean2应该相同,而且标准差不为0。


解答

嘿,我来帮你逐个拆解这些问题,都是新手刚接触Keras回归时容易踩的坑~

1. mean1和mean2差异的核心原因

先看这两个值的来源:

  • mean_square_error是sklearn的mean_squared_error函数返回的结果,它已经是整个测试集所有样本的均方误差(一个单一的标量值),所以你再用np.mean(mean_square_error)去取均值,其实就是对一个数求平均,结果自然还是它本身,也就是119.21。
  • 而mean2的问题出在数组形状不匹配:model.predict(X_test)返回的是(样本数量, 1)的二维数组,而y_test.values如果是Pandas Series的话,是(样本数量,)的一维数组。当你直接做减法时,numpy的广播机制会把一维数组扩展成和二维数组匹配的形状,导致计算出来的差数组完全不对,平方后取均值自然就得到了错误的516.47。

修复方法:把预测结果转成一维数组再计算,比如用_y_test.flatten()或者_y_test.reshape(-1),修改后的代码:

mean2 = np.mean((y_test.values - _y_test.flatten()) ** 2)

这样计算出来的结果就会和sklearn的结果一致了。

2. “mean”与其他均值差异的原因

你提到的这个mean:882.13,从代码里看你没有定义这个变量,大概率是你混淆了概念:

  • 如果这个值是model.fit过程中打印的loss或val_loss,那可能是你看错了训练集/验证集的损失?不过看数值差这么多,更可能是你误把目标变量y_test的均值当成了MSE相关的均值。目标变量的均值是真实值本身的平均值,而MSE是预测值和真实值差的平方的均值,这两个完全不是一个概念,数值自然不一样。
  • 另外也可以检查一下model.evaluate返回的scores,它的第一个元素是测试集的MSE,你可以打印scores[0]看看是不是882.13,如果是,那可能是你在sklearn计算时数据形状没处理好导致结果错误,按照上面的方法修复mean2的计算后,应该能对齐。

3. 标准差为0的原因

因为mean_square_error是一个单一的标量(整个测试集的MSE),不是一个包含每个样本平方误差的数组。对单个数值计算标准差,结果必然是0——毕竟只有一个数,没有波动可言。

如果想得到有意义的标准差,你需要先计算每个样本的平方误差数组,再求标准差:

squared_errors = (y_test.values - _y_test.flatten()) ** 2
standard_deviation = np.std(squared_errors)

这样得到的就是所有样本平方误差的标准差,肯定是非零的。

4. 准确率始终为0的原因

这个是典型的新手误区:准确率是分类任务的指标,完全不适合回归任务!

在分类任务中,准确率是预测类别和真实类别一致的比例,但回归任务的预测值是连续数值,几乎不可能和真实值完全相等(或者说相等的概率极低),所以Keras计算的准确率就会一直是0。

修复方法:把模型编译时的metrics改成回归任务适用的指标,比如均方误差、平均绝对误差:

model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mean_squared_error', 'mean_absolute_error'])

这样在训练过程中就能看到有意义的评估指标了。


备注:内容来源于stack exchange,提问作者nic dunais

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:29:34