我想使用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_scorer
的greater_is_better=False
选项只是否定分数,所以你可能应该将这个替代的自定义分数定义为negativeBIC。)
请注意,在GridSearchCV
中,您将始终计算测试折叠的分数,这偏离了BIC背后的意图。