如何用sklearn.metrics对二维Numpy数组按行计算平均绝对误差?
解决方案:按行计算每行的MAE(使用sklearn.metrics且无循环)
原代码问题分析
- 指定
axis=0会让np.apply_along_axis按列处理数据,而非你需要的按行计算 mae的参数传递逻辑错误:apply_along_axis会将指定轴的元素作为第一个参数传入函数,原写法把两列数据作为额外参数传入,导致计算的是两列整体的MAE,而非每行的结果
正确实现方法
方法1:用np.apply_along_axis按行处理
通过lambda函数将每行的两个元素拆分为mae所需的输入格式,再按行执行计算:
from sklearn.metrics import mean_absolute_error as mae import numpy as np arr = np.array([[1.7, 3.1], [2.1, 2.7], [0.9, 0.7], [0.3, 0.8]]) # 按行处理,lambda将每行拆分为单元素数组传入mae result_arr = np.apply_along_axis(lambda x: mae([x[0]], [x[1]]), 1, arr) # 转换为你期望的二维列数组格式 result_arr = result_arr.reshape(-1, 1) print(result_arr)
输出结果:
array([[1.4], [0.6], [0.2], [0.5]])
方法2:用np.vectorize包装mae
将mae转换为可向量化的函数,直接对两列元素逐对计算:
from sklearn.metrics import mean_absolute_error as mae import numpy as np arr = np.array([[1.7, 3.1], [2.1, 2.7], [0.9, 0.7], [0.3, 0.8]]) # 向量化mae,处理单个值对 vec_mae = np.vectorize(lambda y_true, y_pred: mae([y_true], [y_pred])) result_arr = vec_mae(arr[:, 0], arr[:, 1]).reshape(-1, 1) print(result_arr)
此方法同样能得到与方法1一致的结果,且无需显式循环。
内容的提问来源于stack exchange,提问作者AlwaysJunior
相关产品推荐
相关产品推荐

