【问题标题】:How to use BIC and AIC score for Lasso-GridSearchCV in sklearn?如何在 sklearn 中使用 Lasso-GridSearchCV 的 BIC 和 AIC 分数?
【发布时间】:2021-10-06 00:34:41
【问题描述】:

我想使用 AIC 和 BIC 为套索选择参数 alpha。但是 sklearn 只有 LassoLarsIC 可以做到这一点,它不接受稀疏矩阵,因此不适合我的情况。因此,我决定使用GridSearchCV 并创建一个自定义记分器。以下是我的尝试:

def bic_error_func(y_true, y_pred, coefs):
    n_samples = len(y_true)
    mse = np.average((y_true - y_pred) ** 2, axis=0)
    sigma2 = np.var(y_true)
    eps64 = np.finfo("float64").eps
    K = log(n_samples)
    mask = np.abs(coefs) > np.finfo(coefs.dtype).eps
    df = np.sum(mask)
    
    score = (n_samples * mse / (sigma2 + eps64) + K * df)
    return score

from sklearn.metrics import make_scorer
bic_scorer = make_scorer(bic_error_func, greater_is_better=False)

但是,与Defining your scoring strategy from metric functions 中的示例不同,我需要附加参数coefs 来计算此分数。在这种情况下,如何使包装的评分功能起作用?

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    make_scorer 的输出(以及网格搜索的评分方法的预期形式)是带有签名 estimator, X, y 的可调用;您应该跳过make_scorer 并直接定义这样的可调用对象。然后你可以直接使用估计器的拟合属性coefs_。 (make_scorergreater_is_better=False 选项只是否定分数,因此您可能应该将此备用自定义记分器定义为 negative BIC。)

    但请注意,在 GridSearchCV 中,您将始终计算测试折叠的分数,这与 BIC 背后的意图有所不同。

    【讨论】:

    • 如果使用GridSearchCV是错误的,我该怎么办?我可以简单地设置cv=1吗?
    • 我发现我无法设置cv=1。那么我是否应该手动运行网格搜索以在整个数据上搜索不同的 α?
    • 这可能是最干净的方法。如果您真的想在不复制大部分内容的情况下获得GridSearchCV 的好处,我在this answer at DS.SE 中起草了一个hack,以留出一行作为不会被使用的“测试集”。通过设置 return_train_score=True 并使用自定义的 refit 可调用对象,您可以获得训练集上的最佳 BIC(可能放在一行之外,或者您可以想到更好的 hack)。
    • 我想您仍然可以进行 k 折拆分,但只需忽略测试分数(不要使用默认的 refit)并使用真正 BIC 的训练分数。跨度>
    • 感谢您的破解方法。顺便说一句,如果我做一个cv=2 并按平均 bic 进行选择,这在理论上会如何以及在多大程度上损害 BIC 背后的意图?
    猜你喜欢
    • 2018-02-09
    • 2018-02-21
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多