如本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分数?
答案 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)也不用不理会它。