从Rsquared错误计算百分比错误

2024-04-25 22:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Scikit学习和Python创建了一个ML模型。我计算了R平方误差。有没有办法将此错误转换为百分比错误? 例如,如果我的真值是100和50,预测值是90和40,我的平均百分比误差是15%,因为第一次预测的误差是10%,第二次预测的误差是20%。 有没有一种方法可以根据R平方的值来计算百分比误差*(平均百分比误差)


Tags: 方法模型错误scikitml误差百分比办法
3条回答

从您的问题来看,听起来您正在使用一个回归模型。我建议研究sklearn's built-in regression accuracy methods而不是尝试使用R^2,因为R^2是一个过于精确的度量。对于您正在尝试做的事情,我可能会建议尝试平均绝对误差或中位数绝对误差-但其他精度指标在调整模型时可能会很有用

from sklearn.metrics import mean_absolute_error
from sklearn.metrics import median_absolute_error
y_pred = model.predict(X_test)
MAE = mean_absolute_error(y_test, y_pred)
MEDAE = median_absolute_error(y_test, y_pred)

如果您正在构建一个分类器,应该能够使用sklearn's accuracy_score metric。这将用预测总数除以正确预测的数量。将这个数字乘以100将得到正确预测的百分比。要获得错误预测的百分比,可以使用100(1-accuracy_score)

这是不可能的。R平方通过RSS, or residual sum of squares计算。您的r平方是1-(模型中的RSS)/(仅拦截模型中的RSS)。从上面可以看出,R平方本身并不是一个真正的误差,而是解释了方差的百分比

我们可以使用一个示例数据集

from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
import numpy as np

X, y = load_boston(return_X_y=True)
reg = LinearRegression().fit(X, y)

我们假设y的预测值和平均值为:

ybar = reg.predict(X)
ymean = y.mean()

R平方是

1 - sum((y-ybar)**2) / sum((y-ymean)**2)
0.7406426641094095

reg.score(X, y)
0.7406426641094095

鉴于您的百分比误差为:

np.mean(abs(y-ybar)/y)
0.16417298806489977

正如您所见,仅仅从Rsq中获取平均百分比误差是不太可能的,因为您已经对残差进行了汇总,在百分比误差中,您需要相对于观测值的误差

上面的答案似乎足够了,但我觉得这个问题有点混乱,所以我把这个问题留在这里。 R平方是一个指标,它回答了“如果我使用目标的平均值,它会比我的预测好吗?”的问题,并给出了一个值,如果你的模型比基线(目标的平均值)差,则给出的值低于零,如果你的模型比基线好,则给出的值接近一。前面已经说明了,但是有关于应该使用哪种错误的指南。如果你是一个初学者,我建议你使用均方误差,因为最终你会得到“均方误差为零的斜率和截距”(这里发生了一些奇特的微分)。在MSE中,数据点与模型预测之间的距离为平方,每个平方距离(误差)相加,然后取相加误差的平均值。所以,你们无法从R平方计算误差,因为它们并没有真正的相关性。您可以在sklearn文档中实现MSE,如下所示:

from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_test, y_pred)

有关sklearn中的其他度量(包括分类和聚类度量),请参见here。Sklearn的文档甚至比在线教程更好。 您也可以简单地键入sklearn.metrics.SCORERS.keys()以查看sklearn中的可用度量

相关问题 更多 >