python - 如何在 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
来计算这个分数。在这种情况下,如何使包装的评分功能起作用?
解决方案
(以及网格搜索的评分方法的预期形式)的输出make_scorer
是带有签名的可调用estimator, X, y
;您应该直接跳过make_scorer
并定义这样的可调用对象。然后您可以直接使用估计器的拟合属性coefs_
。(仅否定分数的greater_is_better=False
选项make_scorer
,因此您可能应该将此备用自定义记分器定义为负BIC。)
但是请注意,在 a 中GridSearchCV
,您将始终计算测试折叠的分数,这偏离了 BIC 背后的意图。
推荐阅读
- javascript - 无法显示 API 结果
- reactjs - 每次单击按钮并调用其他 .js 组件时,我都会收到这些警告
- elasticsearch - Kibana url 在 Web 浏览器中不起作用,但在服务器中 kibana 状态正在运行
- r - 使用 R 进行复杂表分析
- java - 是否可以只更改已经为 java 内置的数据结构的一种方法?
- java - 比较作为映射的键和值的集合的大小
- javascript - 将属性对象分配给具有相同属性的其他现有对象
- javascript - 对并发调用返回 false 的简单锁 - javascript
- java - 执行期间计数器重置
- node.js - Ggraphicsmagick 破坏了 mongoDB。我不知道为什么