如何为非线性模型计算调整后的R2分数

时间:2020-03-21 07:36:50

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

如本post中所述,可以通过以下公式计算调整后的R2分数,其中n是样本数,p是模型的参数数

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

根据另一个post,我们可以使用model.coef_获取模型的参数数量。

但是,对于梯度增强(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分数?

1 个答案:

答案 0 :(得分:1)

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


长答案:

首先,您的定义

p是模型的参数数量

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

与该定义一致,您链接到的post实际上使用X.shape[1]而不是model.coef_;后者是在评论中建议的,而且也不正确(请参阅自己的评论)。

因此,如果您坚持要为您的GBM模型计算r平方,则始终可以利用链接的帖子(在获得预测y_pred之后调整代码),还可以利用scikit-learn {{ 1}}:

r2_score

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

整个R平方的概念实际上直接来自统计学的世界,在统计学的世界中,重点放在解释性模型上,而在机器学习的上下文中却很少使用,而在机器学习的上下文中,重点显然放在预测性模型;至少是AFAIK,除了一些非常入门的课程外,我从未(我的意思是从没 ...)看到过预测建模问题,其中R平方用于任何类型的绩效评估;流行的机器学习介绍(例如,Coursera的Andrew Ng的Machine Learning)也不用不理会它。