如何在sklearn中使用BIC和AIC分数进行Lasso-GridSearchCV ?



我想使用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来计算这个分数。在这种情况下,我如何使包装得分函数工作?

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

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

最新更新