【问题标题】:How to calculate adjusted R2 score for non-linear models如何计算非线性模型的调整后 R2 分数
【发布时间】:2020-07-02 06:14:38
【问题描述】:

正如post中提到的,调整后的R2分数可以通过以下等式计算,其中n是样本数,p是模型的参数数。

adj_r2 = 1-(1-R2)*(n-1)/(n-p-1)

根据这个另一个post,我们可以用model.coef_得到我们模型的参数个数。

但是,对于 Gradient Boosting (GBM),我们似乎无法获得模型中的参数数量:

from sklearn.ensemble import GradientBoostingRegressor
import numpy as np

X = np.random.randn(100,10)
y = np.random.randn(100,1)

model = GradientBoostingRegressor()
model.fit(X,y)

model.coef_

output >>> 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-4650e3f7c16c> in <module>
----> 1 model.coef_

AttributeError: 'GradientBoostingRegressor' object has no attribute 'coef_'

检查documentation 后,GBM 似乎由不同的估计器组成。估计器的数量是否等于参数的数量?

不过,我无法获得每个单独估算器的参数数量

model.estimators_[0][0].coef_


output >>> 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-27216ebb4944> in <module>
----> 1 model.estimators_[0][0].coef_

AttributeError: 'DecisionTreeRegressor' object has no attribute 'coef_'

如何计算 GBM 的调整后 R2 分数?

【问题讨论】:

  • 回答没有帮助?
  • 我仍在阅读有关解释模型的信息,因为您提到 R2 分数只能用于评估解释模型。我们可以在 sklearn 中找到任何解释模型吗?我猜线性回归、SVM、梯度提升不是解释模型。
  • 线性回归 - 这就是 R2 概念最初被开发和使用的地方。再次重申,不要将最近对可交互 ML 模型的讨论与我对解释性 统计 模型的讨论混为一谈。我要说的是,R2 实际上根本没有在 ML 中使用……
  • 但无论如何,答案可以说已经解决了您潜在的 coding 问题,这个问题实际上是关于这个问题的。我本可以停在那里而不是提供额外的建议(实际上并没有被要求)。
  • 好的。最后一个问题,除了线性回归,你能再举一个解释模型吗?再看一个解释模型的例子,也许我会更明白。

标签: python machine-learning scikit-learn non-linear-regression ensemble-learning


【解决方案1】:

简短回答:不要这样做(请注意,您链接到的所有帖子都是关于线性回归的)。


长答案:

首先,你的定义

p是模型的参数个数

正确。 p 是模型使用的解释变量的数量(source)。

同意这个定义,你链接到的post实际上使用X.shape[1]而不是model.coef_;后者是在评论中提出的,但也不正确(见自己的评论)。

因此,如果您坚持为您的 GBM 模型计算 r 平方,您可以随时调整链接帖子中的代码(在得到您的预测后 y_pred),同时利用 scikit-learn r2_score

from sklearn.metrics import r2_score

y_pred = model.predict(X)
r_squared = r2_score(y, y_pred)
adjusted_r_squared = 1 - (1-r_squared)*(len(y)-1)/(len(y)-X.shape[1]-1)

但是为什么你不应该这样做呢?好吧,在另一个问题中引用answer of mine

整个 R-squared 概念实际上直接来自统计世界,重点是解释性模型,它在机器学习环境中几乎没有用处,重点显然是预测模型;至少 AFAIK,除了一些非常入门的课程之外,我从来没有(我的意思是 从来没有 ...)看到 R 平方用于任何类型的性能评估的预测建模问题;诸如 Andrew Ng 在 Coursera 上的Machine Learning 等流行的机器学习 介绍甚至懒得提及它也不是偶然的。

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 2021-09-14
    • 2021-04-16
    • 1970-01-01
    • 2012-12-03
    • 2021-12-26
    • 2014-07-26
    • 2023-03-05
    • 2015-10-08
    相关资源
    最近更新 更多