You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在sklearn的Lasso-GridSearchCV中使用BIC和AIC指标选参

解决方法

sklearn的评分器支持两种定义形式,你需要额外获取模型系数的场景,不需要用make_scorer封装,直接定义符合(estimator, X, y_true)签名的评分函数即可,该函数可以直接读取训练完成的模型的coef_属性,不需要额外传参。

修改后的完整代码示例如下:

import numpy as np

def bic_scorer(estimator, X, y_true):
    y_pred = estimator.predict(X)
    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
    # BIC的惩罚项系数为log(n)
    K = np.log(n_samples)
    mask = np.abs(estimator.coef_) > np.finfo(estimator.coef_.dtype).eps
    # 自由度取非零系数的数量
    df = np.sum(mask)
    
    bic_score = (n_samples * mse / (sigma2 + eps64) + K * df)
    # GridSearchCV默认选择得分更大的参数,BIC要取最小值所以返回负值
    return -bic_score

# 如果需要AIC只需修改惩罚项系数为2即可
def aic_scorer(estimator, X, y_true):
    y_pred = estimator.predict(X)
    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 = 2
    mask = np.abs(estimator.coef_) > np.finfo(estimator.coef_.dtype).eps
    df = np.sum(mask)
    
    aic_score = (n_samples * mse / (sigma2 + eps64) + K * df)
    return -aic_score

直接将上述评分函数传入GridSearchCV的scoring参数即可使用,不需要额外封装:

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Lasso

param_grid = {"alpha": [0.001, 0.01, 0.1, 1, 10]}
lasso = Lasso()
grid = GridSearchCV(lasso, param_grid, scoring=bic_scorer, cv=5)
# 传入你的稀疏矩阵X和标签y训练即可
grid.fit(X, y)
print(grid.best_params_)

注意事项

如果你的Lasso设置了fit_intercept=True,计算自由度时可以根据需求决定是否把截距项算作一个参数,只需要把df = np.sum(mask)修改为df = np.sum(mask) + 1即可。

内容的提问来源于stack exchange,提问作者Alalalalaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:57:01