【问题标题】:Rsquared in Sklearn Python VS MLmetrics RSklearn Python VS MLmetrics R中的Rsquared
【发布时间】:2021-02-27 05:22:45
【问题描述】:

我已经训练了一些回归模型(Lasso、随机森林和 SVR)。我尝试在 Python 和 R 中评估我的结果。在 python 中,Sklearn 显示了使用的 Rsquared 数学公式,而 R 中的包 MLmetrics 没有显示使用的公式。你知道我在哪里可以找到这些信息吗?两种语言的结果不同,我想了解原因。我正在用 python 对我的时间序列进行滚动训练,然后我使用 python 和 R 评估我的结果。以下是 Rsquared 提前一个月到 4 个月预测的差异——对于 python:0.136、0.021、-0.164,- 0.173 - 对于 R: 0.570, 0.536, 0.457, 0.450 。我的直觉是,R 的数学公式只给出 0 到 1 之间的值。提前谢谢你。

【问题讨论】:

  • 我认为这不是计算 Rsq 的公式。这很简单。见en.wikipedia.org/wiki/Coefficient_of_determination。对于 python , R 甚至同一语言中的不同包,适合度会有所不同
  • 你能提供两者的结果吗?想知道区别...
  • @StupidWolf 我想应该有一个数学公式,这就是为什么不同的包/语言会给出不同的结果。否则,你如何解释这些差异? Rsquared 是一个公式,与所有公式一样,它应该给出相同的结果。我猜 Sklean 和 MLmetrics 可能在他们使用的公式上有一些小的变化。
  • @Ragnar 我添加了结果。谢谢你:)
  • @StupidWolf 感谢您的反馈! :)

标签: python r scikit-learn regression


【解决方案1】:

要长时间输入作为评论,两个计算都是正确的,

来自mlmetrics

R2_Score <- function(y_pred, y_true) {
  R2_Score <- 1 - sum((y_true - y_pred)^2) / sum((y_true - mean(y_true))^2)
  return(R2_Score)
}

y_true = c(3, -0.5, 2, 7)
y_pred = c(2.5, 0.0, 2, 8)

R2_Score(y_pred,y_true)
[1] 0.94860816

来自sklearn

numerator = (weight * (y_true - y_pred) ** 2).sum(axis=0,
                                                      dtype=np.float64)
denominator = (weight * (y_true - np.average(
        y_true, axis=0, weights=sample_weight)) ** 2).sum(axis=0,
                                                          dtype=np.float64)
nonzero_denominator = denominator != 0
nonzero_numerator = numerator != 0
valid_score = nonzero_denominator & nonzero_numerator
output_scores = np.ones([y_true.shape[2]])
output_scores[valid_score] = 1 - (numerator[valid_score] /
                                      denominator[valid_score])

如果我们运行它:

from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)

0.9486081370449679

【讨论】:

  • 你是绝对正确的。谢谢你。我现在用我的代码确认。我使用了 R2 插入符号,这会产生不同的结果。我恢复了我很久以前写的这段代码,所以我很抱歉造成混乱。所以问题是插入符号rsquared。我看到这里有其他人有同样的问题stats.stackexchange.com/questions/230913/…。那么 caret r squared 产生了什么,我不确定我是否理解。
  • 更多信息:kite.com/python/answers/…。此链接中使用的 Python 代码将 Rsquared 限制在 0 和 1 之间,给出的结果与 R 中的 caret rsquared 完全相同。
  • caret 使用相关的平方,因为 rsquared 将是 pearson 相关系数的平方。但是,当您的模型有问题时,这不成立。使用上面这些的 R 平方.. 我建议
猜你喜欢
  • 2018-05-13
  • 2023-03-09
  • 2019-10-01
  • 2018-12-21
  • 2017-02-19
  • 1970-01-01
  • 2019-11-02
  • 2016-08-20
  • 2023-02-02
相关资源
最近更新 更多