【问题标题】:calculate adjusted R2 using GridSearchCV使用 GridSearchCV 计算调整后的 R2
【发布时间】:2021-09-14 05:33:12
【问题描述】:

我正在尝试将GridSearchCV 与多个评分指标一起使用,其中之一是调整后的 R2。就我而言,后者在scikit-learn 中没有实现。我想确认我的方法是否是实施调整后的 R2 的正确方法。

使用scikit-learn 中实现的分数(在下面的示例中 MAE 和 R2),我可以执行如下所示的操作(在这个虚拟示例中,我忽略了良好的做法,例如特征缩放以及适合 SVR 的迭代次数):

import numpy as np
from sklearn.svm import SVR
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import r2_score, mean_absolute_error

#generate input
X = np.random.normal(75, 10, (1000, 2))
y = np.random.normal(200, 20, 1000)

#perform grid search
params = {"degree": [2, 3], "max_iter": [10]}
grid = GridSearchCV(SVR(), param_grid=params,
                    scoring={"MAE": "neg_mean_absolute_error", "R2": "r2"}, refit="R2")
grid.fit(X, y)

上面的示例将报告每个交叉验证分区的 MAE 和 R2,并将根据最佳 R2 重新拟合最佳参数。按照这个例子,我尝试使用自定义记分器来做同样的事情:

def adj_r2(true, pred, p=2):
    '''p is the number of independent variables and n is the sample size'''
    n = true.size
    return 1 - ((1 - r2_score(true, pred)) * (n - 1))/(n-p-1)

scorer=make_scorer(adj_r2)
grid = GridSearchCV(SVR(), param_grid=params,
                    scoring={"MAE": "neg_mean_absolute_error", "adj R2": scorer}, refit="adj R2")
grid.fit(X, y)

#print(grid.cv_results_)

上面的代码似乎为“adj R2”记分器生成值。我有两个问题:

  1. 上面使用的方法在编码方面在技术上是否正确?
  2. 如果方法正确,如何以动态方式定义 p(自变量数)?如您所见,我在定义函数时必须强制使用默认值,但我希望能够在 GridSearchCV 中定义 p。

【问题讨论】:

    标签: python-3.x scikit-learn gridsearchcv scoring


    【解决方案1】:

    首先,调整后的 R2 分数目前在 sklearn 中不可用,因为评分函数的 API 只需要 y_truey_pred。因此,测量 X 的尺寸是不可能的。

    我们可以解决SearchCVs 的问题。

    记分员需要有(estimator, X, y) 的签名。这已在make_scorer here 中交付。

    我在这里提供了一个更简化的版本来包装 r2 scorer。

    def adj_r2(estimator, X, y_true):
        n, p = X.shape
        pred = estimator.predict(X)
        return 1 - ((1 - r2_score(y_true, pred)) * (n - 1))/(n-p-1)
    
    grid = GridSearchCV(SVR(), param_grid=params, 
                        scoring={"MAE": "neg_mean_absolute_error", 
                                 "adj R2": adj_r2}, refit="adj R2") 
    grid.fit(X, y)  
    

    【讨论】:

    • 这是很棒的东西。谢谢。
    猜你喜欢
    • 2018-12-04
    • 2020-07-02
    • 1970-01-01
    • 2021-10-12
    • 2015-10-06
    • 2018-02-02
    • 2021-08-11
    • 2023-03-05
    • 2014-09-30
    相关资源
    最近更新 更多