多输出神经网络计算R²遇ValueError:数组维度为3,估计器要求≤2
多输出神经网络R²计算维度不匹配问题
问题重现
训练了一个双输出神经网络,测试集y_test和预测结果y_pred均对应两个输出维度,但调用sklearn.metrics.r2_score时触发维度错误。
数据维度情况
y_test为2D数组(形状:(样本数, 2)):
import numpy as np y_test = np.array([[242.14, 61.], [179.48, 140.54], [ 98.16, 36.05], ..., [187.73, 111.39], [ 52.15, 25.82], [119.92, 54.52]])
y_pred为3D数组(形状:(样本数, 2, 1)):
y_pred = np.array([[[178.8299 ], [ 73.47848 ]], [[216.90152 ], [116.74648 ]], [[215.67923 ], [ 47.019424]], ..., [[236.51259 ], [167.34752 ]], [[156.02226 ], [ 61.292656]], [[151.5344 ], [ 56.285583]]])
报错代码与错误信息
执行以下代码:
from sklearn.metrics import r2_score r2 = r2_score(y_test, y_pred) r2 = round(r2,2) print('R2 =',r2)
触发错误:
ValueError: Found array with dim 3. Estimator expected <= 2。
原因分析
r2_score要求输入的真实值与预测值维度一致,这里y_test是2D数组,而y_pred多了一个多余的单维度(第三维大小为1),导致维度不匹配。
解决办法
将y_pred压缩为2D数组,两种常用方法:
方法1:使用np.squeeze()去除冗余维度
np.squeeze()会自动移除所有大小为1的维度:
from sklearn.metrics import r2_score import numpy as np # 压缩维度 y_pred_2d = np.squeeze(y_pred) # 计算R² r2 = r2_score(y_test, y_pred_2d) r2 = round(r2, 2) print('R2 =', r2)
方法2:使用reshape()手动调整形状
根据已知维度直接重塑数组:
from sklearn.metrics import r2_score import numpy as np # 重塑为(样本数, 2)的2D数组 y_pred_2d = y_pred.reshape(y_pred.shape[0], y_pred.shape[1]) # 计算R² r2 = r2_score(y_test, y_pred_2d) r2 = round(r2, 2) print('R2 =', r2)
多输出R²的额外说明
对于双输出任务,r2_score默认会返回每个输出对应的R²值。如果需要计算所有输出的平均R²,可以指定multioutput参数:
# 按输出维度权重平均 r2_avg = r2_score(y_test, y_pred_2d, multioutput='uniform_average') # 或者保留每个输出的原始R²值 r2_raw = r2_score(y_test, y_pred_2d, multioutput='raw_values')
内容的提问来源于stack exchange,提问作者gis
相关产品推荐
相关产品推荐

