我想了解为什么 sklearn.metrics.mean_squared_error()
返回一个负数?我知道这不可能,但这确实发生在我使用的两台机器上。我使用的是 Python 3.6 和 sklearn(0.0)。
代码如下:
from sklearn.metrics import mean_squared_errorpredictions = [96271]test = [35241]mse = mean_squared_error(test, predictions)print('MSE: %.3f' % mse)Ouput: MSE: -570306396.000
这是调试器显示负值的截图:enter image description here
回答:
使用新代码后,问题似乎只是整数溢出
>>> from sklearn.metrics import mean_squared_error>>> predictions = [96271]>>> test = [35241]>>> mean_squared_error(test, predictions)-570306396.0>>> np.float32(96271 - 35241)**23724660900>>> np.int32(96271 - 35241)**2-570306396
自然的问题是,它什么时候会出错,因为内置的 Python int 不会溢出
>>> (96271 - 35241)**23724660900
所以问题出现在 scikit learn 将你的数据包装成 numpy 数组时
y_type, y_true, y_pred, multioutput = _check_reg_targets( y_true, y_pred, multioutput)
它将你的数据类型识别为 int32,并输出 np.array(…, dtype=np.int32),然后溢出。
请注意,确保数据看起来像浮点数也能解决问题
>>> from sklearn.metrics import mean_squared_error>>> predictions = [96271.] # 注意这个点!>>> test = [35241.]>>> mean_squared_error(test, predictions)3724660900