首页 > 解决方案 > 如何在 sklearn 中使用 Lasso-GridSearchCV 的 BIC 和 AIC 分数?

问题描述

我想使用 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)

但是,与从度量函数定义评分策略中的示例不同,我需要额外的参数coefs来计算这个分数。在这种情况下,如何使包装的评分功能起作用?

标签: pythonmachine-learningscikit-learn

解决方案


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

但是请注意,在 a 中GridSearchCV,您将始终计算测试折叠的分数,这偏离了 BIC 背后的意图。


推荐阅读